conver CHAR to scoped enum
Change-Id: Ie7f22c6986a0973e6d50bbd1fe9c10f6b478a2db Reviewed-on: https://gerrit.libreoffice.org/24984 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
This commit is contained in:
@@ -24,18 +24,24 @@
|
|||||||
#include <rtl/character.hxx>
|
#include <rtl/character.hxx>
|
||||||
#include <unicode/uchar.h>
|
#include <unicode/uchar.h>
|
||||||
#include <comphelper/syntaxhighlight.hxx>
|
#include <comphelper/syntaxhighlight.hxx>
|
||||||
|
#include <o3tl/typed_flags_set.hxx>
|
||||||
|
|
||||||
// Flags for character properties
|
// Flags for character properties
|
||||||
#define CHAR_START_IDENTIFIER 0x0001
|
enum class CharFlags {
|
||||||
#define CHAR_IN_IDENTIFIER 0x0002
|
StartIdentifier = 0x0001,
|
||||||
#define CHAR_START_NUMBER 0x0004
|
InIdentifier = 0x0002,
|
||||||
#define CHAR_IN_NUMBER 0x0008
|
StartNumber = 0x0004,
|
||||||
#define CHAR_IN_HEX_NUMBER 0x0010
|
InNumber = 0x0008,
|
||||||
#define CHAR_IN_OCT_NUMBER 0x0020
|
InHexNumber = 0x0010,
|
||||||
#define CHAR_START_STRING 0x0040
|
InOctNumber = 0x0020,
|
||||||
#define CHAR_OPERATOR 0x0080
|
StartString = 0x0040,
|
||||||
#define CHAR_SPACE 0x0100
|
Operator = 0x0080,
|
||||||
#define CHAR_EOL 0x0200
|
Space = 0x0100,
|
||||||
|
EOL = 0x0200
|
||||||
|
};
|
||||||
|
namespace o3tl {
|
||||||
|
template<> struct typed_flags<CharFlags> : is_typed_flags<CharFlags, 0x03ff> {};
|
||||||
|
}
|
||||||
|
|
||||||
// ##########################################################################
|
// ##########################################################################
|
||||||
// ATTENTION: all these words need to be in lower case
|
// ATTENTION: all these words need to be in lower case
|
||||||
@@ -259,10 +265,10 @@ namespace
|
|||||||
class SyntaxHighlighter::Tokenizer
|
class SyntaxHighlighter::Tokenizer
|
||||||
{
|
{
|
||||||
// Character information tables
|
// Character information tables
|
||||||
sal_uInt16 aCharTypeTab[256];
|
CharFlags aCharTypeTab[256];
|
||||||
|
|
||||||
// Auxiliary function: testing of the character flags
|
// Auxiliary function: testing of the character flags
|
||||||
bool testCharFlags(sal_Unicode c, sal_uInt16 nTestFlags) const;
|
bool testCharFlags(sal_Unicode c, CharFlags nTestFlags) const;
|
||||||
|
|
||||||
// Get new token, EmptyString == nothing more over there
|
// Get new token, EmptyString == nothing more over there
|
||||||
bool getNextToken(const sal_Unicode*& pos, /*out*/TokenType& reType,
|
bool getNextToken(const sal_Unicode*& pos, /*out*/TokenType& reType,
|
||||||
@@ -283,16 +289,16 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Helper function: test character flag
|
// Helper function: test character flag
|
||||||
bool SyntaxHighlighter::Tokenizer::testCharFlags(sal_Unicode c, sal_uInt16 nTestFlags) const
|
bool SyntaxHighlighter::Tokenizer::testCharFlags(sal_Unicode c, CharFlags nTestFlags) const
|
||||||
{
|
{
|
||||||
bool bRet = false;
|
bool bRet = false;
|
||||||
if( c != 0 && c <= 255 )
|
if( c != 0 && c <= 255 )
|
||||||
{
|
{
|
||||||
bRet = ( (aCharTypeTab[c] & nTestFlags) != 0 );
|
bRet = bool(aCharTypeTab[c] & nTestFlags);
|
||||||
}
|
}
|
||||||
else if( c > 255 )
|
else if( c > 255 )
|
||||||
{
|
{
|
||||||
bRet = (( CHAR_START_IDENTIFIER | CHAR_IN_IDENTIFIER ) & nTestFlags) != 0
|
bRet = (( CharFlags::StartIdentifier | CharFlags::InIdentifier ) & nTestFlags)
|
||||||
&& isAlpha(c);
|
&& isAlpha(c);
|
||||||
}
|
}
|
||||||
return bRet;
|
return bRet;
|
||||||
@@ -319,23 +325,23 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
|
|
||||||
//*** Go through all possibilities ***
|
//*** Go through all possibilities ***
|
||||||
// Space?
|
// Space?
|
||||||
if ( testCharFlags( c, CHAR_SPACE ) )
|
if ( testCharFlags( c, CharFlags::Space ) )
|
||||||
{
|
{
|
||||||
while( testCharFlags( *pos, CHAR_SPACE ) )
|
while( testCharFlags( *pos, CharFlags::Space ) )
|
||||||
++pos;
|
++pos;
|
||||||
|
|
||||||
reType = TokenType::Whitespace;
|
reType = TokenType::Whitespace;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Identifier?
|
// Identifier?
|
||||||
else if ( testCharFlags( c, CHAR_START_IDENTIFIER ) )
|
else if ( testCharFlags( c, CharFlags::StartIdentifier ) )
|
||||||
{
|
{
|
||||||
bool bIdentifierChar;
|
bool bIdentifierChar;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
// Naechstes Zeichen holen
|
// Naechstes Zeichen holen
|
||||||
c = *pos;
|
c = *pos;
|
||||||
bIdentifierChar = testCharFlags( c, CHAR_IN_IDENTIFIER );
|
bIdentifierChar = testCharFlags( c, CharFlags::InIdentifier );
|
||||||
if( bIdentifierChar )
|
if( bIdentifierChar )
|
||||||
++pos;
|
++pos;
|
||||||
}
|
}
|
||||||
@@ -373,7 +379,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
{
|
{
|
||||||
// Remove all characters until end of line or EOF
|
// Remove all characters until end of line or EOF
|
||||||
sal_Unicode cPeek = *pos;
|
sal_Unicode cPeek = *pos;
|
||||||
while( cPeek != 0 && !testCharFlags( cPeek, CHAR_EOL ) )
|
while( cPeek != 0 && !testCharFlags( cPeek, CharFlags::EOL ) )
|
||||||
{
|
{
|
||||||
cPeek = *++pos;
|
cPeek = *++pos;
|
||||||
}
|
}
|
||||||
@@ -387,7 +393,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
|
|
||||||
// Operator?
|
// Operator?
|
||||||
// only for BASIC '\'' should be a comment, otherwise it is a normal string and handled there
|
// only for BASIC '\'' should be a comment, otherwise it is a normal string and handled there
|
||||||
else if ( testCharFlags( c, CHAR_OPERATOR ) || ( (c == '\'') && (aLanguage==HighlighterLanguage::Basic)) )
|
else if ( testCharFlags( c, CharFlags::Operator ) || ( (c == '\'') && (aLanguage==HighlighterLanguage::Basic)) )
|
||||||
{
|
{
|
||||||
// parameters for SQL view
|
// parameters for SQL view
|
||||||
if ( (c==':') || (c=='?'))
|
if ( (c==':') || (c=='?'))
|
||||||
@@ -413,7 +419,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
if (cPeekNext=='-')
|
if (cPeekNext=='-')
|
||||||
{
|
{
|
||||||
// Remove all characters until end of line or EOF
|
// Remove all characters until end of line or EOF
|
||||||
while( cPeekNext != 0 && !testCharFlags( cPeekNext, CHAR_EOL ) )
|
while( cPeekNext != 0 && !testCharFlags( cPeekNext, CharFlags::EOL ) )
|
||||||
{
|
{
|
||||||
++pos;
|
++pos;
|
||||||
cPeekNext = *pos;
|
cPeekNext = *pos;
|
||||||
@@ -427,7 +433,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
if (cPeekNext=='/')
|
if (cPeekNext=='/')
|
||||||
{
|
{
|
||||||
// Remove all characters until end of line or EOF
|
// Remove all characters until end of line or EOF
|
||||||
while( cPeekNext != 0 && !testCharFlags( cPeekNext, CHAR_EOL ) )
|
while( cPeekNext != 0 && !testCharFlags( cPeekNext, CharFlags::EOL ) )
|
||||||
{
|
{
|
||||||
++pos;
|
++pos;
|
||||||
cPeekNext = *pos;
|
cPeekNext = *pos;
|
||||||
@@ -443,7 +449,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
// Skip all characters until end of input or end of line:
|
// Skip all characters until end of input or end of line:
|
||||||
for (;;) {
|
for (;;) {
|
||||||
c = *pos;
|
c = *pos;
|
||||||
if (c == 0 || testCharFlags(c, CHAR_EOL)) {
|
if (c == 0 || testCharFlags(c, CharFlags::EOL)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
++pos;
|
++pos;
|
||||||
@@ -469,7 +475,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Number?
|
// Number?
|
||||||
else if( testCharFlags( c, CHAR_START_NUMBER ) )
|
else if( testCharFlags( c, CharFlags::StartNumber ) )
|
||||||
{
|
{
|
||||||
reType = TokenType::Number;
|
reType = TokenType::Number;
|
||||||
|
|
||||||
@@ -487,7 +493,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
nRadix = 8; // Octal base
|
nRadix = 8; // Octal base
|
||||||
|
|
||||||
// Read all numbers
|
// Read all numbers
|
||||||
while( testCharFlags( *pos, CHAR_IN_OCT_NUMBER ) )
|
while( testCharFlags( *pos, CharFlags::InOctNumber ) )
|
||||||
++pos;
|
++pos;
|
||||||
}
|
}
|
||||||
// Hexadecimal?
|
// Hexadecimal?
|
||||||
@@ -498,7 +504,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
nRadix = 16; // Hexadecimal base
|
nRadix = 16; // Hexadecimal base
|
||||||
|
|
||||||
// Read all numbers
|
// Read all numbers
|
||||||
while( testCharFlags( *pos, CHAR_IN_HEX_NUMBER ) )
|
while( testCharFlags( *pos, CharFlags::InHexNumber ) )
|
||||||
++pos;
|
++pos;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -514,7 +520,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
bool bAfterExpChar = false;
|
bool bAfterExpChar = false;
|
||||||
|
|
||||||
// Read all numbers
|
// Read all numbers
|
||||||
while( testCharFlags( *pos, CHAR_IN_NUMBER ) ||
|
while( testCharFlags( *pos, CharFlags::InNumber ) ||
|
||||||
(bAfterExpChar && *pos == '+' ) ||
|
(bAfterExpChar && *pos == '+' ) ||
|
||||||
(bAfterExpChar && *pos == '-' ) )
|
(bAfterExpChar && *pos == '-' ) )
|
||||||
// After exponent +/- are OK, too
|
// After exponent +/- are OK, too
|
||||||
@@ -526,7 +532,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
}
|
}
|
||||||
|
|
||||||
// String?
|
// String?
|
||||||
else if( testCharFlags( c, CHAR_START_STRING ) )
|
else if( testCharFlags( c, CharFlags::StartString ) )
|
||||||
{
|
{
|
||||||
// Remember which character has opened the string
|
// Remember which character has opened the string
|
||||||
sal_Unicode cEndString = c;
|
sal_Unicode cEndString = c;
|
||||||
@@ -544,7 +550,7 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
c = *pos++;
|
c = *pos++;
|
||||||
if( testCharFlags( c, CHAR_EOL ) )
|
if( testCharFlags( c, CharFlags::EOL ) )
|
||||||
{
|
{
|
||||||
// ERROR: unterminated string literal
|
// ERROR: unterminated string literal
|
||||||
reType = TokenType::Error;
|
reType = TokenType::Error;
|
||||||
@@ -563,11 +569,11 @@ bool SyntaxHighlighter::Tokenizer::getNextToken(const sal_Unicode*& pos, /*out*/
|
|||||||
}
|
}
|
||||||
|
|
||||||
// End of line?
|
// End of line?
|
||||||
else if( testCharFlags( c, CHAR_EOL ) )
|
else if( testCharFlags( c, CharFlags::EOL ) )
|
||||||
{
|
{
|
||||||
// If another EOL character comes, read it
|
// If another EOL character comes, read it
|
||||||
sal_Unicode cNext = *pos;
|
sal_Unicode cNext = *pos;
|
||||||
if( cNext != c && testCharFlags( cNext, CHAR_EOL ) )
|
if( cNext != c && testCharFlags( cNext, CharFlags::EOL ) )
|
||||||
++pos;
|
++pos;
|
||||||
|
|
||||||
reType = TokenType::EOL;
|
reType = TokenType::EOL;
|
||||||
@@ -588,7 +594,7 @@ SyntaxHighlighter::Tokenizer::Tokenizer( HighlighterLanguage aLang ): aLanguage(
|
|||||||
sal_uInt16 i;
|
sal_uInt16 i;
|
||||||
|
|
||||||
// Allowed characters for identifiers
|
// Allowed characters for identifiers
|
||||||
sal_uInt16 nHelpMask = (sal_uInt16)( CHAR_START_IDENTIFIER | CHAR_IN_IDENTIFIER );
|
CharFlags nHelpMask = CharFlags::StartIdentifier | CharFlags::InIdentifier;
|
||||||
for( i = 'a' ; i <= 'z' ; i++ )
|
for( i = 'a' ; i <= 'z' ; i++ )
|
||||||
aCharTypeTab[i] |= nHelpMask;
|
aCharTypeTab[i] |= nHelpMask;
|
||||||
for( i = 'A' ; i <= 'Z' ; i++ )
|
for( i = 'A' ; i <= 'Z' ; i++ )
|
||||||
@@ -597,65 +603,65 @@ SyntaxHighlighter::Tokenizer::Tokenizer( HighlighterLanguage aLang ): aLanguage(
|
|||||||
aCharTypeTab[(int)'$'] |= nHelpMask;
|
aCharTypeTab[(int)'$'] |= nHelpMask;
|
||||||
|
|
||||||
// Digit (can be identifier and number)
|
// Digit (can be identifier and number)
|
||||||
nHelpMask = (sal_uInt16)( CHAR_IN_IDENTIFIER | CHAR_START_NUMBER |
|
nHelpMask = CharFlags::InIdentifier | CharFlags::StartNumber |
|
||||||
CHAR_IN_NUMBER | CHAR_IN_HEX_NUMBER );
|
CharFlags::InNumber | CharFlags::InHexNumber;
|
||||||
for( i = '0' ; i <= '9' ; i++ )
|
for( i = '0' ; i <= '9' ; i++ )
|
||||||
aCharTypeTab[i] |= nHelpMask;
|
aCharTypeTab[i] |= nHelpMask;
|
||||||
|
|
||||||
// Add e, E, . and & here manually
|
// Add e, E, . and & here manually
|
||||||
aCharTypeTab[(int)'e'] |= CHAR_IN_NUMBER;
|
aCharTypeTab[(int)'e'] |= CharFlags::InNumber;
|
||||||
aCharTypeTab[(int)'E'] |= CHAR_IN_NUMBER;
|
aCharTypeTab[(int)'E'] |= CharFlags::InNumber;
|
||||||
aCharTypeTab[(int)'.'] |= (sal_uInt16)( CHAR_IN_NUMBER | CHAR_START_NUMBER );
|
aCharTypeTab[(int)'.'] |= CharFlags::InNumber | CharFlags::StartNumber;
|
||||||
aCharTypeTab[(int)'&'] |= CHAR_START_NUMBER;
|
aCharTypeTab[(int)'&'] |= CharFlags::StartNumber;
|
||||||
|
|
||||||
// Hexadecimal digit
|
// Hexadecimal digit
|
||||||
for( i = 'a' ; i <= 'f' ; i++ )
|
for( i = 'a' ; i <= 'f' ; i++ )
|
||||||
aCharTypeTab[i] |= CHAR_IN_HEX_NUMBER;
|
aCharTypeTab[i] |= CharFlags::InHexNumber;
|
||||||
for( i = 'A' ; i <= 'F' ; i++ )
|
for( i = 'A' ; i <= 'F' ; i++ )
|
||||||
aCharTypeTab[i] |= CHAR_IN_HEX_NUMBER;
|
aCharTypeTab[i] |= CharFlags::InHexNumber;
|
||||||
|
|
||||||
// Octal digit
|
// Octal digit
|
||||||
for( i = '0' ; i <= '7' ; i++ )
|
for( i = '0' ; i <= '7' ; i++ )
|
||||||
aCharTypeTab[i] |= CHAR_IN_OCT_NUMBER;
|
aCharTypeTab[i] |= CharFlags::InOctNumber;
|
||||||
|
|
||||||
// String literal start/end characters
|
// String literal start/end characters
|
||||||
aCharTypeTab[(int)'\''] |= CHAR_START_STRING;
|
aCharTypeTab[(int)'\''] |= CharFlags::StartString;
|
||||||
aCharTypeTab[(int)'\"'] |= CHAR_START_STRING;
|
aCharTypeTab[(int)'\"'] |= CharFlags::StartString;
|
||||||
aCharTypeTab[(int)'['] |= CHAR_START_STRING;
|
aCharTypeTab[(int)'['] |= CharFlags::StartString;
|
||||||
aCharTypeTab[(int)'`'] |= CHAR_START_STRING;
|
aCharTypeTab[(int)'`'] |= CharFlags::StartString;
|
||||||
|
|
||||||
// Operator characters
|
// Operator characters
|
||||||
aCharTypeTab[(int)'!'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'!'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'%'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'%'] |= CharFlags::Operator;
|
||||||
// aCharTypeTab[(int)'&'] |= CHAR_OPERATOR; Removed because of #i14140
|
// aCharTypeTab[(int)'&'] |= CharFlags::Operator; Removed because of #i14140
|
||||||
aCharTypeTab[(int)'('] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'('] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)')'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)')'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'*'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'*'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'+'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'+'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)','] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)','] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'-'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'-'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'/'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'/'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)':'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)':'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'<'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'<'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'='] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'='] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'>'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'>'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'?'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'?'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'^'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'^'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'|'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'|'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'~'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'~'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'{'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'{'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)'}'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)'}'] |= CharFlags::Operator;
|
||||||
// aCharTypeTab[(int)'['] |= CHAR_OPERATOR; Removed because of #i17826
|
// aCharTypeTab[(int)'['] |= CharFlags::Operator; Removed because of #i17826
|
||||||
aCharTypeTab[(int)']'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)']'] |= CharFlags::Operator;
|
||||||
aCharTypeTab[(int)';'] |= CHAR_OPERATOR;
|
aCharTypeTab[(int)';'] |= CharFlags::Operator;
|
||||||
|
|
||||||
// Space
|
// Space
|
||||||
aCharTypeTab[(int)' ' ] |= CHAR_SPACE;
|
aCharTypeTab[(int)' ' ] |= CharFlags::Space;
|
||||||
aCharTypeTab[(int)'\t'] |= CHAR_SPACE;
|
aCharTypeTab[(int)'\t'] |= CharFlags::Space;
|
||||||
|
|
||||||
// End of line characters
|
// End of line characters
|
||||||
aCharTypeTab[(int)'\r'] |= CHAR_EOL;
|
aCharTypeTab[(int)'\r'] |= CharFlags::EOL;
|
||||||
aCharTypeTab[(int)'\n'] |= CHAR_EOL;
|
aCharTypeTab[(int)'\n'] |= CharFlags::EOL;
|
||||||
|
|
||||||
ppListKeyWords = nullptr;
|
ppListKeyWords = nullptr;
|
||||||
nKeyWordCount = 0;
|
nKeyWordCount = 0;
|
||||||
|
Reference in New Issue
Block a user