diff options
-rw-r--r-- | gtk/makefile | 8 | ||||
-rw-r--r-- | gtk/scintilla.mak | 6 | ||||
-rw-r--r-- | include/SciLexer.h | 25 | ||||
-rw-r--r-- | include/Scintilla.iface | 29 | ||||
-rw-r--r-- | src/KeyWords.cxx | 2 | ||||
-rw-r--r-- | src/LexAPDL.cxx | 174 | ||||
-rw-r--r-- | src/LexAU3.cxx | 218 | ||||
-rw-r--r-- | src/LexMSSQL.cxx | 231 | ||||
-rw-r--r-- | win32/SciTE.properties | 2 | ||||
-rw-r--r-- | win32/makefile | 8 | ||||
-rw-r--r-- | win32/scintilla.mak | 6 | ||||
-rw-r--r-- | win32/scintilla_vc6.mak | 6 |
12 files changed, 609 insertions, 106 deletions
diff --git a/gtk/makefile b/gtk/makefile index fd8eb0f76..ba93f8dfc 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -58,10 +58,10 @@ endif #++Autogenerated -- run src/LexGen.py to regenerate #**LEXOBJS=\\\n\(\*.o \) LEXOBJS=\ -LexAda.o LexAsm.o LexAVE.o LexBaan.o LexBullant.o LexCLW.o LexConf.o LexCPP.o \ -LexCrontab.o LexCSS.o LexEiffel.o LexErlang.o LexEScript.o LexForth.o \ -LexFortran.o LexGui4Cli.o LexHTML.o LexKix.o LexLisp.o LexLout.o LexLua.o \ -LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o LexNsis.o \ +LexAda.o LexAPDL.o LexAsm.o LexAU3.o LexAVE.o LexBaan.o LexBullant.o LexCLW.o \ +LexConf.o LexCPP.o LexCrontab.o LexCSS.o LexEiffel.o LexErlang.o LexEScript.o \ +LexForth.o LexFortran.o LexGui4Cli.o LexHTML.o LexKix.o LexLisp.o LexLout.o \ +LexLua.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o LexNsis.o \ LexOthers.o LexPascal.o LexPB.o LexPerl.o LexPOV.o LexPS.o LexPython.o \ LexRuby.o LexScriptol.o LexSpecman.o LexSQL.o LexTeX.o LexVB.o LexVerilog.o \ LexYAML.o diff --git a/gtk/scintilla.mak b/gtk/scintilla.mak index beeae141c..7cf1c042d 100644 --- a/gtk/scintilla.mak +++ b/gtk/scintilla.mak @@ -121,7 +121,9 @@ SOBJS=\ #**LEXOBJS=\\\n\(\t$(DIR_O)\\\*.obj \\\n\) LEXOBJS=\ $(DIR_O)\LexAda.obj \ + $(DIR_O)\LexAPDL.obj \ $(DIR_O)\LexAsm.obj \ + $(DIR_O)\LexAU3.obj \ $(DIR_O)\LexAVE.obj \ $(DIR_O)\LexBaan.obj \ $(DIR_O)\LexBullant.obj \ @@ -276,8 +278,12 @@ $(DIR_O)\KeyWords.obj: ..\src\KeyWords.cxx ..\include\Platform.h ..\include\Prop $(DIR_O)\LexAda.obj: ..\src\LexAda.cxx $(LEX_HEADERS) +$(DIR_O)\LexAPDL.obj: ..\src\LexAPDL.cxx $(LEX_HEADERS) + $(DIR_O)\LexAsm.obj: ..\src\LexAsm.cxx $(LEX_HEADERS) +$(DIR_O)\LexAU3.obj: ..\src\LexAU3.cxx $(LEX_HEADERS) + $(DIR_O)\LexAVE.obj: ..\src\LexAVE.cxx $(LEX_HEADERS) $(DIR_O)\LexBaan.obj: ..\src\LexBaan.cxx $(LEX_HEADERS) diff --git a/include/SciLexer.h b/include/SciLexer.h index c8a7e7503..8b1d39f2b 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -74,6 +74,8 @@ #define SCLEX_KIX 57 #define SCLEX_GUI4CLI 58 #define SCLEX_SPECMAN 59 +#define SCLEX_AU3 60 +#define SCLEX_APDL 61 #define SCLEX_AUTOMATIC 1000 #define SCE_P_DEFAULT 0 #define SCE_P_COMMENTLINE 1 @@ -657,6 +659,9 @@ #define SCE_MSSQL_SYSTABLE 11 #define SCE_MSSQL_GLOBAL_VARIABLE 12 #define SCE_MSSQL_FUNCTION 13 +#define SCE_MSSQL_STORED_PROCEDURE 14 +#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15 +#define SCE_MSSQL_COLUMN_NAME_2 16 #define SCE_V_DEFAULT 0 #define SCE_V_COMMENT 1 #define SCE_V_COMMENTLINE 2 @@ -708,6 +713,26 @@ #define SCE_SN_REGEXTAG 13 #define SCE_SN_SIGNAL 14 #define SCE_SN_USER 19 +#define SCE_AU3_DEFAULT 0 +#define SCE_AU3_COMMENT 1 +#define SCE_AU3_COMMENTBLOCK 2 +#define SCE_AU3_NUMBER 3 +#define SCE_AU3_FUNCTION 4 +#define SCE_AU3_KEYWORD 5 +#define SCE_AU3_MACRO 6 +#define SCE_AU3_STRING 7 +#define SCE_AU3_OPERATOR 8 +#define SCE_AU3_VARIABLE 9 +#define SCE_AU3_SENT 10 +#define SCE_APDL_DEFAULT 0 +#define SCE_APDL_COMMENT 1 +#define SCE_APDL_COMMENTBLOCK 2 +#define SCE_APDL_NUMBER 3 +#define SCE_APDL_STRING 4 +#define SCE_APDL_WORD 5 +#define SCE_APDL_COMMAND 6 +#define SCE_APDL_PROCESSOR 7 +#define SCE_APDL_FUNCTION 8 //--Autogenerated -- end of section automatically generated from Scintilla.iface #endif diff --git a/include/Scintilla.iface b/include/Scintilla.iface index f4c0ee0bc..4676e3c9b 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1700,6 +1700,8 @@ val SCLEX_VERILOG=56 val SCLEX_KIX=57 val SCLEX_GUI4CLI=58 val SCLEX_SPECMAN=59 +val SCLEX_AU3=60 +val SCLEX_APDL=61 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -2388,6 +2390,9 @@ val SCE_MSSQL_DATATYPE=10 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 # Lexical states for SCLEX_VERILOG lex Verilog=SCLEX_VERILOG SCE_V_ val SCE_V_DEFAULT=0 @@ -2446,6 +2451,30 @@ val SCE_SN_STRINGEOL=12 val SCE_SN_REGEXTAG=13 val SCE_SN_SIGNAL=14 val SCE_SN_USER=19 +# Lexical states for SCLEX_AU3 +lex Au3=SCLEX_AU3 SCE_AU3_ +val SCE_AU3_DEFAULT=0 +val SCE_AU3_COMMENT=1 +val SCE_AU3_COMMENTBLOCK=2 +val SCE_AU3_NUMBER=3 +val SCE_AU3_FUNCTION=4 +val SCE_AU3_KEYWORD=5 +val SCE_AU3_MACRO=6 +val SCE_AU3_STRING=7 +val SCE_AU3_OPERATOR=8 +val SCE_AU3_VARIABLE=9 +val SCE_AU3_SENT=10 +# Lexical states for SCLEX_APDL +lex APDL=SCLEX_APDL SCE_APDL_ +val SCE_APDL_DEFAULT=0 +val SCE_APDL_COMMENT=1 +val SCE_APDL_COMMENTBLOCK=2 +val SCE_APDL_NUMBER=3 +val SCE_APDL_STRING=4 +val SCE_APDL_WORD=5 +val SCE_APDL_COMMAND=6 +val SCE_APDL_PROCESSOR=7 +val SCE_APDL_FUNCTION=8 # Events evt void StyleNeeded=2000(int position) diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index cc9c4afcc..717d251f7 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -130,7 +130,9 @@ int Scintilla_LinkLexers() { //++Autogenerated -- run src/LexGen.py to regenerate //**\(\tLINK_LEXER(\*);\n\) LINK_LEXER(lmAda); + LINK_LEXER(lmAPDL); LINK_LEXER(lmAsm); + LINK_LEXER(lmAU3); LINK_LEXER(lmAVE); LINK_LEXER(lmBaan); LINK_LEXER(lmBullant); diff --git a/src/LexAPDL.cxx b/src/LexAPDL.cxx new file mode 100644 index 000000000..b739e9a7c --- /dev/null +++ b/src/LexAPDL.cxx @@ -0,0 +1,174 @@ + +#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 "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '/' || ch == '*'); +} + +inline bool IsABlank(unsigned int ch) { + return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ; +} + + + +static void ColouriseAPDLDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) +{ + + //~ FILE *fp; + //~ fp = fopen("myoutput.txt", "w"); + + WordList &commands = *keywordlists[0]; + WordList &processors = *keywordlists[1]; + WordList &functions = *keywordlists[2]; + + + // backtrack to the beginning of the document, this may be slow for big documents. + initStyle = SCE_APDL_DEFAULT; + StyleContext sc(0, startPos+length, initStyle, styler); + + // backtrack to the nearest keyword + //~ while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_APDL_WORD)) { + //~ startPos--; + //~ } + //~ startPos = styler.LineStart(styler.GetLine(startPos)); + //~ initStyle = styler.StyleAt(startPos - 1); + //~ StyleContext sc(startPos, endPos-startPos, initStyle, styler); + + bool firstInLine = true; + bool atEOL; + + for (; sc.More(); sc.Forward()) { + + atEOL = (sc.ch == '\r' && sc.chNext == '\n') || (sc.ch == '\n'); + + //~ if (sc.ch == '\r') { + //~ fprintf(fp,"CR\t%d\t%d", atEOL, firstInLine); + //~ } else if (sc.ch == '\n') { + //~ fprintf(fp,"LF\t%d\t%d", atEOL, firstInLine); + //~ } else { + //~ fprintf(fp,"%c\t%d\t%d", sc.ch, atEOL, firstInLine); + //~ } + + // Determine if the current state should terminate. + if (sc.state == SCE_APDL_COMMENT) { + //~ fprintf(fp,"\tCOMMENT"); + if (atEOL) { + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_COMMENTBLOCK) { + //~ fprintf(fp,"\tCOMMENTBLOCK"); + if (atEOL) { + if (sc.ch == '\r') { + sc.Forward(); + } + sc.ForwardSetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_NUMBER) { + //~ fprintf(fp,"\tNUMBER"); + if (isdigit(sc.ch)) { + } else if ((sc.ch == 'e' || sc.ch == 'E') && (isdigit(sc.chNext) || sc.chNext == '+' || sc.chNext == '-')) { + } else if (sc.ch == '.') { + } else if ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')) { + } else { + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_STRING) { + //~ fprintf(fp,"\tSTRING"); + if (sc.ch == '\"') { + //~ sc.ForwardSetState(SCE_APDL_DEFAULT); + sc.Forward(); + atEOL = (sc.ch == '\r' && sc.chNext == '\n') || (sc.ch == '\n'); + if (atEOL) { + firstInLine = true; + } + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_WORD) { + //~ fprintf(fp,"\tWORD"); + if (!IsAWordChar(sc.ch) || sc.ch == '%') { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (commands.InList(s) && firstInLine) { + if (IsABlank(sc.ch) || sc.ch == ',' || atEOL) { + sc.ChangeState(SCE_APDL_COMMAND); + } + if (sc.ch != '\n') { + firstInLine = false; + } + } else if (processors.InList(s)) { + if (IsABlank(sc.ch) || atEOL) { + sc.ChangeState(SCE_APDL_PROCESSOR); + while (sc.ch != '\n') { + sc.Forward(); + } + sc.Forward(); + } + } else if (functions.InList(s)) { + sc.ChangeState(SCE_APDL_FUNCTION); + if (sc.ch != '\n') { + firstInLine = false; + } + } else { + if (sc.ch != '\n') { + firstInLine = false; + } + } + sc.SetState(SCE_APDL_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_APDL_DEFAULT) { + if (sc.ch == '!' && sc.chNext != '!') { + sc.SetState(SCE_APDL_COMMENT); + } else if (sc.ch == '!' && sc.chNext == '!') { + sc.SetState(SCE_APDL_COMMENTBLOCK); + } else if (IsADigit(sc.ch) && !IsAWordChar(sc.chPrev)) { + sc.SetState(SCE_APDL_NUMBER); + } else if (sc.ch == '.' && (isoperator(static_cast<char>(sc.chPrev)) || + IsABlank(sc.chPrev) || sc.chPrev == '\n' || sc.chPrev == '\r')) { + sc.SetState(SCE_APDL_NUMBER); + } else if (sc.ch == '\"') { + sc.SetState(SCE_APDL_STRING); + } else if (IsAWordStart(sc.ch) && (!IsADigit(sc.chPrev))) { + sc.SetState(SCE_APDL_WORD); + } + + } + //~ fprintf(fp,"\n"); + + if (atEOL) { + firstInLine = true; + } + + } + sc.Complete(); +} + +static const char * const apdlWordListDesc[] = { + "Commands", + "Processors", + "Functions", + 0 +}; + +LexerModule lmAPDL(SCLEX_APDL, ColouriseAPDLDoc, "apdl", 0, apdlWordListDesc); diff --git a/src/LexAU3.cxx b/src/LexAU3.cxx new file mode 100644 index 000000000..0ed51ec47 --- /dev/null +++ b/src/LexAU3.cxx @@ -0,0 +1,218 @@ +// Scintilla source code edit control +// @file LexAU3.cxx +// Lexer for AutoIt3 http://www.hiddensoft.com/autoit3 +// by Jos van der Zande, jvdzande@yahoo.com +// +// Changes: +// +// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. +// Scintilla source code edit control + +#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 "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static inline bool IsTypeCharacter(const int ch) +{ + return ch == '$'; +} +static inline bool IsAWordChar(const int ch) +{ + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '-'); +} + +static inline bool IsAWordStart(const int ch) +{ + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '{' || ch == '+' || ch == '!' || ch == '#' || ch == '^'); +} + +static void ColouriseAU3Doc(unsigned int startPos, + int length, int initStyle, + WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + styler.StartAt(startPos); + + StyleContext sc(startPos, length, initStyle, styler); + char si,sk; + si=0; + sk=0; + for (; sc.More(); sc.Forward()) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + switch (sc.state) + { + case SCE_AU3_COMMENTBLOCK: + { + if (sc.ch == '#') {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_COMMENT: + { + if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_OPERATOR: + { + sc.SetState(SCE_AU3_DEFAULT); + break; + } + case SCE_AU3_KEYWORD: + { + if (!IsAWordChar(sc.ch)) + { + if (!IsTypeCharacter(sc.ch)) + { + if (strcmp(s, "#cs")==0 || strcmp(s, "#comments_start")==0) + { + sc.ChangeState(SCE_AU3_COMMENTBLOCK); + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + else if (strcmp(s, "#ce")==0 || strcmp(s, "#comments_end")==0) + { + sc.ChangeState(SCE_AU3_COMMENTBLOCK); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords.InList(s)) { + sc.ChangeState(SCE_AU3_KEYWORD); + sc.SetState(SCE_AU3_DEFAULT); + //sc.SetState(SCE_AU3_KEYWORD); + } + else if (keywords2.InList(s)) { + sc.ChangeState(SCE_AU3_FUNCTION); + sc.SetState(SCE_AU3_DEFAULT); + //sc.SetState(SCE_AU3_FUNCTION); + } + else if (keywords3.InList(s)) { + sc.ChangeState(SCE_AU3_MACRO); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (!IsAWordChar(sc.ch)) { + sc.ChangeState(SCE_AU3_DEFAULT); + sc.SetState(SCE_AU3_DEFAULT); + } + } + } + if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_NUMBER: + { + if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_VARIABLE: + { + if (!IsAWordChar(sc.ch)) {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_STRING: + { + sk = 0; + // check for " in and single qouted string + if (si == 1){ + if (sc.ch == '\"'){sc.ForwardSetState(SCE_AU3_DEFAULT);}} + // check for ' in and double qouted string + if (si == 2){ + if (sc.ch == '\''){sc.ForwardSetState(SCE_AU3_DEFAULT);}} + if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + // find Sendkeys in an STRING + if (sc.ch == '{') {sc.SetState(SCE_AU3_SENT);} + if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);} + if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);} + if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);} + if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);} + break; + } + + case SCE_AU3_SENT: + { + // Sent key string ended + if (sk == 1) + { + // set color to SENTKEY when valid sentkey .. else set to comment to show its wrong + if (keywords4.InList(s)) + { + sc.ChangeState(SCE_AU3_SENT); + } + else + { + sc.ChangeState(SCE_AU3_STRING); + } + sc.SetState(SCE_AU3_STRING); + sk=0; + } + // check if next portion is again a sentkey + if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + if (sc.ch == '{') {sc.SetState(SCE_AU3_SENT);} + if (sc.ch == '+' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);} + if (sc.ch == '!' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);} + if (sc.ch == '^' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);} + if (sc.ch == '#' && sc.chNext == '{') {sc.SetState(SCE_AU3_SENT);} + // check to see if the string ended... + // check for " in and single qouted string + if (si == 1){ + if (sc.ch == '\"'){sc.ForwardSetState(SCE_AU3_DEFAULT);}} + // check for ' in and double qouted string + if (si == 2){ + if (sc.ch == '\''){sc.ForwardSetState(SCE_AU3_DEFAULT);}} + break; + } + } //switch (sc.state) + + // Determine if a new state should be entered: + if (sc.state == SCE_AU3_SENT) + { + if (sc.ch == '}' && sc.chNext != '}') + { + sk = 1; + } + } + if (sc.state == SCE_AU3_DEFAULT) + { + if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);} + else if (sc.ch == '#') {sc.SetState(SCE_AU3_KEYWORD);} + else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_AU3_KEYWORD);} + else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);} + else if (sc.ch == '\"') { + sc.SetState(SCE_AU3_STRING); + si = 1; } + else if (sc.ch == '\'') { + sc.SetState(SCE_AU3_STRING); + si = 2; } + else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);} + else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {sc.SetState(SCE_AU3_NUMBER);} + //else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_AU3_KEYWORD);} + else if (isoperator(static_cast<char>(sc.ch)) || (sc.ch == '\\')) {sc.SetState(SCE_AU3_OPERATOR);} + else if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + } + } //for (; sc.More(); sc.Forward()) + sc.Complete(); +} + +// + +static const char * const AU3WordLists[] = { + "#autoit keywords", + "#autoit functions", + "#autoit macros", + "#autoit Sent keys", + 0 +}; +LexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, "au3", NULL , AU3WordLists); 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, }; diff --git a/win32/SciTE.properties b/win32/SciTE.properties index 5856b8de1..b48e2b79d 100644 --- a/win32/SciTE.properties +++ b/win32/SciTE.properties @@ -1,4 +1,4 @@ -command.build.SConstruct=scons.bat . +#command.build.SConstruct=scons.bat . command.name.1.SConstruct=scons clean command.1.SConstruct=scons.bat --clean . diff --git a/win32/makefile b/win32/makefile index 8dbcf958a..9e0d784a0 100644 --- a/win32/makefile +++ b/win32/makefile @@ -50,10 +50,10 @@ deps: #++Autogenerated -- run src/LexGen.py to regenerate #**LEXOBJS=\\\n\(\*.o \) LEXOBJS=\ -LexAda.o LexAsm.o LexAVE.o LexBaan.o LexBullant.o LexCLW.o LexConf.o LexCPP.o \ -LexCrontab.o LexCSS.o LexEiffel.o LexErlang.o LexEScript.o LexForth.o \ -LexFortran.o LexGui4Cli.o LexHTML.o LexKix.o LexLisp.o LexLout.o LexLua.o \ -LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o LexNsis.o \ +LexAda.o LexAPDL.o LexAsm.o LexAU3.o LexAVE.o LexBaan.o LexBullant.o LexCLW.o \ +LexConf.o LexCPP.o LexCrontab.o LexCSS.o LexEiffel.o LexErlang.o LexEScript.o \ +LexForth.o LexFortran.o LexGui4Cli.o LexHTML.o LexKix.o LexLisp.o LexLout.o \ +LexLua.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o LexNsis.o \ LexOthers.o LexPascal.o LexPB.o LexPerl.o LexPOV.o LexPS.o LexPython.o \ LexRuby.o LexScriptol.o LexSpecman.o LexSQL.o LexTeX.o LexVB.o LexVerilog.o \ LexYAML.o diff --git a/win32/scintilla.mak b/win32/scintilla.mak index a727b80fd..7047afaec 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -110,7 +110,9 @@ SOBJS=\ #**LEXOBJS=\\\n\(\t$(DIR_O)\\\*.obj \\\n\) LEXOBJS=\ $(DIR_O)\LexAda.obj \ + $(DIR_O)\LexAPDL.obj \ $(DIR_O)\LexAsm.obj \ + $(DIR_O)\LexAU3.obj \ $(DIR_O)\LexAVE.obj \ $(DIR_O)\LexBaan.obj \ $(DIR_O)\LexBullant.obj \ @@ -262,8 +264,12 @@ $(DIR_O)\KeyWords.obj: ../src/KeyWords.cxx ../include/Platform.h \ $(DIR_O)\LexAda.obj: ..\src\LexAda.cxx $(LEX_HEADERS) +$(DIR_O)\LexAPDL.obj: ..\src\LexAPDL.cxx $(LEX_HEADERS) + $(DIR_O)\LexAsm.obj: ..\src\LexAsm.cxx $(LEX_HEADERS) +$(DIR_O)\LexAU3.obj: ..\src\LexAU3.cxx $(LEX_HEADERS) + $(DIR_O)\LexAVE.obj: ..\src\LexAVE.cxx $(LEX_HEADERS) $(DIR_O)\LexBaan.obj: ..\src\LexBaan.cxx $(LEX_HEADERS) diff --git a/win32/scintilla_vc6.mak b/win32/scintilla_vc6.mak index 5f737429f..6219eb515 100644 --- a/win32/scintilla_vc6.mak +++ b/win32/scintilla_vc6.mak @@ -112,7 +112,9 @@ SOBJS=\ #**LEXOBJS=\\\n\(\t$(DIR_O)\\\*.obj \\\n\) LEXOBJS=\ $(DIR_O)\LexAda.obj \ + $(DIR_O)\LexAPDL.obj \ $(DIR_O)\LexAsm.obj \ + $(DIR_O)\LexAU3.obj \ $(DIR_O)\LexAVE.obj \ $(DIR_O)\LexBaan.obj \ $(DIR_O)\LexBullant.obj \ @@ -264,8 +266,12 @@ $(DIR_O)\KeyWords.obj: ../src/KeyWords.cxx ../include/Platform.h \ $(DIR_O)\LexAda.obj: ..\src\LexAda.cxx $(LEX_HEADERS) +$(DIR_O)\LexAPDL.obj: ..\src\LexAPDL.cxx $(LEX_HEADERS) + $(DIR_O)\LexAsm.obj: ..\src\LexAsm.cxx $(LEX_HEADERS) +$(DIR_O)\LexAU3.obj: ..\src\LexAU3.cxx $(LEX_HEADERS) + $(DIR_O)\LexAVE.obj: ..\src\LexAVE.cxx $(LEX_HEADERS) $(DIR_O)\LexBaan.obj: ..\src\LexBaan.cxx $(LEX_HEADERS) |