diff options
Diffstat (limited to 'src/LexMSSQL.cxx')
-rw-r--r-- | src/LexMSSQL.cxx | 231 |
1 files changed, 134 insertions, 97 deletions
diff --git a/src/LexMSSQL.cxx b/src/LexMSSQL.cxx index c36e5170a..6019f24d3 100644 --- a/src/LexMSSQL.cxx +++ b/src/LexMSSQL.cxx @@ -24,6 +24,8 @@ #define KW_MSSQL_SYSTEM_TABLES 2 #define KW_MSSQL_GLOBAL_VARIABLES 3 #define KW_MSSQL_FUNCTIONS 4 +#define KW_MSSQL_STORED_PROCEDURES 5 +#define KW_MSSQL_OPERATORS 6 //~ val SCE_MSSQL_DEFAULT=0 //~ val SCE_MSSQL_COMMENT=1 @@ -39,6 +41,9 @@ //~ val SCE_MSSQL_SYSTABLE=11 //~ val SCE_MSSQL_GLOBAL_VARIABLE=12 //~ val SCE_MSSQL_FUNCTION=13 +//~ val SCE_MSSQL_STORED_PROCEDURE=14 +//~ val SCE_MSSQL_DEFAULT_PREF_DATATYPE 15 +//~ val SCE_MSSQL_COLUMN_NAME_2 16 static bool isMSSQLOperator(char ch) { if (isascii(ch) && isalnum(ch)) @@ -47,17 +52,19 @@ static bool isMSSQLOperator(char ch) { if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || ch == '-' || ch == '+' || ch == '=' || ch == '|' || ch == '<' || ch == '>' || ch == '/' || - ch == '!' || ch == '~') + ch == '!' || ch == '~' || ch == '(' || ch == ')' || + ch == ',') return true; return false; } -static void classifyWordSQL(unsigned int start, +static char classifyWordSQL(unsigned int start, unsigned int end, WordList *keywordlists[], Accessor &styler, - unsigned int actualState) { - char s[100]; + unsigned int actualState, + unsigned int prevState) { + char s[256]; bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); WordList &kwStatements = *keywordlists[KW_MSSQL_STATEMENTS]; @@ -65,30 +72,56 @@ static void classifyWordSQL(unsigned int start, WordList &kwSystemTables = *keywordlists[KW_MSSQL_SYSTEM_TABLES]; WordList &kwGlobalVariables = *keywordlists[KW_MSSQL_GLOBAL_VARIABLES]; WordList &kwFunctions = *keywordlists[KW_MSSQL_FUNCTIONS]; + WordList &kwStoredProcedures = *keywordlists[KW_MSSQL_STORED_PROCEDURES]; + WordList &kwOperators = *keywordlists[KW_MSSQL_OPERATORS]; - if (actualState == SCE_MSSQL_GLOBAL_VARIABLE) - start += 2; - - for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + for (unsigned int i = 0; i < end - start + 1 && i < 128; i++) { s[i] = static_cast<char>(tolower(styler[start + i])); s[i + 1] = '\0'; } char chAttr = SCE_MSSQL_IDENTIFIER; - if (wordIsNumber) + + if (actualState == SCE_MSSQL_GLOBAL_VARIABLE) { + + if (kwGlobalVariables.InList(&s[2])) + chAttr = SCE_MSSQL_GLOBAL_VARIABLE; + + } else if (wordIsNumber) { chAttr = SCE_MSSQL_NUMBER; - else { - if (kwStatements.InList(s)) - chAttr = SCE_MSSQL_STATEMENT; + + } else if (prevState == SCE_MSSQL_DEFAULT_PREF_DATATYPE) { + // Look first in datatypes if (kwDataTypes.InList(s)) chAttr = SCE_MSSQL_DATATYPE; - if (kwSystemTables.InList(s)) - chAttr = SCE_MSSQL_SYSTABLE; - if (kwGlobalVariables.InList(s)) - chAttr = SCE_MSSQL_GLOBAL_VARIABLE; - if (kwFunctions.InList(s)) + else if (kwOperators.InList(s)) + chAttr = SCE_MSSQL_OPERATOR; + else if (kwStatements.InList(s)) + chAttr = SCE_MSSQL_STATEMENT; + else if (kwSystemTables.InList(s)) + chAttr = SCE_MSSQL_SYSTABLE; + else if (kwFunctions.InList(s)) chAttr = SCE_MSSQL_FUNCTION; + else if (kwStoredProcedures.InList(s)) + chAttr = SCE_MSSQL_STORED_PROCEDURE; + + } else { + if (kwOperators.InList(s)) + chAttr = SCE_MSSQL_OPERATOR; + else if (kwStatements.InList(s)) + chAttr = SCE_MSSQL_STATEMENT; + else if (kwSystemTables.InList(s)) + chAttr = SCE_MSSQL_SYSTABLE; + else if (kwFunctions.InList(s)) + chAttr = SCE_MSSQL_FUNCTION; + else if (kwStoredProcedures.InList(s)) + chAttr = SCE_MSSQL_STORED_PROCEDURE; + else if (kwDataTypes.InList(s)) + chAttr = SCE_MSSQL_DATATYPE; } + styler.ColourTo(end, chAttr); + + return chAttr; } static void ColouriseMSSQLDoc(unsigned int startPos, int length, @@ -117,6 +150,7 @@ static void ColouriseMSSQLDoc(unsigned int startPos, int length, iixx += 2; */ int state = initStyle; + int prevState = initStyle; char chPrev = ' '; char chNext = styler[startPos]; styler.StartSegment(startPos); @@ -147,134 +181,135 @@ static void ColouriseMSSQLDoc(unsigned int startPos, int length, continue; } - if (state == SCE_MSSQL_DEFAULT) { - if (iswordstart(ch)) { + // When the last char isn't part of the state (have to deal with it too)... + if ( (state == SCE_MSSQL_IDENTIFIER) || + (state == SCE_MSSQL_STORED_PROCEDURE) || + (state == SCE_MSSQL_DATATYPE) || + //~ (state == SCE_MSSQL_COLUMN_NAME) || + (state == SCE_MSSQL_FUNCTION) || + //~ (state == SCE_MSSQL_GLOBAL_VARIABLE) || + (state == SCE_MSSQL_VARIABLE)) { + if (!iswordchar(ch)) { + int stateTmp; + + if ((state == SCE_MSSQL_VARIABLE) || (state == SCE_MSSQL_COLUMN_NAME)) { + styler.ColourTo(i - 1, state); + stateTmp = state; + } else + stateTmp = classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state, prevState); + + prevState = state; + + if (stateTmp == SCE_MSSQL_IDENTIFIER || stateTmp == SCE_MSSQL_VARIABLE) + state = SCE_MSSQL_DEFAULT_PREF_DATATYPE; + else + state = SCE_MSSQL_DEFAULT; + } + } else if (state == SCE_MSSQL_LINE_COMMENT) { + if (ch == '\r' || ch == '\n') { styler.ColourTo(i - 1, state); + prevState = state; + state = SCE_MSSQL_DEFAULT; + } + } else if (state == SCE_MSSQL_GLOBAL_VARIABLE) { + if ((ch != '@') && !iswordchar(ch)) { + classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state, prevState); + prevState = state; + state = SCE_MSSQL_DEFAULT; + } + } + + // If is the default or one of the above succeeded + if (state == SCE_MSSQL_DEFAULT || state == SCE_MSSQL_DEFAULT_PREF_DATATYPE) { + if (iswordstart(ch)) { + styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); + prevState = state; state = SCE_MSSQL_IDENTIFIER; } else if (ch == '/' && chNext == '*') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); + prevState = state; state = SCE_MSSQL_COMMENT; } else if (ch == '-' && chNext == '-') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); + prevState = state; state = SCE_MSSQL_LINE_COMMENT; } else if (ch == '\'') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); + prevState = state; state = SCE_MSSQL_STRING; - } else if ((ch == '"') || (ch == '[')) { - styler.ColourTo(i - 1, state); + } else if (ch == '"') { + styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); + prevState = state; state = SCE_MSSQL_COLUMN_NAME; + } else if (ch == '[') { + styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); + prevState = state; + state = SCE_MSSQL_COLUMN_NAME_2; } else if (isMSSQLOperator(ch)) { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); styler.ColourTo(i, SCE_MSSQL_OPERATOR); //~ style = SCE_MSSQL_DEFAULT; + prevState = state; + state = SCE_MSSQL_DEFAULT; } else if (ch == '@') { - styler.ColourTo(i - 1, state); + styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); + prevState = state; if (chNext == '@') { state = SCE_MSSQL_GLOBAL_VARIABLE; // i += 2; } else state = SCE_MSSQL_VARIABLE; } - } else if ( (state == SCE_MSSQL_IDENTIFIER) || - (state == SCE_MSSQL_DATATYPE) || - //~ (state == SCE_MSSQL_COLUMN_NAME) || - (state == SCE_MSSQL_FUNCTION) || -// (state == SCE_MSSQL_GLOBAL_VARIABLE) || - (state == SCE_MSSQL_VARIABLE)) { - if (!iswordchar(ch)) { - if ((state == SCE_MSSQL_VARIABLE) || (state == SCE_MSSQL_COLUMN_NAME)) - styler.ColourTo(i - 1, state); - else - classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state); - state = SCE_MSSQL_DEFAULT; - if (ch == '/' && chNext == '*') { - state = SCE_MSSQL_COMMENT; - } else if (ch == '-' && chNext == '-') { - state = SCE_MSSQL_LINE_COMMENT; - } else if (ch == '\'') { - state = SCE_MSSQL_STRING; - } else if ((ch == '"') || (ch == '[')) { - state = SCE_MSSQL_COLUMN_NAME; - } else if (isMSSQLOperator(ch)) { - styler.ColourTo(i, SCE_MSSQL_OPERATOR); - } else if (ch == '@') - state = (chNext == '@') ? SCE_MSSQL_GLOBAL_VARIABLE : SCE_MSSQL_VARIABLE; - } - } else { - if (state == SCE_MSSQL_COMMENT) { + + // When the last char is part of the state... + } else if (state == SCE_MSSQL_COMMENT) { if (ch == '/' && chPrev == '*') { if (((i > (styler.GetStartSegment() + 2)) || ((initStyle == SCE_MSSQL_COMMENT) && (styler.GetStartSegment() == startPos)))) { styler.ColourTo(i, state); //~ state = SCE_MSSQL_COMMENT; + prevState = state; state = SCE_MSSQL_DEFAULT; } } - } else if (state == SCE_MSSQL_LINE_COMMENT) { - if (ch == '\r' || ch == '\n') { - styler.ColourTo(i - 1, state); - state = SCE_MSSQL_DEFAULT; - } } else if (state == SCE_MSSQL_STRING) { if (ch == '\'') { if ( chNext == '\'' ) { i++; + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); } else { styler.ColourTo(i, state); + prevState = state; state = SCE_MSSQL_DEFAULT; - i++; + //i++; } - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); + //ch = chNext; + //chNext = styler.SafeGetCharAt(i + 1); } } else if (state == SCE_MSSQL_COLUMN_NAME) { if (ch == '"') { if (chNext == '"') { i++; - } else { - styler.ColourTo(i, state); - state = SCE_MSSQL_DEFAULT; - //i++; - } ch = chNext; chNext = styler.SafeGetCharAt(i + 1); - } else if (ch == ']') { + } else { styler.ColourTo(i, state); - state = SCE_MSSQL_DEFAULT; - //i++; + prevState = state; + state = SCE_MSSQL_DEFAULT_PREF_DATATYPE; + //i++; } - } else if (state == SCE_MSSQL_GLOBAL_VARIABLE) { - if ((ch != '@') && !iswordchar(ch)) { - classifyWordSQL(styler.GetStartSegment(), i - 1, keywordlists, styler, state); - state = SCE_MSSQL_DEFAULT; - } - } - if (state == SCE_MSSQL_DEFAULT) { // One of the above succeeded - if (iswordstart(ch)) { - styler.ColourTo(i - 1, state); - state = SCE_MSSQL_IDENTIFIER; - } else if (ch == '/' && chNext == '*') { - styler.ColourTo(i - 1, state); - state = SCE_MSSQL_COMMENT; - } else if (ch == '-' && chNext == '-') { - styler.ColourTo(i - 1, state); - state = SCE_MSSQL_LINE_COMMENT; - } else if (ch == '\'') { - styler.ColourTo(i - 1, state); - state = SCE_MSSQL_STRING; - } else if ((ch == '"') || (ch == '[')) { - styler.ColourTo(i - 1, state); - state = SCE_MSSQL_COLUMN_NAME; - } else if (isMSSQLOperator(ch) && !((ch == '/') && (chPrev == '*'))) { - styler.ColourTo(i - 1, state); - styler.ColourTo(i, SCE_MSSQL_OPERATOR); - } else if (ch == '@') { - styler.ColourTo(i - 1, state); - state = (chNext == '@') ? SCE_MSSQL_GLOBAL_VARIABLE : SCE_MSSQL_VARIABLE; } + } else if (state == SCE_MSSQL_COLUMN_NAME_2) { + if (ch == ']') { + styler.ColourTo(i, state); + prevState = state; + state = SCE_MSSQL_DEFAULT_PREF_DATATYPE; + //i++; } } + chPrev = ch; } styler.ColourTo(lengthDoc - 1, state); @@ -286,6 +321,8 @@ static const char * const sqlWordListDesc[] = { "System tables", "Global variables", "Functions", + "System Stored Procedures", + "Operators", 0, }; |