aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornyamatongwe <devnull@localhost>2003-07-30 12:56:36 +0000
committernyamatongwe <devnull@localhost>2003-07-30 12:56:36 +0000
commite6c4788a0561b889e65545c8039e24c8cdb862ab (patch)
tree92e337c95b3be7e17658876160a3a0ae6cf3de1e /src
parentbc68ca9ccce8317471cdb15d83bc13d10322be45 (diff)
downloadscintilla-mirror-e6c4788a0561b889e65545c8039e24c8cdb862ab.tar.gz
NSIS scripting language support from Angelo Mandato.
Diffstat (limited to 'src')
-rw-r--r--src/KeyWords.cxx1
-rw-r--r--src/LexNsis.cxx346
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);