aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/LexMSSQL.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/LexMSSQL.cxx')
-rw-r--r--src/LexMSSQL.cxx231
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,
};