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:
Noel Grandin
2016-05-14 09:37:41 +02:00
parent c6ca2fac56
commit 1b6ad8e649

View File

@@ -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;