diff options
author | nyamatongwe <devnull@localhost> | 2003-07-30 12:56:36 +0000 |
---|---|---|
committer | nyamatongwe <devnull@localhost> | 2003-07-30 12:56:36 +0000 |
commit | e6c4788a0561b889e65545c8039e24c8cdb862ab (patch) | |
tree | 92e337c95b3be7e17658876160a3a0ae6cf3de1e /src | |
parent | bc68ca9ccce8317471cdb15d83bc13d10322be45 (diff) | |
download | scintilla-mirror-e6c4788a0561b889e65545c8039e24c8cdb862ab.tar.gz |
NSIS scripting language support from Angelo Mandato.
Diffstat (limited to 'src')
-rw-r--r-- | src/KeyWords.cxx | 1 | ||||
-rw-r--r-- | src/LexNsis.cxx | 346 |
2 files changed, 347 insertions, 0 deletions
diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 9a2ff0903..a15bae350 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -153,6 +153,7 @@ int Scintilla_LinkLexers() { LINK_LEXER(lmLout); LINK_LEXER(lmLua); LINK_LEXER(lmMatlab); + LINK_LEXER(lmNsis); LINK_LEXER(lmBatch); LINK_LEXER(lmDiff); LINK_LEXER(lmProps); diff --git a/src/LexNsis.cxx b/src/LexNsis.cxx new file mode 100644 index 000000000..c09a8ae86 --- /dev/null +++ b/src/LexNsis.cxx @@ -0,0 +1,346 @@ +// Scintilla source code edit control +/** @file LexNsis.cxx + ** Lexer for NSIS + **/ +// Copyright 2003 by Angelo Mandato <angelo@spaceblue.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 "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +/* +// Put in SciLexer.h +#define SCLEX_NSIS 34 + +#define SCE_NSIS_DEFAULT 0 +#define SCE_NSIS_COMMENT 1 +#define SCE_NSIS_STRINGDQ 2 +#define SCE_NSIS_STRINGLQ 3 +#define SCE_NSIS_STRINGRQ 4 +#define SCE_NSIS_FUNCTION 5 +#define SCE_NSIS_VARIABLE 6 +#define SCE_NSIS_LABEL 7 +#define SCE_NSIS_USERDEFINED 8 +#define SCE_NSIS_SECTIONDEF 9 +#define SCE_NSIS_SUBSECTIONDEF 10 +#define SCE_NSIS_IFDEFINEDEF 11 +#define SCE_NSIS_MACRODEF 12 +#define SCE_NSIS_STRINGVAR 13 +*/ + +static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler) +{ + char s[100]; + + WordList &Functions = *keywordLists[0]; + WordList &Variables = *keywordLists[1]; + WordList &Lables = *keywordLists[2]; + WordList &UserDefined = *keywordLists[3]; + + for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) + { + s[i] = static_cast<char>( styler[ start + i ] ); + s[i + 1] = '\0'; + } + + // Check for special words... + + if( strcmp(s, "!macro") == 0 || strcmp(s, "!macroend") == 0 ) // Covers !micro and !microend + return SCE_NSIS_MACRODEF; + + if( strcmp(s, "!ifdef") == 0 || strcmp(s, "!ifndef") == 0 || strcmp(s, "!endif") == 0 ) + return SCE_NSIS_IFDEFINEDEF; + + if( strcmp(s, "Section") == 0 || strcmp(s, "SectionEnd") == 0 ) // Covers Section and SectionEnd + return SCE_NSIS_SECTIONDEF; + + if( strcmp(s, "SubSection") == 0 || strcmp(s, "SubSectionEnd") == 0 ) // Covers SubSection and SubSectionEnd + return SCE_NSIS_SUBSECTIONDEF; + + if( strcmp(s, "Function") == 0 || strcmp(s, "FunctionEnd") == 0 ) // Covers SubSection and SubSectionEnd + return SCE_NSIS_FUNCTION; + + if ( Functions.InList(s) ) + return SCE_NSIS_FUNCTION; + + if ( Variables.InList(s) ) + return SCE_NSIS_VARIABLE; + + if ( Lables.InList(s) ) + return SCE_NSIS_LABEL; + + if( UserDefined.InList(s) ) + return SCE_NSIS_USERDEFINED; + + if( strlen(s) > 2 ) + { + if( s[1] == '{' && s[strlen(s)-1] == '}' ) + return SCE_NSIS_VARIABLE; + } + + return SCE_NSIS_DEFAULT; +} + +static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) +{ + int state = SCE_NSIS_DEFAULT; + styler.StartAt( startPos ); + styler.GetLine( startPos ); + + unsigned int nLengthDoc = startPos + length; + styler.StartSegment( startPos ); + + char cCurrChar; + bool bVarInString = true; + + unsigned int i; + for( i = startPos; i < nLengthDoc; i++ ) + { + cCurrChar = styler.SafeGetCharAt( i ); + char cNextChar = styler.SafeGetCharAt( i+1, EOF ); + + + + switch(state) + { + case SCE_NSIS_DEFAULT: + if( cNextChar == EOF ) + { + styler.ColourTo(i,SCE_NSIS_DEFAULT); + break; + } + if( cCurrChar == ';' || cCurrChar == '#' ) // we have a comment line + { + styler.ColourTo(i-1, state ); + state = SCE_NSIS_COMMENT; + break; + } + if( cCurrChar == '"' ) + { + styler.ColourTo(i-1, state ); + state = SCE_NSIS_STRINGDQ; + bVarInString = false; + break; + } + if( cCurrChar == '\'' ) + { + styler.ColourTo(i-1, state ); + state = SCE_NSIS_STRINGRQ; + bVarInString = false; + break; + } + if( cCurrChar == '`' ) + { + styler.ColourTo(i-1, state ); + state = SCE_NSIS_STRINGLQ; + bVarInString = false; + break; + } + + // NSIS KeyWord,Function, Variable, UserDefined: + if( cCurrChar == '$' || iswordchar(cCurrChar) || cCurrChar == '!' ) + { + styler.ColourTo(i-1,state); + state = SCE_NSIS_FUNCTION; + break; + } + break; + case SCE_NSIS_COMMENT: + if( cNextChar == '\n' || cNextChar == '\r' || cNextChar == EOF ) + { + styler.ColourTo(i,state); + state = SCE_NSIS_DEFAULT; + } + break; + case SCE_NSIS_STRINGDQ: + if( cCurrChar == '"' || cNextChar == '\r' || cNextChar == '\n' ) + { + styler.ColourTo(i,SCE_NSIS_STRINGDQ); + state = SCE_NSIS_DEFAULT; + } + break; + case SCE_NSIS_STRINGLQ: + if( cCurrChar == '`' || cNextChar == '\r' || cNextChar == '\n' ) + { + styler.ColourTo(i,SCE_NSIS_STRINGLQ); + state = SCE_NSIS_DEFAULT; + } + break; + case SCE_NSIS_STRINGRQ: + if( cCurrChar == '\'' || cNextChar == '\r' || cNextChar == '\n' ) + { + styler.ColourTo(i,SCE_NSIS_STRINGRQ); + state = SCE_NSIS_DEFAULT; + } + break; + case SCE_NSIS_FUNCTION: + + // NSIS KeyWord: + if( (iswordchar(cCurrChar) && !iswordchar( cNextChar) && cNextChar != '}') || cCurrChar == '}' ) + { + state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler); + styler.ColourTo( i, state); + state = SCE_NSIS_DEFAULT; // Everything after goes back to the default state + } + else if( !iswordchar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' ) + { + state = SCE_NSIS_DEFAULT; + + if( cCurrChar == '"' ) // Next + { + state = SCE_NSIS_STRINGDQ; + bVarInString = false; + } + if( cCurrChar == '`' ) + { + state = SCE_NSIS_STRINGLQ; + bVarInString = false; + } + if( cCurrChar == '\'' ) + { + state = SCE_NSIS_STRINGRQ; + bVarInString = false; + } + if( cCurrChar == '#' || cCurrChar == ';' ) + state = SCE_NSIS_COMMENT; + + styler.ColourTo( i, state); + } + break; + } + + if( state == SCE_NSIS_COMMENT ) + { + styler.ColourTo(i,state); + } + else if( state == SCE_NSIS_STRINGDQ || state == SCE_NSIS_STRINGLQ || state == SCE_NSIS_STRINGRQ ) + { + // Check for var in String.. + if( bVarInString && (iswordchar(cCurrChar) || cCurrChar == '}') ) // || cCurrChar == '{' ) ) + { + int nWordState = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler); + if( nWordState == SCE_NSIS_VARIABLE ) + { + styler.ColourTo( i, SCE_NSIS_STRINGVAR); + bVarInString = false; + } + } + if( cCurrChar == '$' ) + { + styler.ColourTo( i-1, state); + bVarInString = true; + } + } + } +} + + +static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) +{ + // No folding enabled, no reason to continue... + if( styler.GetPropertyInt("fold") == 0 ) + return; + + unsigned int endPos = startPos + length; + int lineCurrent = styler.GetLine(startPos); + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelNext = levelCurrent; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style; + + 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'); + // Functions Start: Function, Section, SubSection + // Functions End: FunctionEnd, SectionEnd, SubSectionEnd + // Label Start: !ifdef, !ifndef + // Label End: !endif + + if( style == SCE_NSIS_FUNCTION ) + { + if( styler.Match(i, "FunctionEnd") ) + levelNext--; + else if( styler.Match(i, "Function") ) + levelNext++; + } + else if( style == SCE_NSIS_SECTIONDEF ) + { + if( styler.Match(i, "SectionEnd") ) + levelNext--; + else if( styler.Match(i, "Section") ) + levelNext++; + } + else if( style == SCE_NSIS_SUBSECTIONDEF ) + { + if( styler.Match(i, "SubSectionEnd") ) + levelNext--; + else if( styler.Match(i, "SubSection") ) + levelNext++; + } + else if( style == SCE_NSIS_IFDEFINEDEF ) + { + if( styler.Match(i, "!endif") ) + levelNext--; + else if( styler.Match(i, "!ifdef") || styler.Match(i, "!ifndef")) + levelNext++; + } + else if( style == SCE_NSIS_MACRODEF ) + { + if( styler.Match(i, "!macroend") ) + levelNext--; + else if( styler.Match(i, "!macro") ) + levelNext++; + } + + if( atEOL ) + { + int levelUse = levelCurrent; + int lev = levelUse | levelNext << 16; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) + { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelCurrent = levelNext; + } + } + + int levelUse = levelCurrent; + int lev = levelUse | levelNext << 16; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) + { + styler.SetLevel(lineCurrent, lev); + } +} + +static const char * const nsisWordLists[] = { + "Functions", + "Variables", + "Lables", + "UserDefined", + 0, }; + + +LexerModule lmNsis(SCLEX_NSIS, ColouriseNsisDoc, "nsis", FoldNsisDoc, nsisWordLists); |