diff options
| -rw-r--r-- | doc/ScintillaHistory.html | 1 | ||||
| -rw-r--r-- | gtk/makefile | 12 | ||||
| -rw-r--r-- | gtk/scintilla.mak | 3 | ||||
| -rw-r--r-- | include/SciLexer.h | 13 | ||||
| -rw-r--r-- | include/Scintilla.iface | 15 | ||||
| -rw-r--r-- | src/KeyWords.cxx | 1 | ||||
| -rw-r--r-- | src/LexGAP.cxx | 260 | ||||
| -rw-r--r-- | win32/makefile | 12 | ||||
| -rw-r--r-- | win32/scintilla.mak | 3 | ||||
| -rw-r--r-- | win32/scintilla_vc6.mak | 3 | 
10 files changed, 311 insertions, 12 deletions
| diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 7af79288c..4fd34f20e 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -232,6 +232,7 @@  	<li>Stefan Schwendeler</li>  	<li>Cristian Adam</li>  	<li>Nicolas Chachereau</li> +	<li>Istvan Szollosi</li>      </ul>      <p>         Images used in GTK+ version diff --git a/gtk/makefile b/gtk/makefile index 673f11dff..4dc78a54a 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -66,12 +66,12 @@ LEXOBJS=\  LexAda.o LexAPDL.o LexAsm.o LexAsn1.o LexAU3.o LexAVE.o LexBaan.o LexBash.o \  LexBasic.o LexBullant.o LexCaml.o LexCLW.o LexCmake.o LexConf.o LexCPP.o \  LexCrontab.o LexCsound.o LexCSS.o LexD.o LexEiffel.o LexErlang.o LexEScript.o \ -LexFlagship.o 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 LexSpice.o LexSQL.o LexTADS3.o \ -LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.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  #--Autogenerated -- end of automatically generated section  all: $(COMPLIB) diff --git a/gtk/scintilla.mak b/gtk/scintilla.mak index 3bb9db766..deb3df2ea 100644 --- a/gtk/scintilla.mak +++ b/gtk/scintilla.mak @@ -167,6 +167,7 @@ LEXOBJS=\  	$(DIR_O)\LexFlagship.obj \  	$(DIR_O)\LexForth.obj \  	$(DIR_O)\LexFortran.obj \ +	$(DIR_O)\LexGAP.obj \  	$(DIR_O)\LexGui4Cli.obj \  	$(DIR_O)\LexHaskell.obj \  	$(DIR_O)\LexHTML.obj \ @@ -394,6 +395,8 @@ $(DIR_O)\LexForth.obj: ..\src\LexForth.cxx $(LEX_HEADERS)  $(DIR_O)\LexFortran.obj: ..\src\LexFortran.cxx $(LEX_HEADERS) +$(DIR_O)\LexGAP.obj: ..\src\LexGAP.cxx $(LEX_HEADERS) +  $(DIR_O)\LexGui4Cli.obj: ..\src\LexGui4Cli.cxx $(LEX_HEADERS)  $(DIR_O)\LexHaskell.obj: ..\src\LexHaskell.cxx $(LEX_HEADERS) diff --git a/include/SciLexer.h b/include/SciLexer.h index dcad10105..62382ca4c 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -93,6 +93,7 @@  #define SCLEX_SPICE 78  #define SCLEX_D 79  #define SCLEX_CMAKE 80 +#define SCLEX_GAP 81  #define SCLEX_AUTOMATIC 1000  #define SCE_P_DEFAULT 0  #define SCE_P_COMMENTLINE 1 @@ -1103,6 +1104,18 @@  #define SCE_CMAKE_MACRODEF 12  #define SCE_CMAKE_STRINGVAR 13  #define SCE_CMAKE_NUMBER 14 +#define SCE_GAP_DEFAULT 0 +#define SCE_GAP_IDENTIFIER 1 +#define SCE_GAP_KEYWORD 2 +#define SCE_GAP_KEYWORD2 3 +#define SCE_GAP_KEYWORD3 4 +#define SCE_GAP_KEYWORD4 5 +#define SCE_GAP_STRING 6 +#define SCE_GAP_CHAR 7 +#define SCE_GAP_OPERATOR 8 +#define SCE_GAP_COMMENT 9 +#define SCE_GAP_NUMBER 10 +#define SCE_GAP_STRINGEOL 11  #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 d0a9566da..ba9f61ec0 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1943,6 +1943,7 @@ val SCLEX_OPAL=77  val SCLEX_SPICE=78  val SCLEX_D=79  val SCLEX_CMAKE=80 +val SCLEX_GAP=81  # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a  # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -3102,6 +3103,20 @@ val SCE_CMAKE_IFDEFINEDEF=11  val SCE_CMAKE_MACRODEF=12  val SCE_CMAKE_STRINGVAR=13  val SCE_CMAKE_NUMBER=14 +# Lexical states for SCLEX_GAP +lex Gap=SCLEX_GAP SCE_GAP_ +val SCE_GAP_DEFAULT=0 +val SCE_GAP_IDENTIFIER=1 +val SCE_GAP_KEYWORD=2 +val SCE_GAP_KEYWORD2=3 +val SCE_GAP_KEYWORD3=4 +val SCE_GAP_KEYWORD4=5 +val SCE_GAP_STRING=6 +val SCE_GAP_CHAR=7 +val SCE_GAP_OPERATOR=8 +val SCE_GAP_COMMENT=9 +val SCE_GAP_NUMBER=10 +val SCE_GAP_STRINGEOL=11  # Events diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 56ccaddd4..273b04779 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -170,6 +170,7 @@ int Scintilla_LinkLexers() {  	LINK_LEXER(lmForth);  	LINK_LEXER(lmFortran);  	LINK_LEXER(lmFreeBasic); +	LINK_LEXER(lmGAP);  	LINK_LEXER(lmGui4Cli);  	LINK_LEXER(lmHaskell);  	LINK_LEXER(lmHTML); diff --git a/src/LexGAP.cxx b/src/LexGAP.cxx new file mode 100644 index 000000000..4aa555a79 --- /dev/null +++ b/src/LexGAP.cxx @@ -0,0 +1,260 @@ +// Scintilla source code edit control +/** @file LexGAP.cxx + ** Lexer for the GAP language. (The GAP System for Computational Discrete Algebra) + ** http://www.gap-system.org + **/ +// Copyright 2007 by Istvan Szollosi ( szteven <at> gmail <dot> 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 "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + + +static inline bool IsGAPOperator(char ch) { +	if (isalnum(ch)) return false; +	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||  +		ch == '^' || ch == ',' || ch == '!' || ch == '.' ||  +		ch == '=' || ch == '<' || ch == '>' || ch == '(' ||  +		ch == ')' || ch == ';' || ch == '[' || ch == ']' ||  +		ch == '{' || ch == '}' || ch == ':' ) +		return true; +	return false; +} + +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>(styler[start + i]); +		i++; +	} +	s[i] = '\0'; +} + +static void ColouriseGAPDoc(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]; +	 +	// Do not leak onto next line +	if (initStyle == SCE_GAP_STRINGEOL) initStyle = SCE_GAP_DEFAULT;	 +	 +	StyleContext sc(startPos, length, initStyle, styler); +	 +	for (; sc.More(); sc.Forward()) { +		 +		// Prevent SCE_GAP_STRINGEOL from leaking back to previous line +		if ( sc.atLineStart ) { +			if (sc.state == SCE_GAP_STRING) sc.SetState(SCE_GAP_STRING); +			if (sc.state == SCE_GAP_CHAR) sc.SetState(SCE_GAP_CHAR); +		} +		 +		// Handle line continuation generically +		if (sc.ch == '\\' ) { +			if (sc.chNext == '\n' || sc.chNext == '\r') { +				sc.Forward(); +				if (sc.ch == '\r' && sc.chNext == '\n') { +					sc.Forward(); +				} +				continue; +			} +		} +		 +		// Determine if the current state should terminate +		switch (sc.state) { +			case SCE_GAP_OPERATOR : +				sc.SetState(SCE_GAP_DEFAULT); +				break; +				 +			case SCE_GAP_NUMBER :   +				if (!IsADigit(sc.ch)) {     +					if (sc.ch == '\\') { +						if (!sc.atLineEnd) { +							if (!IsADigit(sc.chNext)) { +								sc.Forward(); +								sc.ChangeState(SCE_GAP_IDENTIFIER); +							} +						} +					} else if (isalpha(sc.ch) || sc.ch == '_') { +						sc.ChangeState(SCE_GAP_IDENTIFIER); +					} +					else sc.SetState(SCE_GAP_DEFAULT); +				} +				break; +				 +			case SCE_GAP_IDENTIFIER : +				if (!(iswordstart(static_cast<char>(sc.ch)) || sc.ch == '$')) { +					if (sc.ch == '\\') sc.Forward(); +					else { +						char s[1000]; +						sc.GetCurrent(s, sizeof(s)); +						if (keywords1.InList(s)) { +							sc.ChangeState(SCE_GAP_KEYWORD); +						} else if (keywords2.InList(s)) { +							sc.ChangeState(SCE_GAP_KEYWORD2); +						} else if (keywords3.InList(s)) { +							sc.ChangeState(SCE_GAP_KEYWORD3); +						} else if (keywords4.InList(s)) { +							sc.ChangeState(SCE_GAP_KEYWORD4); +						} +						sc.SetState(SCE_GAP_DEFAULT); +					} +				} +				break; +				 +			case SCE_GAP_COMMENT : +				if (sc.atLineEnd) { +					sc.SetState(SCE_GAP_DEFAULT); +				} +				break; +				 +			case SCE_GAP_STRING: +				if (sc.atLineEnd) { +					sc.ChangeState(SCE_GAP_STRINGEOL); +				} else if (sc.ch == '\\') { +					if (sc.chNext == '\"') { +						sc.Forward(); +					} +				} else if (sc.ch == '\"') { +					sc.ForwardSetState(SCE_GAP_DEFAULT); +				} +				break; +				 +			case SCE_GAP_CHAR: +				if (sc.atLineEnd) { +					sc.ChangeState(SCE_GAP_STRINGEOL); +				} else if (sc.ch == '\\') { +					if (sc.chNext == '\'') { +						sc.Forward(); +					} +				} else if (sc.ch == '\'') { +					sc.ForwardSetState(SCE_GAP_DEFAULT); +				} +				break;				 +				 +			case SCE_GAP_STRINGEOL: +				if (sc.atLineStart) { +					sc.SetState(SCE_GAP_DEFAULT); +				} +				break; +		} +		 +		// Determine if a new state should be entered +		if (sc.state == SCE_GAP_DEFAULT) { +			if (IsGAPOperator(static_cast<char>(sc.ch))) { +				sc.SetState(SCE_GAP_OPERATOR); +			} +			else if (IsADigit(sc.ch)) { +				sc.SetState(SCE_GAP_NUMBER); +			} else if (isalpha(sc.ch) || sc.ch == '_' || sc.ch == '\\' || sc.ch == '$' || sc.ch == '~') { +				sc.SetState(SCE_GAP_IDENTIFIER); +				if (sc.ch == '\\') sc.Forward(); +			} else if (sc.ch == '#') { +				sc.SetState(SCE_GAP_COMMENT); +			} else if (sc.ch == '\"') { +				sc.SetState(SCE_GAP_STRING); +			} else if (sc.ch == '\'') { +				sc.SetState(SCE_GAP_CHAR); +			} +		} +		 +	} +	sc.Complete(); +} + +static int ClassifyFoldPointGAP(const char* s) { +	int level = 0; +	if (strcmp(s, "function") == 0 || +		strcmp(s, "do") == 0 || +		strcmp(s, "if") == 0 || +		strcmp(s, "repeat") == 0 ) { +		level = 1; +	} else if (strcmp(s, "end") == 0 || +			strcmp(s, "od") == 0 || +			strcmp(s, "fi") == 0 || +			strcmp(s, "until") == 0 ) { +		level = -1; +	} +	return level; +} + +static void FoldGAPDoc( unsigned int startPos, int length, int initStyle,   WordList** , Accessor &styler) { +	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 lastStart = 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_GAP_DEFAULT && style == SCE_GAP_KEYWORD) { +			// Store last word start point. +			lastStart = i; +		} + +		if (stylePrev == SCE_GAP_KEYWORD) { +			if(iswordchar(ch) && !iswordchar(chNext)) { +				char s[100]; +				GetRange(lastStart, i, styler, s, sizeof(s)); +				levelCurrent += ClassifyFoldPointGAP(s); +			} +		} + +		if (atEOL) { +			int lev = levelPrev; +			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 GAPWordListDesc[] = { +	"Keywords 1", +	"Keywords 2", +	"Keywords 3 (unused)",   +	"Keywords 4 (unused)", +	0 +}; + +LexerModule lmGAP( +   SCLEX_GAP, +   ColouriseGAPDoc, +   "gap", +   FoldGAPDoc, +   GAPWordListDesc); diff --git a/win32/makefile b/win32/makefile index ce0d2c076..c9da20826 100644 --- a/win32/makefile +++ b/win32/makefile @@ -54,12 +54,12 @@ LEXOBJS=\  LexAda.o LexAPDL.o LexAsm.o LexAsn1.o LexAU3.o LexAVE.o LexBaan.o LexBash.o \  LexBasic.o LexBullant.o LexCaml.o LexCLW.o LexCmake.o LexConf.o LexCPP.o \  LexCrontab.o LexCsound.o LexCSS.o LexD.o LexEiffel.o LexErlang.o LexEScript.o \ -LexFlagship.o 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 LexSpice.o LexSQL.o LexTADS3.o \ -LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.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  #--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 0d60c4bea..da3c506bd 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -137,6 +137,7 @@ LEXOBJS=\  	$(DIR_O)\LexFlagship.obj \  	$(DIR_O)\LexForth.obj \  	$(DIR_O)\LexFortran.obj \ +	$(DIR_O)\LexGAP.obj \  	$(DIR_O)\LexGui4Cli.obj \  	$(DIR_O)\LexHaskell.obj \  	$(DIR_O)\LexHTML.obj \ @@ -345,6 +346,8 @@ $(DIR_O)\LexForth.obj: ..\src\LexForth.cxx $(LEX_HEADERS)  $(DIR_O)\LexFortran.obj: ..\src\LexFortran.cxx $(LEX_HEADERS) +$(DIR_O)\LexGAP.obj: ..\src\LexGAP.cxx $(LEX_HEADERS) +  $(DIR_O)\LexGui4Cli.obj: ..\src\LexGui4Cli.cxx $(LEX_HEADERS)  $(DIR_O)\LexHaskell.obj: ..\src\LexHaskell.cxx $(LEX_HEADERS) diff --git a/win32/scintilla_vc6.mak b/win32/scintilla_vc6.mak index 5506dd1fd..2a35235e3 100644 --- a/win32/scintilla_vc6.mak +++ b/win32/scintilla_vc6.mak @@ -139,6 +139,7 @@ LEXOBJS=\  	$(DIR_O)\LexFlagship.obj \  	$(DIR_O)\LexForth.obj \  	$(DIR_O)\LexFortran.obj \ +	$(DIR_O)\LexGAP.obj \  	$(DIR_O)\LexGui4Cli.obj \  	$(DIR_O)\LexHaskell.obj \  	$(DIR_O)\LexHTML.obj \ @@ -347,6 +348,8 @@ $(DIR_O)\LexForth.obj: ..\src\LexForth.cxx $(LEX_HEADERS)  $(DIR_O)\LexFortran.obj: ..\src\LexFortran.cxx $(LEX_HEADERS) +$(DIR_O)\LexGAP.obj: ..\src\LexGAP.cxx $(LEX_HEADERS) +  $(DIR_O)\LexGui4Cli.obj: ..\src\LexGui4Cli.cxx $(LEX_HEADERS)  $(DIR_O)\LexHaskell.obj: ..\src\LexHaskell.cxx $(LEX_HEADERS) | 
