diff options
Diffstat (limited to 'src/LexMSSQL.cxx')
-rw-r--r-- | src/LexMSSQL.cxx | 363 |
1 files changed, 0 insertions, 363 deletions
diff --git a/src/LexMSSQL.cxx b/src/LexMSSQL.cxx deleted file mode 100644 index 4a3f3bed8..000000000 --- a/src/LexMSSQL.cxx +++ /dev/null @@ -1,363 +0,0 @@ -// Scintilla source code edit control -/** @file LexMSSQL.cxx - ** Lexer for MSSQL. - **/ -// By Filip Yaghob <fyaghob@gmail.com> -// The License.txt file describes the conditions under which this software may be distributed. - -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <stdio.h> -#include <stdarg.h> - -#include "Platform.h" - -#include "PropSet.h" -#include "Accessor.h" -#include "KeyWords.h" -#include "Scintilla.h" -#include "SciLexer.h" - -#ifdef SCI_NAMESPACE -using namespace Scintilla; -#endif - -#define KW_MSSQL_STATEMENTS 0 -#define KW_MSSQL_DATA_TYPES 1 -#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 - -static bool isMSSQLOperator(char ch) { - if (isascii(ch) && isalnum(ch)) - return false; - // '.' left out as it is used to make up numbers - if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || - ch == '-' || ch == '+' || ch == '=' || ch == '|' || - ch == '<' || ch == '>' || ch == '/' || - ch == '!' || ch == '~' || ch == '(' || ch == ')' || - ch == ',') - return true; - return false; -} - -static char classifyWordSQL(unsigned int start, - unsigned int end, - WordList *keywordlists[], - Accessor &styler, - unsigned int actualState, - unsigned int prevState) { - char s[256]; - bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); - - WordList &kwStatements = *keywordlists[KW_MSSQL_STATEMENTS]; - WordList &kwDataTypes = *keywordlists[KW_MSSQL_DATA_TYPES]; - 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]; - - 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 (actualState == SCE_MSSQL_GLOBAL_VARIABLE) { - - if (kwGlobalVariables.InList(&s[2])) - chAttr = SCE_MSSQL_GLOBAL_VARIABLE; - - } else if (wordIsNumber) { - chAttr = SCE_MSSQL_NUMBER; - - } else if (prevState == SCE_MSSQL_DEFAULT_PREF_DATATYPE) { - // Look first in datatypes - if (kwDataTypes.InList(s)) - chAttr = SCE_MSSQL_DATATYPE; - 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, - int initStyle, WordList *keywordlists[], Accessor &styler) { - - - styler.StartAt(startPos); - - bool fold = styler.GetPropertyInt("fold") != 0; - int lineCurrent = styler.GetLine(startPos); - int spaceFlags = 0; - - int state = initStyle; - int prevState = initStyle; - char chPrev = ' '; - char chNext = styler[startPos]; - styler.StartSegment(startPos); - unsigned int lengthDoc = startPos + length; - for (unsigned int i = startPos; i < lengthDoc; i++) { - char ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - - if ((ch == '\r' && chNext != '\n') || (ch == '\n')) { - int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags); - int lev = indentCurrent; - if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { - // Only non whitespace lines can be headers - int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags); - if (indentCurrent < (indentNext & ~SC_FOLDLEVELWHITEFLAG)) { - lev |= SC_FOLDLEVELHEADERFLAG; - } - } - if (fold) { - styler.SetLevel(lineCurrent, lev); - } - } - - if (styler.IsLeadByte(ch)) { - chNext = styler.SafeGetCharAt(i + 2); - chPrev = ' '; - i += 1; - continue; - } - - // 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, SCE_MSSQL_DEFAULT); - prevState = state; - state = SCE_MSSQL_COMMENT; - } else if (ch == '-' && chNext == '-') { - styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); - prevState = state; - state = SCE_MSSQL_LINE_COMMENT; - } else if (ch == '\'') { - styler.ColourTo(i - 1, SCE_MSSQL_DEFAULT); - prevState = state; - state = SCE_MSSQL_STRING; - } 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, 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, SCE_MSSQL_DEFAULT); - prevState = state; - if (chNext == '@') { - state = SCE_MSSQL_GLOBAL_VARIABLE; -// i += 2; - } else - state = SCE_MSSQL_VARIABLE; - } - - - // 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_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++; - } - //ch = chNext; - //chNext = styler.SafeGetCharAt(i + 1); - } - } else if (state == SCE_MSSQL_COLUMN_NAME) { - if (ch == '"') { - if (chNext == '"') { - i++; - ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - } else { - styler.ColourTo(i, state); - prevState = state; - state = SCE_MSSQL_DEFAULT_PREF_DATATYPE; - //i++; - } - } - } 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); -} - -static void FoldMSSQLDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { - bool foldComment = styler.GetPropertyInt("fold.comment") != 0; - bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; - unsigned int endPos = startPos + length; - int visibleChars = 0; - int lineCurrent = styler.GetLine(startPos); - int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; - int levelCurrent = levelPrev; - char chNext = styler[startPos]; - bool inComment = (styler.StyleAt(startPos-1) == SCE_MSSQL_COMMENT); - char s[10]; - for (unsigned int i = startPos; i < endPos; i++) { - char ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - int style = styler.StyleAt(i); - bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - // Comment folding - if (foldComment) { - if (!inComment && (style == SCE_MSSQL_COMMENT)) - levelCurrent++; - else if (inComment && (style != SCE_MSSQL_COMMENT)) - levelCurrent--; - inComment = (style == SCE_MSSQL_COMMENT); - } - if (style == SCE_MSSQL_STATEMENT) { - // Folding between begin or case and end - if (ch == 'b' || ch == 'B' || ch == 'c' || ch == 'C' || ch == 'e' || ch == 'E') { - for (unsigned int j = 0; j < 5; j++) { - if (!iswordchar(styler[i + j])) { - break; - } - s[j] = static_cast<char>(tolower(styler[i + j])); - s[j + 1] = '\0'; - } - if ((strcmp(s, "begin") == 0) || (strcmp(s, "case") == 0)) { - levelCurrent++; - } - if (strcmp(s, "end") == 0) { - levelCurrent--; - } - } - } - if (atEOL) { - int lev = levelPrev; - if (visibleChars == 0 && foldCompact) - lev |= SC_FOLDLEVELWHITEFLAG; - if ((levelCurrent > levelPrev) && (visibleChars > 0)) - lev |= SC_FOLDLEVELHEADERFLAG; - if (lev != styler.LevelAt(lineCurrent)) { - styler.SetLevel(lineCurrent, lev); - } - lineCurrent++; - levelPrev = levelCurrent; - visibleChars = 0; - } - if (!isspacechar(ch)) - visibleChars++; - } - // Fill in the real level of the next line, keeping the current flags as they will be filled in later - int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; - styler.SetLevel(lineCurrent, levelPrev | flagsNext); -} - -static const char * const sqlWordListDesc[] = { - "Statements", - "Data Types", - "System tables", - "Global variables", - "Functions", - "System Stored Procedures", - "Operators", - 0, -}; - -LexerModule lmMSSQL(SCLEX_MSSQL, ColouriseMSSQLDoc, "mssql", FoldMSSQLDoc, sqlWordListDesc); |