diff options
-rw-r--r-- | gtk/makefile | 7 | ||||
-rw-r--r-- | gtk/scintilla.mak | 6 | ||||
-rw-r--r-- | include/SciLexer.h | 42 | ||||
-rw-r--r-- | include/Scintilla.iface | 45 | ||||
-rw-r--r-- | macosx/makefile | 9 | ||||
-rw-r--r-- | src/KeyWords.cxx | 2 | ||||
-rw-r--r-- | src/LexPLM.cxx | 198 | ||||
-rw-r--r-- | src/LexProgress.cxx | 271 | ||||
-rw-r--r-- | vcbuild/SciLexer.dsp | 8 | ||||
-rw-r--r-- | win32/makefile | 7 | ||||
-rw-r--r-- | win32/scintilla.mak | 6 | ||||
-rw-r--r-- | win32/scintilla_vc6.mak | 6 |
12 files changed, 597 insertions, 10 deletions
diff --git a/gtk/makefile b/gtk/makefile index 52a88f4e7..201732be6 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -69,9 +69,10 @@ LexCrontab.o LexCsound.o LexCSS.o LexD.o LexEiffel.o LexErlang.o LexEScript.o \ LexFlagship.o LexForth.o LexFortran.o LexGAP.o LexGui4Cli.o LexHaskell.o \ LexHTML.o LexInno.o LexKix.o LexLisp.o LexLout.o LexLua.o LexMatlab.o \ LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o LexNsis.o LexOpal.o LexOthers.o \ -LexPascal.o LexPB.o LexPerl.o LexPOV.o LexPS.o LexPython.o LexRebol.o \ -LexRuby.o LexScriptol.o LexSmalltalk.o LexSpecman.o LexSpice.o LexSQL.o \ -LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o +LexPascal.o LexPB.o LexPerl.o LexPLM.o LexPOV.o LexProgress.o LexPS.o \ +LexPython.o LexRebol.o LexRuby.o LexScriptol.o LexSmalltalk.o LexSpecman.o \ +LexSpice.o LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o \ +LexVHDL.o LexYAML.o #--Autogenerated -- end of automatically generated section all: $(COMPLIB) diff --git a/gtk/scintilla.mak b/gtk/scintilla.mak index 1f2dcc798..ffa2b5495 100644 --- a/gtk/scintilla.mak +++ b/gtk/scintilla.mak @@ -188,7 +188,9 @@ LEXOBJS=\ $(DIR_O)\LexPascal.obj \ $(DIR_O)\LexPB.obj \ $(DIR_O)\LexPerl.obj \ + $(DIR_O)\LexPLM.obj \ $(DIR_O)\LexPOV.obj \ + $(DIR_O)\LexProgress.obj \ $(DIR_O)\LexPS.obj \ $(DIR_O)\LexPython.obj \ $(DIR_O)\LexRebol.obj \ @@ -437,8 +439,12 @@ $(DIR_O)\LexPB.obj: ..\src\LexPB.cxx $(LEX_HEADERS) $(DIR_O)\LexPerl.obj: ..\src\LexPerl.cxx $(LEX_HEADERS) +$(DIR_O)\LexPLM.obj: ..\src\LexPLM.cxx $(LEX_HEADERS) + $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexProgress.obj: ..\src\LexProgress.cxx $(LEX_HEADERS) + $(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) $(DIR_O)\LexPython.obj: ..\src\LexPython.cxx $(LEX_HEADERS) diff --git a/include/SciLexer.h b/include/SciLexer.h index 62382ca4c..139ee3fe7 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -94,6 +94,8 @@ #define SCLEX_D 79 #define SCLEX_CMAKE 80 #define SCLEX_GAP 81 +#define SCLEX_PLM 82 +#define SCLEX_PROGRESS 83 #define SCLEX_AUTOMATIC 1000 #define SCE_P_DEFAULT 0 #define SCE_P_COMMENTLINE 1 @@ -1116,6 +1118,46 @@ #define SCE_GAP_COMMENT 9 #define SCE_GAP_NUMBER 10 #define SCE_GAP_STRINGEOL 11 +#define SCE_PLM_DEFAULT 0 +#define SCE_PLM_COMMENT 1 +#define SCE_PLM_STRING 2 +#define SCE_PLM_NUMBER 3 +#define SCE_PLM_IDENTIFIER 4 +#define SCE_PLM_OPERATOR 5 +#define SCE_PLM_CONTROL 6 +#define SCE_PLM_KEYWORD 7 +#define SCE_4GL_DEFAULT 0 +#define SCE_4GL_NUMBER 1 +#define SCE_4GL_WORD 2 +#define SCE_4GL_STRING 3 +#define SCE_4GL_CHARACTER 4 +#define SCE_4GL_PREPROCESSOR 5 +#define SCE_4GL_OPERATOR 6 +#define SCE_4GL_IDENTIFIER 7 +#define SCE_4GL_BLOCK 8 +#define SCE_4GL_END 9 +#define SCE_4GL_COMMENT1 10 +#define SCE_4GL_COMMENT2 11 +#define SCE_4GL_COMMENT3 12 +#define SCE_4GL_COMMENT4 13 +#define SCE_4GL_COMMENT5 14 +#define SCE_4GL_COMMENT6 15 +#define SCE_4GL_DEFAULT_ 16 +#define SCE_4GL_NUMBER_ 17 +#define SCE_4GL_WORD_ 18 +#define SCE_4GL_STRING_ 19 +#define SCE_4GL_CHARACTER_ 20 +#define SCE_4GL_PREPROCESSOR_ 21 +#define SCE_4GL_OPERATOR_ 22 +#define SCE_4GL_IDENTIFIER_ 23 +#define SCE_4GL_BLOCK_ 24 +#define SCE_4GL_END_ 25 +#define SCE_4GL_COMMENT1_ 26 +#define SCE_4GL_COMMENT2_ 27 +#define SCE_4GL_COMMENT3_ 28 +#define SCE_4GL_COMMENT4_ 29 +#define SCE_4GL_COMMENT5_ 30 +#define SCE_4GL_COMMENT6_ 31 #define SCLEX_ASP 29 #define SCLEX_PHP 30 //--Autogenerated -- end of section automatically generated from Scintilla.iface diff --git a/include/Scintilla.iface b/include/Scintilla.iface index b932a33f6..b89236b71 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1970,6 +1970,8 @@ val SCLEX_SPICE=78 val SCLEX_D=79 val SCLEX_CMAKE=80 val SCLEX_GAP=81 +val SCLEX_PLM=82 +val SCLEX_PROGRESS=83 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -3143,6 +3145,49 @@ val SCE_GAP_OPERATOR=8 val SCE_GAP_COMMENT=9 val SCE_GAP_NUMBER=10 val SCE_GAP_STRINGEOL=11 +# Lexical state for SCLEX_PLM +lex PLM=SCLEX_PLM SCE_PLM_ +val SCE_PLM_DEFAULT=0 +val SCE_PLM_COMMENT=1 +val SCE_PLM_STRING=2 +val SCE_PLM_NUMBER=3 +val SCE_PLM_IDENTIFIER=4 +val SCE_PLM_OPERATOR=5 +val SCE_PLM_CONTROL=6 +val SCE_PLM_KEYWORD=7 +lex Progress=SCLEX_PROGRESS SCE_4GL_ +val SCE_4GL_DEFAULT=0 +val SCE_4GL_NUMBER=1 +val SCE_4GL_WORD=2 +val SCE_4GL_STRING=3 +val SCE_4GL_CHARACTER=4 +val SCE_4GL_PREPROCESSOR=5 +val SCE_4GL_OPERATOR=6 +val SCE_4GL_IDENTIFIER=7 +val SCE_4GL_BLOCK=8 +val SCE_4GL_END=9 +val SCE_4GL_COMMENT1=10 +val SCE_4GL_COMMENT2=11 +val SCE_4GL_COMMENT3=12 +val SCE_4GL_COMMENT4=13 +val SCE_4GL_COMMENT5=14 +val SCE_4GL_COMMENT6=15 +val SCE_4GL_DEFAULT_=16 +val SCE_4GL_NUMBER_=17 +val SCE_4GL_WORD_=18 +val SCE_4GL_STRING_=19 +val SCE_4GL_CHARACTER_=20 +val SCE_4GL_PREPROCESSOR_=21 +val SCE_4GL_OPERATOR_=22 +val SCE_4GL_IDENTIFIER_=23 +val SCE_4GL_BLOCK_=24 +val SCE_4GL_END_=25 +val SCE_4GL_COMMENT1_=26 +val SCE_4GL_COMMENT2_=27 +val SCE_4GL_COMMENT3_=28 +val SCE_4GL_COMMENT4_=29 +val SCE_4GL_COMMENT5_=30 +val SCE_4GL_COMMENT6_=31 # Events diff --git a/macosx/makefile b/macosx/makefile index eaf03d410..41c507124 100644 --- a/macosx/makefile +++ b/macosx/makefile @@ -31,7 +31,7 @@ ARCHFLAGS=-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 LDFLAGS=/usr/include/Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 endif -OPTIONS=-Wall -Wno-missing-braces -Wno-char-subscripts -DSCI_NAMESPACE -DMACOSX -DSCI_LEXER +OPTIONS=-Wall -Wno-missing-braces -Wno-char-subscripts -DSCI_NAMESPACE -DMACOSX -DSCI_LEXER #DEBUG = 1 @@ -59,9 +59,10 @@ LexCrontab.o LexCsound.o LexCSS.o LexD.o LexEiffel.o LexErlang.o LexEScript.o \ LexFlagship.o LexForth.o LexFortran.o LexGAP.o LexGui4Cli.o LexHaskell.o \ LexHTML.o LexInno.o LexKix.o LexLisp.o LexLout.o LexLua.o LexMatlab.o \ LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o LexNsis.o LexOpal.o LexOthers.o \ -LexPascal.o LexPB.o LexPerl.o LexPOV.o LexPS.o LexPython.o LexRebol.o \ -LexRuby.o LexScriptol.o LexSmalltalk.o LexSpecman.o LexSpice.o LexSQL.o \ -LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o +LexPascal.o LexPB.o LexPerl.o LexPLM.o LexPOV.o LexProgress.o LexPS.o \ +LexPython.o LexRebol.o LexRuby.o LexScriptol.o LexSmalltalk.o LexSpecman.o \ +LexSpice.o LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o \ +LexVHDL.o LexYAML.o #--Autogenerated -- end of automatically generated section # The LEXOBJS have to be treated specially as the functions in them are not called from external code diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 9c65b81d2..9921c4ccb 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -200,7 +200,9 @@ int Scintilla_LinkLexers() { LINK_LEXER(lmPerl); LINK_LEXER(lmPHP); LINK_LEXER(lmPHPSCRIPT); + LINK_LEXER(lmPLM); LINK_LEXER(lmPOV); + LINK_LEXER(lmProgress); LINK_LEXER(lmProps); LINK_LEXER(lmPS); LINK_LEXER(lmPureBasic); diff --git a/src/LexPLM.cxx b/src/LexPLM.cxx new file mode 100644 index 000000000..604850fbe --- /dev/null +++ b/src/LexPLM.cxx @@ -0,0 +1,198 @@ +// Copyright (c) 1990-2007, Scientific Toolworks, Inc. +// Author: Jason Haslam +// 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" +#include "StyleContext.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static void GetRange(unsigned int start, + unsigned int end, + Accessor &styler, + char *s, + unsigned int len) { + unsigned int i = 0; + while ((i < end - start + 1) && (i < len-1)) { + s[i] = static_cast<char>(tolower(styler[start + i])); + i++; + } + s[i] = '\0'; +} + +static void ColourisePlmDoc(unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) +{ + unsigned int endPos = startPos + length; + int state = initStyle; + + styler.StartAt(startPos); + styler.StartSegment(startPos); + + for (unsigned int i = startPos; i < endPos; i++) { + char ch = styler.SafeGetCharAt(i); + char chNext = styler.SafeGetCharAt(i + 1); + + if (state == SCE_PLM_DEFAULT) { + if (ch == '/' && chNext == '*') { + styler.ColourTo(i - 1, state); + state = SCE_PLM_COMMENT; + } else if (ch == '\'') { + styler.ColourTo(i - 1, state); + state = SCE_PLM_STRING; + } else if (isdigit(ch)) { + styler.ColourTo(i - 1, state); + state = SCE_PLM_NUMBER; + } else if (isalpha(ch)) { + styler.ColourTo(i - 1, state); + state = SCE_PLM_IDENTIFIER; + } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || + ch == '=' || ch == '<' || ch == '>' || ch == ':') { + styler.ColourTo(i - 1, state); + state = SCE_PLM_OPERATOR; + } else if (ch == '$') { + styler.ColourTo(i - 1, state); + state = SCE_PLM_CONTROL; + } + } else if (state == SCE_PLM_COMMENT) { + if (ch == '*' && chNext == '/') { + i++; + styler.ColourTo(i, state); + state = SCE_PLM_DEFAULT; + } + } else if (state == SCE_PLM_STRING) { + if (ch == '\'') { + if (chNext == '\'') { + i++; + } else { + styler.ColourTo(i, state); + state = SCE_PLM_DEFAULT; + } + } + } else if (state == SCE_PLM_NUMBER) { + if (!isdigit(ch) && !isalpha(ch) && ch != '$') { + i--; + styler.ColourTo(i, state); + state = SCE_PLM_DEFAULT; + } + } else if (state == SCE_PLM_IDENTIFIER) { + if (!isdigit(ch) && !isalpha(ch) && ch != '$') { + // Get the entire identifier. + char word[1024]; + int segmentStart = styler.GetStartSegment(); + GetRange(segmentStart, i - 1, styler, word, sizeof(word)); + + i--; + if (keywordlists[0]->InList(word)) + styler.ColourTo(i, SCE_PLM_KEYWORD); + else + styler.ColourTo(i, state); + state = SCE_PLM_DEFAULT; + } + } else if (state == SCE_PLM_OPERATOR) { + if (ch != '=' && ch != '>') { + i--; + styler.ColourTo(i, state); + state = SCE_PLM_DEFAULT; + } + } else if (state == SCE_PLM_CONTROL) { + if (ch == '\r' || ch == '\n') { + styler.ColourTo(i - 1, state); + state = SCE_PLM_DEFAULT; + } + } + } + styler.ColourTo(endPos - 1, state); +} + +static void FoldPlmDoc(unsigned int startPos, + int length, + int initStyle, + 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]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + int startKeyword = 0; + + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + + if (stylePrev != SCE_PLM_KEYWORD && style == SCE_PLM_KEYWORD) + startKeyword = i; + + if (style == SCE_PLM_KEYWORD && styleNext != SCE_PLM_KEYWORD) { + char word[1024]; + GetRange(startKeyword, i, styler, word, sizeof(word)); + + if (strcmp(word, "procedure") == 0 || strcmp(word, "do") == 0) + levelCurrent++; + else if (strcmp(word, "end") == 0) + levelCurrent--; + } + + if (foldComment) { + if (stylePrev != SCE_PLM_COMMENT && style == SCE_PLM_COMMENT) + levelCurrent++; + else if (stylePrev == SCE_PLM_COMMENT && style != SCE_PLM_COMMENT) + 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++; + } + + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char *const plmWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmPLM(SCLEX_PLM, ColourisePlmDoc, "PL/M", FoldPlmDoc, plmWordListDesc); diff --git a/src/LexProgress.cxx b/src/LexProgress.cxx new file mode 100644 index 000000000..3b3a44541 --- /dev/null +++ b/src/LexProgress.cxx @@ -0,0 +1,271 @@ +// Scintilla source code edit control +/** @file LexProgress.cxx + ** Lexer for Progress 4GL. + ** Based on LexCPP.cxx of Neil Hodgson <neilh@scintilla.org> + **/ +// Copyright 2006-2007 by Yuval Papish <Yuval@YuvCom.com> +// The License.txt file describes the conditions under which this software may be distributed. + +/** TODO: +WebSpeed support in html lexer +Support "end triggers" expression of the triggers phrase +change lmPS to lmProgress +Support more than 6 comments levels +**/ +#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" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsAWordChar(int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static inline bool IsAWordStart(int ch) { + return (ch < 0x80) && (isalpha(ch) || ch == '_'); +} + +enum SentenceStart { SetSentenceStart = 0xf, ResetSentenceStart = 0x10}; // true -> bit = 0 + +static void Colourise4glDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords1 = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + //WordList &keywords4 = *keywordlists[3]; + //WordList &keywords5 = *keywordlists[4]; + + int visibleChars = 0; + int mask; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.atLineStart) { + // Reset states to begining of colourise so no surprises + // if different sets of lines lexed. + visibleChars = 0; + } + + // Handle line continuation generically. + if (sc.ch == '~') { + // Skip whitespace between ~ and EOL + /* do { + sc.Forward(); + } */ + while ((sc.chNext == ' ' || sc.chNext == '\t') ) { + sc.Forward(); + sc.More(); + } + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + sc.Forward(); + continue; + } + } + // Determine if a new state should be terminated. + mask = sc.state & 0x10; + switch (sc.state & 0xf) { + case SCE_4GL_OPERATOR: + sc.SetState(SCE_4GL_DEFAULT | mask); + break; + case SCE_4GL_NUMBER: + if (!(IsADigit(sc.ch))) { + sc.SetState(SCE_4GL_DEFAULT | mask); + } + break; + case SCE_4GL_IDENTIFIER: + if (!IsAWordChar(sc.ch) && sc.ch != '-') { + char s[1000]; + sc.GetCurrentLowered(s, sizeof(s)); + if (((sc.state & 0x10) == 0) && keywords2.InList(s) || keywords3.InList(s)) { + sc.ChangeState(SCE_4GL_BLOCK | ResetSentenceStart); + } + else if (keywords1.InList(s)) { + if ((s[0] == 'e' && s[1] =='n' && s[2] == 'd' && !isalnum(s[3]) && s[3] != '-') || + (s[0] == 'f' && s[1] =='o' && s[2] == 'r' && s[3] == 'w' && s[4] =='a' && s[5] == 'r' && s[6] == 'd'&& !isalnum(s[7]))) { + sc.ChangeState(SCE_4GL_END | ResetSentenceStart); + } + else if ((s[0] == 'e' && s[1] =='l' && s[2] == 's' && s[3] == 'e') || + (s[0] == 't' && s[1] =='h' && s[2] == 'e' && s[3] == 'n')) { + sc.ChangeState(SCE_4GL_WORD & SetSentenceStart); + } + else { + sc.ChangeState(SCE_4GL_WORD | ResetSentenceStart); + } + } + sc.SetState(SCE_4GL_DEFAULT | (sc.state & 0x10)); + } + break; + case SCE_4GL_PREPROCESSOR: + if (sc.atLineStart) { + sc.SetState(SCE_4GL_DEFAULT & SetSentenceStart); + } else if (sc.ch == '*' && sc.chNext == '/') { + sc.ForwardSetState(SCE_4GL_DEFAULT | mask); + } + break; + case SCE_4GL_STRING: + if (sc.ch == '\"') { + sc.ForwardSetState(SCE_4GL_DEFAULT | mask); + } + break; + case SCE_4GL_CHARACTER: + if (sc.ch == '\'') { + sc.ForwardSetState(SCE_4GL_DEFAULT | mask); + } + break; + default: + if ((sc.state & 0xf) >= SCE_4GL_COMMENT1) { + if (sc.ch == '*' && sc.chNext == '/') { + sc.Forward(); + if ((sc.state & 0xf) == SCE_4GL_COMMENT1) { + sc.ForwardSetState(SCE_4GL_DEFAULT | mask); + } + else + sc.SetState((sc.state & 0x1f) - 1); + } else if (sc.ch == '/' && sc.chNext == '*') { + sc.Forward(); + sc.SetState((sc.state & 0x1f) + 1); + } + } + } + + // Determine if a new state should be entered. + mask = sc.state & 0x10; + if ((sc.state & 0xf) == SCE_4GL_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_4GL_NUMBER | ResetSentenceStart); + } else if (IsAWordStart(sc.ch) || (sc.ch == '@')) { + sc.SetState(SCE_4GL_IDENTIFIER | mask); + } else if (sc.ch == '/' && sc.chNext == '*') { + sc.SetState(SCE_4GL_COMMENT1 | mask); + sc.Forward(); + } else if (sc.ch == '\"') { + sc.SetState(SCE_4GL_STRING | ResetSentenceStart); + } else if (sc.ch == '\'') { + sc.SetState(SCE_4GL_CHARACTER | ResetSentenceStart); + } else if (sc.ch == '&' && visibleChars == 0 && ((sc.state & 0x10) == 0)) { + sc.SetState(SCE_4GL_PREPROCESSOR | ResetSentenceStart); + // Skip whitespace between & and preprocessor word + do { + sc.Forward(); + } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More()); + // Handle syntactical line termination + } else if ((sc.ch == '.' || sc.ch == ':' || sc.ch == '}') && (sc.chNext == ' ' || sc.chNext == '\t' || sc.chNext == '\n' || sc.chNext == '\r')) { + sc.SetState(sc.state & SetSentenceStart); + } else if (isoperator(static_cast<char>(sc.ch))) { + if (sc.ch == ':') + sc.SetState(SCE_4GL_OPERATOR & SetSentenceStart); + else + sc.SetState(SCE_4GL_OPERATOR | ResetSentenceStart); + } + } + + if (!IsASpace(sc.ch)) { + visibleChars++; + } + } + sc.Complete(); +} + +static bool IsStreamCommentStyle(int style) { + return (style & 0xf) >= SCE_4GL_COMMENT1 ; +} + +// Store both the current line's fold level and the next lines in the +// level store to make it easy to pick up with each increment +// and to make it possible to fiddle the current level for "} else {". +static void FoldNoBox4glDoc(unsigned int startPos, int length, int initStyle, + Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelMinCurrent = levelCurrent; + int levelNext = levelCurrent; + char chNext = static_cast<char>(tolower(styler[startPos])); + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = static_cast<char>(tolower(styler.SafeGetCharAt(i + 1))); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment && IsStreamCommentStyle(style)) { + if (!IsStreamCommentStyle(stylePrev)) { + levelNext++; + } else if (!IsStreamCommentStyle(styleNext)) { // && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelNext--; + } + } + else if ((style & 0xf) == SCE_4GL_BLOCK && !isalnum(chNext)) { + levelNext++; + } + else if ((style & 0xf) == SCE_4GL_END && (ch == 'e' || ch == 'f')) { + levelNext--; + } + if (atEOL) { + int levelUse = levelCurrent; + if (foldAtElse) { + levelUse = levelMinCurrent; + } + int lev = levelUse | levelNext << 16; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelCurrent = levelNext; + levelMinCurrent = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + } +} + +static void Fold4glDoc(unsigned int startPos, int length, int initStyle, WordList *[], + Accessor &styler) { + FoldNoBox4glDoc(startPos, length, initStyle, styler); +} + +static const char * const FglWordLists[] = { + "Primary keywords and identifiers", + "Secondary keywords and identifiers", + "Documentation comment keywords", + "Unused", + "Global classes and typedefs", + 0, + }; + +LexerModule lmProgress(SCLEX_PS, Colourise4glDoc, "progress", Fold4glDoc, FglWordLists); diff --git a/vcbuild/SciLexer.dsp b/vcbuild/SciLexer.dsp index 015835908..1d9eb2f7f 100644 --- a/vcbuild/SciLexer.dsp +++ b/vcbuild/SciLexer.dsp @@ -326,10 +326,18 @@ SOURCE=..\src\LexPerl.cxx # End Source File # Begin Source File +SOURCE=..\src\LexPLM.cxx +# End Source File +# Begin Source File + SOURCE=..\src\LexPOV.cxx # End Source File # Begin Source File +SOURCE=..\src\LexProgress.cxx +# End Source File +# Begin Source File + SOURCE=..\src\LexPS.cxx # End Source File # Begin Source File diff --git a/win32/makefile b/win32/makefile index 63b30dd56..ada43f7ad 100644 --- a/win32/makefile +++ b/win32/makefile @@ -57,9 +57,10 @@ LexCrontab.o LexCsound.o LexCSS.o LexD.o LexEiffel.o LexErlang.o LexEScript.o \ LexFlagship.o LexForth.o LexFortran.o LexGAP.o LexGui4Cli.o LexHaskell.o \ LexHTML.o LexInno.o LexKix.o LexLisp.o LexLout.o LexLua.o LexMatlab.o \ LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o LexNsis.o LexOpal.o LexOthers.o \ -LexPascal.o LexPB.o LexPerl.o LexPOV.o LexPS.o LexPython.o LexRebol.o \ -LexRuby.o LexScriptol.o LexSmalltalk.o LexSpecman.o LexSpice.o LexSQL.o \ -LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o +LexPascal.o LexPB.o LexPerl.o LexPLM.o LexPOV.o LexProgress.o LexPS.o \ +LexPython.o LexRebol.o LexRuby.o LexScriptol.o LexSmalltalk.o LexSpecman.o \ +LexSpice.o LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o \ +LexVHDL.o LexYAML.o #--Autogenerated -- end of automatically generated section SOBJS = ScintillaWin.o ScintillaBase.o Editor.o CharClassify.o Decoration.o \ diff --git a/win32/scintilla.mak b/win32/scintilla.mak index b6b4749ef..f19254df6 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -158,7 +158,9 @@ LEXOBJS=\ $(DIR_O)\LexPascal.obj \ $(DIR_O)\LexPB.obj \ $(DIR_O)\LexPerl.obj \ + $(DIR_O)\LexPLM.obj \ $(DIR_O)\LexPOV.obj \ + $(DIR_O)\LexProgress.obj \ $(DIR_O)\LexPS.obj \ $(DIR_O)\LexPython.obj \ $(DIR_O)\LexRebol.obj \ @@ -388,8 +390,12 @@ $(DIR_O)\LexPB.obj: ..\src\LexPB.cxx $(LEX_HEADERS) $(DIR_O)\LexPerl.obj: ..\src\LexPerl.cxx $(LEX_HEADERS) +$(DIR_O)\LexPLM.obj: ..\src\LexPLM.cxx $(LEX_HEADERS) + $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexProgress.obj: ..\src\LexProgress.cxx $(LEX_HEADERS) + $(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) $(DIR_O)\LexPython.obj: ..\src\LexPython.cxx $(LEX_HEADERS) diff --git a/win32/scintilla_vc6.mak b/win32/scintilla_vc6.mak index 9b9c9b356..bfba439c1 100644 --- a/win32/scintilla_vc6.mak +++ b/win32/scintilla_vc6.mak @@ -160,7 +160,9 @@ LEXOBJS=\ $(DIR_O)\LexPascal.obj \ $(DIR_O)\LexPB.obj \ $(DIR_O)\LexPerl.obj \ + $(DIR_O)\LexPLM.obj \ $(DIR_O)\LexPOV.obj \ + $(DIR_O)\LexProgress.obj \ $(DIR_O)\LexPS.obj \ $(DIR_O)\LexPython.obj \ $(DIR_O)\LexRebol.obj \ @@ -390,8 +392,12 @@ $(DIR_O)\LexPB.obj: ..\src\LexPB.cxx $(LEX_HEADERS) $(DIR_O)\LexPerl.obj: ..\src\LexPerl.cxx $(LEX_HEADERS) +$(DIR_O)\LexPLM.obj: ..\src\LexPLM.cxx $(LEX_HEADERS) + $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexProgress.obj: ..\src\LexProgress.cxx $(LEX_HEADERS) + $(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) $(DIR_O)\LexPython.obj: ..\src\LexPython.cxx $(LEX_HEADERS) |