diff options
| author | nyamatongwe <unknown> | 2003-07-21 00:24:46 +0000 | 
|---|---|---|
| committer | nyamatongwe <unknown> | 2003-07-21 00:24:46 +0000 | 
| commit | 6cd6c9325db26c112d542133b68ba61cf36f5e45 (patch) | |
| tree | d05e9663190b6227b7e39ba16a0d7c404bd5128c | |
| parent | 0bd93b34f51760d0c15b989bb8f57d87dc58aba9 (diff) | |
| download | scintilla-mirror-6cd6c9325db26c112d542133b68ba61cf36f5e45.tar.gz | |
Added PostScript lexer from Nigel Hathaway.
| -rw-r--r-- | gtk/makefile | 2 | ||||
| -rw-r--r-- | gtk/scintilla.mak | 3 | ||||
| -rw-r--r-- | include/SciLexer.h | 17 | ||||
| -rw-r--r-- | include/Scintilla.iface | 19 | ||||
| -rw-r--r-- | src/KeyWords.cxx | 1 | ||||
| -rw-r--r-- | src/LexPS.cxx | 343 | ||||
| -rw-r--r-- | win32/makefile | 2 | ||||
| -rw-r--r-- | win32/scintilla.mak | 3 | ||||
| -rw-r--r-- | win32/scintilla_vc6.mak | 3 | 
9 files changed, 391 insertions, 2 deletions
| diff --git a/gtk/makefile b/gtk/makefile index 041e9d8c4..9206be86e 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -51,7 +51,7 @@ LEXOBJS=\  LexAda.o LexAsm.o LexAVE.o LexBaan.o LexBullant.o LexConf.o LexCPP.o \  LexCrontab.o LexCSS.o LexEiffel.o LexEScript.o LexFortran.o LexHTML.o \  LexLisp.o LexLout.o LexLua.o LexMatlab.o LexOthers.o LexPascal.o LexPerl.o \ -LexPOV.o LexPython.o LexRuby.o LexSQL.o LexVB.o  +LexPOV.o LexPS.o LexPython.o LexRuby.o LexSQL.o LexVB.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/gtk/scintilla.mak b/gtk/scintilla.mak index 42a282246..b171986d5 100644 --- a/gtk/scintilla.mak +++ b/gtk/scintilla.mak @@ -141,6 +141,7 @@ LEXOBJS=\  	$(DIR_O)\LexPascal.obj \  	$(DIR_O)\LexPerl.obj \  	$(DIR_O)\LexPOV.obj \ +	$(DIR_O)\LexPS.obj \  	$(DIR_O)\LexPython.obj \  	$(DIR_O)\LexRuby.obj \  	$(DIR_O)\LexSQL.obj \ @@ -299,6 +300,8 @@ $(DIR_O)\LexPerl.obj: ..\src\LexPerl.cxx $(LEX_HEADERS)  $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) +  $(DIR_O)\LexPython.obj: ..\src\LexPython.cxx $(LEX_HEADERS)  $(DIR_O)\LexRuby.obj: ..\src\LexRuby.cxx $(LEX_HEADERS) diff --git a/include/SciLexer.h b/include/SciLexer.h index edf4bd0d2..edf63c4f1 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -56,6 +56,7 @@  #define SCLEX_POV 39  #define SCLEX_LOUT 40  #define SCLEX_ESCRIPT 41 +#define SCLEX_PS 42  #define SCLEX_AUTOMATIC 1000  #define SCE_P_DEFAULT 0  #define SCE_P_COMMENTLINE 1 @@ -486,6 +487,22 @@  #define SCE_ESCRIPT_BRACE 9  #define SCE_ESCRIPT_WORD2 10  #define SCE_ESCRIPT_WORD3 11 +#define SCE_PS_DEFAULT 0 +#define SCE_PS_COMMENT 1 +#define SCE_PS_DSC_COMMENT 2 +#define SCE_PS_DSC_VALUE 3 +#define SCE_PS_NUMBER 4 +#define SCE_PS_NAME 5 +#define SCE_PS_KEYWORD 6 +#define SCE_PS_LITERAL 7 +#define SCE_PS_IMMEVAL 8 +#define SCE_PS_PAREN_ARRAY 9 +#define SCE_PS_PAREN_DICT 10 +#define SCE_PS_PAREN_PROC 11 +#define SCE_PS_TEXT 12 +#define SCE_PS_HEXSTRING 13 +#define SCE_PS_BASE85STRING 14 +#define SCE_PS_BADSTRINGCHAR 15  //--Autogenerated -- end of section automatically generated from Scintilla.iface  #endif diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 884c3d863..0923e7910 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1584,6 +1584,7 @@ val SCLEX_CSS=38  val SCLEX_POV=39  val SCLEX_LOUT=40  val SCLEX_ESCRIPT=41 +val SCLEX_PS=42  # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a  # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -2093,6 +2094,24 @@ val SCE_ESCRIPT_IDENTIFIER=8  val SCE_ESCRIPT_BRACE=9  val SCE_ESCRIPT_WORD2=10  val SCE_ESCRIPT_WORD3=11 +# Lexical states for SCLEX_PS +lex PS=SCLEX_PS SCE_PS_ +val SCE_PS_DEFAULT=0 +val SCE_PS_COMMENT=1 +val SCE_PS_DSC_COMMENT=2 +val SCE_PS_DSC_VALUE=3 +val SCE_PS_NUMBER=4 +val SCE_PS_NAME=5 +val SCE_PS_KEYWORD=6 +val SCE_PS_LITERAL=7 +val SCE_PS_IMMEVAL=8 +val SCE_PS_PAREN_ARRAY=9 +val SCE_PS_PAREN_DICT=10 +val SCE_PS_PAREN_PROC=11 +val SCE_PS_TEXT=12 +val SCE_PS_HEXSTRING=13 +val SCE_PS_BASE85STRING=14 +val SCE_PS_BADSTRINGCHAR=15  # Events diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 8fb51bdb7..9a2ff0903 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -163,6 +163,7 @@ int Scintilla_LinkLexers() {  	LINK_LEXER(lmPascal);  	LINK_LEXER(lmPerl);  	LINK_LEXER(lmPOV); +	LINK_LEXER(lmPS);  	LINK_LEXER(lmPython);  	LINK_LEXER(lmRuby);  	LINK_LEXER(lmSQL); diff --git a/src/LexPS.cxx b/src/LexPS.cxx new file mode 100644 index 000000000..d73a190e9 --- /dev/null +++ b/src/LexPS.cxx @@ -0,0 +1,343 @@ +// Scintilla source code edit control +/** @file LexPS.cxx + ** Lexer for PostScript + ** + ** Written by Nigel Hathaway. + **/ + +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <stdarg.h> +#include <stdio.h> +#include <fcntl.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 IsASelfDelimitingChar(const int ch) { +    return (ch == '[' || ch == ']' || ch == '{' || ch == '}' || +            ch == '/' || ch == '<' || ch == '>' || +            ch == '(' || ch == ')' || ch == '%'); +} + +static inline bool IsAWhitespaceChar(const int ch) { +    return (ch == ' '  || ch == '\t' || ch == '\r' || +            ch == '\n' || ch == '\f' || ch == '\0'); +} + +static bool IsABaseNDigit(const int ch, const int base) { +    int maxdig = '9'; +    int letterext = -1; + +    if (base <= 10) +        maxdig = '0' + base - 1; +    else +        letterext = base - 11; + +    return ((ch >= '0' && ch <= maxdig) || +            (ch >= 'A' && ch <= ('A' + letterext)) || +            (ch >= 'a' && ch <= ('a' + letterext))); +} + +static inline bool IsABase85Char(const int ch) { +    return ((ch >= '!' && ch <= 'u') || ch == 'z'); +} + +static void ColourisePSDoc( +    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]; + +    StyleContext sc(startPos, length, initStyle, styler); +    +    bool tokenizing = styler.GetPropertyInt("ps.tokenize") != 0; +    int pslevel = styler.GetPropertyInt("ps.level", 3); +    int lineCurrent = styler.GetLine(startPos); +    int nestTextCurrent = 0; +    if (lineCurrent > 0 && initStyle == SCE_PS_TEXT) +        nestTextCurrent = styler.GetLineState(lineCurrent - 1); +    int numRadix = 0; +    bool numHasPoint = false; +    bool numHasExponent = false; +    bool numHasSign = false; + +    // Clear out existing tokenization +    if (tokenizing && length > 0) { +        styler.StartAt(startPos, static_cast<char>(INDIC2_MASK)); +        styler.ColourTo(startPos + length-1, 0); +        styler.Flush(); +        styler.StartAt(startPos); +        styler.StartSegment(startPos); +    } + +    for (; sc.More(); sc.Forward()) { +        if (sc.atLineStart) +            lineCurrent = styler.GetLine(sc.currentPos); + +        // Determine if the current state should terminate. +        if (sc.state == SCE_PS_COMMENT || sc.state == SCE_PS_DSC_VALUE) { +            if (sc.atLineEnd) { +                sc.SetState(SCE_C_DEFAULT); +            } +        } else if (sc.state == SCE_PS_DSC_COMMENT) { +            if (sc.ch == ':') { +                sc.Forward(); +                if (!sc.atLineEnd) +                    sc.SetState(SCE_PS_DSC_VALUE); +                else +                    sc.SetState(SCE_C_DEFAULT); +            } else if (sc.atLineEnd) { +                sc.SetState(SCE_C_DEFAULT); +            } else if (IsAWhitespaceChar(sc.ch)) { +                sc.ChangeState(SCE_PS_COMMENT); +            } +        } else if (sc.state == SCE_PS_NUMBER) { +            if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) { +                if ((sc.chPrev == '+' || sc.chPrev == '-' || +                     sc.chPrev == 'E' || sc.chPrev == 'e') && numRadix == 0) +                    sc.ChangeState(SCE_PS_NAME); +                sc.SetState(SCE_C_DEFAULT); +            } else if (sc.ch == '#') { +                if (numHasPoint || numHasExponent || numHasSign || numRadix != 0) { +                    sc.ChangeState(SCE_PS_NAME); +                } else { +                    char szradix[5]; +                    sc.GetCurrent(szradix, 4); +                    numRadix = atoi(szradix); +                    if (numRadix < 2 || numRadix > 36) +                        sc.ChangeState(SCE_PS_NAME); +                } +            } else if ((sc.ch == 'E' || sc.ch == 'e') && numRadix == 0) { +                if (numHasExponent) { +                    sc.ChangeState(SCE_PS_NAME); +                } else { +                    numHasExponent = true; +                    if (sc.chNext == '+' || sc.chNext == '-') +                        sc.Forward(); +                } +            } else if (sc.ch == '.') { +                if (numHasPoint || numHasExponent || numRadix != 0) { +                    sc.ChangeState(SCE_PS_NAME); +                } else { +                    numHasPoint = true; +                } +            } else if (numRadix == 0) { +                if (!IsABaseNDigit(sc.ch, 10)) +                    sc.ChangeState(SCE_PS_NAME); +            } else { +                if (!IsABaseNDigit(sc.ch, numRadix)) +                    sc.ChangeState(SCE_PS_NAME); +            } +        } else if (sc.state == SCE_PS_NAME || sc.state == SCE_PS_KEYWORD) { +            if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) { +                char s[100]; +                sc.GetCurrent(s, sizeof(s)); +                if ((pslevel >= 1 && keywords1.InList(s)) || +                    (pslevel >= 2 && keywords2.InList(s)) || +                    (pslevel >= 3 && keywords3.InList(s)) || +                    keywords4.InList(s) || keywords5.InList(s)) { +                    sc.ChangeState(SCE_PS_KEYWORD); +                } +                sc.SetState(SCE_C_DEFAULT); +            } +        } else if (sc.state == SCE_PS_LITERAL || sc.state == SCE_PS_IMMEVAL) { +            if (IsASelfDelimitingChar(sc.ch) || IsAWhitespaceChar(sc.ch)) +                sc.SetState(SCE_C_DEFAULT); +        } else if (sc.state == SCE_PS_PAREN_ARRAY || sc.state == SCE_PS_PAREN_DICT || +                   sc.state == SCE_PS_PAREN_PROC) { +            sc.SetState(SCE_C_DEFAULT); +        } else if (sc.state == SCE_PS_TEXT) { +            if (sc.ch == '(') { +                nestTextCurrent++; +            } else if (sc.ch == ')') { +                if (--nestTextCurrent == 0) +                   sc.ForwardSetState(SCE_PS_DEFAULT); +            } else if (sc.ch == '\\') { +                sc.Forward(); +            } +        } else if (sc.state == SCE_PS_HEXSTRING) { +            if (sc.ch == '>') { +                sc.ForwardSetState(SCE_PS_DEFAULT); +            } else if (!IsABaseNDigit(sc.ch, 16) && !IsAWhitespaceChar(sc.ch)) { +                sc.SetState(SCE_PS_HEXSTRING); +                styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR); +            } +        } else if (sc.state == SCE_PS_BASE85STRING) { +            if (sc.Match('~', '>')) { +                sc.Forward(); +                sc.ForwardSetState(SCE_PS_DEFAULT); +            } else if (!IsABase85Char(sc.ch) && !IsAWhitespaceChar(sc.ch)) { +                sc.SetState(SCE_PS_BASE85STRING); +                styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR); +            } +        } + +        // Determine if a new state should be entered. +        if (sc.state == SCE_C_DEFAULT) { +            unsigned int tokenpos = sc.currentPos; + +            if (sc.ch == '[' || sc.ch == ']') { +                sc.SetState(SCE_PS_PAREN_ARRAY); +            } else if (sc.ch == '{' || sc.ch == '}') { +                sc.SetState(SCE_PS_PAREN_PROC); +            } else if (sc.ch == '/') { +                if (sc.chNext == '/') { +                    sc.SetState(SCE_PS_IMMEVAL); +                    sc.Forward(); +                } else { +                    sc.SetState(SCE_PS_LITERAL); +                } +            } else if (sc.ch == '<') { +                if (sc.chNext == '<') { +                    sc.SetState(SCE_PS_PAREN_DICT); +                    sc.Forward(); +                } else if (sc.chNext == '~') { +                    sc.SetState(SCE_PS_BASE85STRING); +                    sc.Forward(); +                } else { +                    sc.SetState(SCE_PS_HEXSTRING); +                } +            } else if (sc.ch == '>' && sc.chNext == '>') { +                    sc.SetState(SCE_PS_PAREN_DICT); +                    sc.Forward(); +            } else if (sc.ch == '>' || sc.ch == ')') { +                sc.SetState(SCE_C_DEFAULT); +                styler.ColourTo(sc.currentPos, SCE_PS_BADSTRINGCHAR); +            } else if (sc.ch == '(') { +                sc.SetState(SCE_PS_TEXT); +                nestTextCurrent = 1; +            } else if (sc.ch == '%') { +                if (sc.chNext == '%' && sc.atLineStart) { +                    sc.SetState(SCE_PS_DSC_COMMENT); +                    sc.Forward(); +                    if (sc.chNext == '+') { +                        sc.Forward(); +                        sc.ForwardSetState(SCE_PS_DSC_VALUE); +                    } +                } else { +                    sc.SetState(SCE_PS_COMMENT); +                } +            } else if ((sc.ch == '+' || sc.ch == '-' || sc.ch == '.') && +                       IsABaseNDigit(sc.chNext, 10)) { +                sc.SetState(SCE_PS_NUMBER); +                numRadix = 0; +                numHasPoint = (sc.ch == '.'); +                numHasExponent = false; +                numHasSign = (sc.ch == '+' || sc.ch == '-'); +            } else if ((sc.ch == '+' || sc.ch == '-') && sc.chNext == '.' && +                       IsABaseNDigit(sc.GetRelative(2), 10)) { +                sc.SetState(SCE_PS_NUMBER); +                numRadix = 0; +                numHasPoint = false; +                numHasExponent = false; +                numHasSign = true; +            } else if (IsABaseNDigit(sc.ch, 10)) { +                sc.SetState(SCE_PS_NUMBER); +                numRadix = 0; +                numHasPoint = false; +                numHasExponent = false; +                numHasSign = false; +            } else if (!IsAWhitespaceChar(sc.ch)) { +                sc.SetState(SCE_PS_NAME); +            } + +            // Mark the start of tokens +            if (tokenizing && sc.state != SCE_C_DEFAULT && sc.state != SCE_PS_COMMENT && +                sc.state != SCE_PS_DSC_COMMENT && sc.state != SCE_PS_DSC_VALUE) { +                styler.Flush(); +                styler.StartAt(tokenpos, static_cast<char>(INDIC2_MASK)); +                styler.ColourTo(tokenpos, INDIC2_MASK); +                styler.Flush(); +                styler.StartAt(tokenpos); +                styler.StartSegment(tokenpos); +            } +        } + +        if (sc.atLineEnd) +            styler.SetLineState(lineCurrent, nestTextCurrent); +    } + +    sc.Complete(); +} + +static void FoldPSDoc(unsigned int startPos, int length, int initStyle, WordList *[], +                       Accessor &styler) { +    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 = styler[startPos]; +    int styleNext = styler.StyleAt(startPos); +    int style = initStyle; +    for (unsigned int i = startPos; i < endPos; i++) { +        char ch = chNext; +        chNext = styler.SafeGetCharAt(i + 1); +        style = styleNext; +        styleNext = styler.StyleAt(i + 1); +        bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');  //mac?? +        if ((style & 31) == SCE_PS_PAREN_PROC) { +            if (ch == '{') { +                // Measure the minimum before a '{' to allow +                // folding on "} {" +                if (levelMinCurrent > levelNext) { +                    levelMinCurrent = levelNext; +                } +                levelNext++; +            } else if (ch == '}') { +                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 const char * const psWordListDesc[] = { +    "PS Level 1 operators", +    "PS Level 2 operators", +    "PS Level 3 operators", +    "RIP-specific operators", +    "User-defined operators", +    0 +}; + +LexerModule lmPS(SCLEX_PS, ColourisePSDoc, "ps", FoldPSDoc, psWordListDesc); diff --git a/win32/makefile b/win32/makefile index 44852d116..08d4060ea 100644 --- a/win32/makefile +++ b/win32/makefile @@ -49,7 +49,7 @@ LEXOBJS=\  LexAda.o LexAsm.o LexAVE.o LexBaan.o LexBullant.o LexConf.o LexCPP.o \  LexCrontab.o LexCSS.o LexEiffel.o LexEScript.o LexFortran.o LexHTML.o \  LexLisp.o LexLout.o LexLua.o LexMatlab.o LexOthers.o LexPascal.o LexPerl.o \ -LexPOV.o LexPython.o LexRuby.o LexSQL.o LexVB.o  +LexPOV.o LexPS.o LexPython.o LexRuby.o LexSQL.o LexVB.o   #--Autogenerated -- end of automatically generated section  SOBJS	= ScintillaWin.o ScintillaBase.o Editor.o Document.o \ diff --git a/win32/scintilla.mak b/win32/scintilla.mak index 20d6ff71f..963de50c3 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -130,6 +130,7 @@ LEXOBJS=\  	$(DIR_O)\LexPascal.obj \  	$(DIR_O)\LexPerl.obj \  	$(DIR_O)\LexPOV.obj \ +	$(DIR_O)\LexPS.obj \  	$(DIR_O)\LexPython.obj \  	$(DIR_O)\LexRuby.obj \  	$(DIR_O)\LexSQL.obj \ @@ -285,6 +286,8 @@ $(DIR_O)\LexPerl.obj: ..\src\LexPerl.cxx $(LEX_HEADERS)  $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) +  $(DIR_O)\LexPython.obj: ..\src\LexPython.cxx $(LEX_HEADERS)  $(DIR_O)\LexRuby.obj: ..\src\LexRuby.cxx $(LEX_HEADERS) diff --git a/win32/scintilla_vc6.mak b/win32/scintilla_vc6.mak index ef707e44d..febcc997b 100644 --- a/win32/scintilla_vc6.mak +++ b/win32/scintilla_vc6.mak @@ -132,6 +132,7 @@ LEXOBJS=\  	$(DIR_O)\LexPascal.obj \  	$(DIR_O)\LexPerl.obj \  	$(DIR_O)\LexPOV.obj \ +	$(DIR_O)\LexPS.obj \  	$(DIR_O)\LexPython.obj \  	$(DIR_O)\LexRuby.obj \  	$(DIR_O)\LexSQL.obj \ @@ -287,6 +288,8 @@ $(DIR_O)\LexPerl.obj: ..\src\LexPerl.cxx $(LEX_HEADERS)  $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) +  $(DIR_O)\LexPython.obj: ..\src\LexPython.cxx $(LEX_HEADERS)  $(DIR_O)\LexRuby.obj: ..\src\LexRuby.cxx $(LEX_HEADERS) | 
