diff options
| -rw-r--r-- | doc/ScintillaHistory.html | 1 | ||||
| -rw-r--r-- | gtk/makefile | 4 | ||||
| -rw-r--r-- | gtk/scintilla.mak | 3 | ||||
| -rw-r--r-- | include/SciLexer.h | 10 | ||||
| -rw-r--r-- | include/Scintilla.iface | 12 | ||||
| -rw-r--r-- | src/KeyWords.cxx | 1 | ||||
| -rw-r--r-- | src/LexSpice.cxx | 221 | ||||
| -rw-r--r-- | win32/makefile | 4 | ||||
| -rw-r--r-- | win32/scintilla.mak | 3 | ||||
| -rw-r--r-- | win32/scintilla_vc6.mak | 3 | 
10 files changed, 258 insertions, 4 deletions
| diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index f94f64405..e7d7356a5 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -218,6 +218,7 @@  	<li>Andre Arpin</li>  	<li>Stanislav Maslovski</li>  	<li>Martin Stone</li> +	<li>Fabien Proriol</li>      </ul>      <p>         Images used in GTK+ version diff --git a/gtk/makefile b/gtk/makefile index 4cc684c10..d88a4e33b 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -70,8 +70,8 @@ LexForth.o LexFortran.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 LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o \ -LexVHDL.o LexYAML.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 51521a7cf..ad2d3fc4e 100644 --- a/gtk/scintilla.mak +++ b/gtk/scintilla.mak @@ -190,6 +190,7 @@ LEXOBJS=\  	$(DIR_O)\LexScriptol.obj \  	$(DIR_O)\LexSmalltalk.obj \  	$(DIR_O)\LexSpecman.obj \ +	$(DIR_O)\LexSpice.obj \  	$(DIR_O)\LexSQL.obj \  	$(DIR_O)\LexTADS3.obj \  	$(DIR_O)\LexTCL.obj \ @@ -418,6 +419,8 @@ $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS)  $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) +$(DIR_O)\LexSpice.obj: ..\src\LexSpice.cxx $(LEX_HEADERS) +  $(DIR_O)\LexSQL.obj: ..\src\LexSQL.cxx $(LEX_HEADERS)  $(DIR_O)\LexTADS3.obj: ..\src\LexTADS3.cxx $(LEX_HEADERS) diff --git a/include/SciLexer.h b/include/SciLexer.h index 8d38c2cac..b2a07127b 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -90,6 +90,7 @@  #define SCLEX_FREEBASIC 75  #define SCLEX_INNOSETUP 76  #define SCLEX_OPAL 77 +#define SCLEX_SPICE 78  #define SCLEX_AUTOMATIC 1000  #define SCE_P_DEFAULT 0  #define SCE_P_COMMENTLINE 1 @@ -1056,6 +1057,15 @@  #define SCE_OPAL_PAR 7  #define SCE_OPAL_BOOL_CONST 8  #define SCE_OPAL_DEFAULT 32 +#define SCE_SPICE_DEFAULT 0 +#define SCE_SPICE_IDENTIFIER 1 +#define SCE_SPICE_KEYWORD 2 +#define SCE_SPICE_KEYWORD2 3 +#define SCE_SPICE_KEYWORD3 4 +#define SCE_SPICE_NUMBER 5 +#define SCE_SPICE_DELIMITER 6 +#define SCE_SPICE_VALUE 7 +#define SCE_SPICE_COMMENTLINE 8  #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 5f2f2ab5a..19fb36a68 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1835,6 +1835,7 @@ val SCLEX_CSOUND=74  val SCLEX_FREEBASIC=75  val SCLEX_INNOSETUP=76  val SCLEX_OPAL=77 +val SCLEX_SPICE=78  # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a  # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -2944,6 +2945,17 @@ val SCE_OPAL_STRING=6  val SCE_OPAL_PAR=7  val SCE_OPAL_BOOL_CONST=8  val SCE_OPAL_DEFAULT=32 +# Lexical states for SCLEX_SPICE +lex Spice=SCLEX_SPICE SCE_SPICE_ +val SCE_SPICE_DEFAULT=0 +val SCE_SPICE_IDENTIFIER=1 +val SCE_SPICE_KEYWORD=2 +val SCE_SPICE_KEYWORD2=3 +val SCE_SPICE_KEYWORD3=4 +val SCE_SPICE_NUMBER=5 +val SCE_SPICE_DELIMITER=6 +val SCE_SPICE_VALUE=7 +val SCE_SPICE_COMMENTLINE=8  # Events diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 322a8d84c..f82eb7df6 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -203,6 +203,7 @@ int Scintilla_LinkLexers() {  	LINK_LEXER(lmScriptol);  	LINK_LEXER(lmSmalltalk);  	LINK_LEXER(lmSpecman); +	LINK_LEXER(lmSpice);  	LINK_LEXER(lmSQL);  	LINK_LEXER(lmTADS3);  	LINK_LEXER(lmTCL); diff --git a/src/LexSpice.cxx b/src/LexSpice.cxx new file mode 100644 index 000000000..819fa75af --- /dev/null +++ b/src/LexSpice.cxx @@ -0,0 +1,221 @@ +// Scintilla source code edit control +/** @file LexSpice.cxx + ** Lexer for Spice + **/ +// Copyright 2006 by Fabien Proriol <proriol.fabien.dev@saint-pal.com> +// The License.txt file describes the conditions under which this software may be distributed. + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#include <stdio.h> + +#include "Platform.h" + +#include "Accessor.h" +#include "StyleContext.h" +#include "PropSet.h" +#include "KeyWords.h" +#include "SciLexer.h" +#include "SString.h" + +/* + * Interface + */ + +static void ColouriseDocument( +    unsigned int startPos, +    int length, +    int initStyle, +    WordList *keywordlists[], +    Accessor &styler); + +static const char * const spiceWordListDesc[] = { +    "Keywords",        // SPICE command +    "Keywords2",    // SPICE functions +    "Keywords3",    // SPICE params +    0 +}; + +LexerModule lmSpice(SCLEX_SPICE, ColouriseDocument, "spice", NULL, spiceWordListDesc); + +/* + * Implementation + */ + +static void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute); + +static inline bool IsDelimiterCharacter(int ch); +static inline bool IsNumberStartCharacter(int ch); +static inline bool IsNumberCharacter(int ch); +static inline bool IsSeparatorOrDelimiterCharacter(int ch); +static inline bool IsWordStartCharacter(int ch); +static inline bool IsWordCharacter(int ch); + +static void ColouriseComment(StyleContext& sc, bool&) { +    sc.SetState(SCE_SPICE_COMMENTLINE); +    while (!sc.atLineEnd) { +        sc.Forward(); +    } +} + +static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) { +    apostropheStartsAttribute = sc.Match (')'); +    sc.SetState(SCE_SPICE_DELIMITER); +    sc.ForwardSetState(SCE_SPICE_DEFAULT); +} + +static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) { +    apostropheStartsAttribute = true; +    SString number; +    sc.SetState(SCE_SPICE_NUMBER); +    // Get all characters up to a delimiter or a separator, including points, but excluding +    // double points (ranges). +    while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) { +        number += static_cast<char>(sc.ch); +        sc.Forward(); +    } +    // Special case: exponent with sign +    if ((sc.chPrev == 'e' || sc.chPrev == 'E') && +            (sc.ch == '+' || sc.ch == '-')) { +        number += static_cast<char>(sc.ch); +        sc.Forward (); +        while (!IsSeparatorOrDelimiterCharacter(sc.ch)) { +            number += static_cast<char>(sc.ch); +            sc.Forward(); +        } +    } +    sc.SetState(SCE_SPICE_DEFAULT); +} + +static void ColouriseWhiteSpace(StyleContext& sc, bool& ) { +    sc.SetState(SCE_SPICE_DEFAULT); +    sc.ForwardSetState(SCE_SPICE_DEFAULT); +} + +static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute) { +    apostropheStartsAttribute = true; +    sc.SetState(SCE_SPICE_IDENTIFIER); +    SString word; +    while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) { +        word += static_cast<char>(tolower(sc.ch)); +        sc.Forward(); +    } +    if (keywords.InList(word.c_str())) { +        sc.ChangeState(SCE_SPICE_KEYWORD); +        if (word != "all") { +            apostropheStartsAttribute = false; +        } +    } +    else if (keywords2.InList(word.c_str())) { +        sc.ChangeState(SCE_SPICE_KEYWORD2); +        if (word != "all") { +            apostropheStartsAttribute = false; +        } +    } +    else if (keywords3.InList(word.c_str())) { +        sc.ChangeState(SCE_SPICE_KEYWORD3); +        if (word != "all") { +            apostropheStartsAttribute = false; +        } +    } +    sc.SetState(SCE_SPICE_DEFAULT); +} + +// +// ColouriseDocument +// +static void ColouriseDocument( +    unsigned int startPos, +    int length, +    int initStyle, +    WordList *keywordlists[], +    Accessor &styler) { +    WordList &keywords = *keywordlists[0]; +    WordList &keywords2 = *keywordlists[1]; +    WordList &keywords3 = *keywordlists[2]; +    StyleContext sc(startPos, length, initStyle, styler); +    int lineCurrent = styler.GetLine(startPos); +    bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0; +    while (sc.More()) { +        if (sc.atLineEnd) { +            // Go to the next line +            sc.Forward(); +            lineCurrent++; +            // Remember the line state for future incremental lexing +            styler.SetLineState(lineCurrent, apostropheStartsAttribute); +            // Don't continue any styles on the next line +            sc.SetState(SCE_SPICE_DEFAULT); +        } +        // Comments +        if ((sc.Match('*') && sc.atLineStart) || sc.Match('*','~')) { +            ColouriseComment(sc, apostropheStartsAttribute); +        // Whitespace +        } else if (IsASpace(sc.ch)) { +            ColouriseWhiteSpace(sc, apostropheStartsAttribute); +        // Delimiters +        } else if (IsDelimiterCharacter(sc.ch)) { +            ColouriseDelimiter(sc, apostropheStartsAttribute); +        // Numbers +        } else if (IsADigit(sc.ch) || sc.ch == '#') { +            ColouriseNumber(sc, apostropheStartsAttribute); +        // Keywords or identifiers +        } else { +            ColouriseWord(sc, keywords, keywords2, keywords3, apostropheStartsAttribute); +        } +    } +    sc.Complete(); +} + +static inline bool IsDelimiterCharacter(int ch) { +    switch (ch) { +    case '&': +    case '\'': +    case '(': +    case ')': +    case '*': +    case '+': +    case ',': +    case '-': +    case '.': +    case '/': +    case ':': +    case ';': +    case '<': +    case '=': +    case '>': +    case '|': +        return true; +    default: +        return false; +    } +} + +static inline bool IsNumberCharacter(int ch) { +    return IsNumberStartCharacter(ch) || +           ch == '_' || +           ch == '.' || +           ch == '#' || +           (ch >= 'a' && ch <= 'f') || +           (ch >= 'A' && ch <= 'F'); +} + +static inline bool IsNumberStartCharacter(int ch) { +    return IsADigit(ch); +} + +static inline bool IsSeparatorOrDelimiterCharacter(int ch) { +    return IsASpace(ch) || IsDelimiterCharacter(ch); +} + +static inline bool IsWordCharacter(int ch) { +    return IsWordStartCharacter(ch) || IsADigit(ch); +} + +static inline bool IsWordStartCharacter(int ch) { +    return (isascii(ch) && isalpha(ch)) || ch == '_'; +} diff --git a/win32/makefile b/win32/makefile index 6891b718a..203102312 100644 --- a/win32/makefile +++ b/win32/makefile @@ -58,8 +58,8 @@ LexForth.o LexFortran.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 LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o \ -LexVHDL.o LexYAML.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 Document.o \ diff --git a/win32/scintilla.mak b/win32/scintilla.mak index a24fb56c1..a27063038 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -160,6 +160,7 @@ LEXOBJS=\  	$(DIR_O)\LexScriptol.obj \  	$(DIR_O)\LexSmalltalk.obj \  	$(DIR_O)\LexSpecman.obj \ +	$(DIR_O)\LexSpice.obj \  	$(DIR_O)\LexSQL.obj \  	$(DIR_O)\LexTADS3.obj \  	$(DIR_O)\LexTCL.obj \ @@ -379,6 +380,8 @@ $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS)  $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) +$(DIR_O)\LexSpice.obj: ..\src\LexSpice.cxx $(LEX_HEADERS) +  $(DIR_O)\LexSQL.obj: ..\src\LexSQL.cxx $(LEX_HEADERS)  $(DIR_O)\LexTADS3.obj: ..\src\LexTADS3.cxx $(LEX_HEADERS) diff --git a/win32/scintilla_vc6.mak b/win32/scintilla_vc6.mak index f43093437..5741f8105 100644 --- a/win32/scintilla_vc6.mak +++ b/win32/scintilla_vc6.mak @@ -161,6 +161,7 @@ LEXOBJS=\  	$(DIR_O)\LexScriptol.obj \  	$(DIR_O)\LexSmalltalk.obj \  	$(DIR_O)\LexSpecman.obj \ +	$(DIR_O)\LexSpice.obj \  	$(DIR_O)\LexSQL.obj \  	$(DIR_O)\LexTADS3.obj \  	$(DIR_O)\LexTCL.obj \ @@ -378,6 +379,8 @@ $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS)  $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) +$(DIR_O)\LexSpice.obj: ..\src\LexSpice.cxx $(LEX_HEADERS) +  $(DIR_O)\LexSQL.obj: ..\src\LexSQL.cxx $(LEX_HEADERS)  $(DIR_O)\LexTADS3.obj: ..\src\LexTADS3.cxx $(LEX_HEADERS) | 
