aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/LexNsis.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/LexNsis.cxx')
-rw-r--r--src/LexNsis.cxx655
1 files changed, 0 insertions, 655 deletions
diff --git a/src/LexNsis.cxx b/src/LexNsis.cxx
deleted file mode 100644
index 43ddc4706..000000000
--- a/src/LexNsis.cxx
+++ /dev/null
@@ -1,655 +0,0 @@
-// Scintilla source code edit control
-/** @file LexNsis.cxx
- ** Lexer for NSIS
- **/
-// Copyright 2003 - 2005 by Angelo Mandato <angelo [at] spaceblue [dot] com>
-// Last Updated: 03/13/2005
-// 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 "CharClassify.h"
-#include "PropSet.h"
-#include "Accessor.h"
-#include "KeyWords.h"
-#include "Scintilla.h"
-#include "SciLexer.h"
-
-#ifdef SCI_NAMESPACE
-using namespace Scintilla;
-#endif
-
-/*
-// located in SciLexer.h
-#define SCLEX_NSIS 43
-
-#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
-#define SCE_NSIS_NUMBER 14
-// ADDED for Scintilla v1.63
-#define SCE_NSIS_SECTIONGROUP 15
-#define SCE_NSIS_PAGEEX 16
-#define SCE_NSIS_FUNCTIONDEF 17
-#define SCE_NSIS_COMMENTBOX 18
-*/
-
-static bool isNsisNumber(char ch)
-{
- return (ch >= '0' && ch <= '9');
-}
-
-static bool isNsisChar(char ch)
-{
- return (ch == '.' ) || (ch == '_' ) || isNsisNumber(ch) || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
-}
-
-static bool isNsisLetter(char ch)
-{
- return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
-}
-
-static bool NsisNextLineHasElse(unsigned int start, unsigned int end, Accessor &styler)
-{
- int nNextLine = -1;
- for( unsigned int i = start; i < end; i++ )
- {
- char cNext = styler.SafeGetCharAt( i );
- if( cNext == '\n' )
- {
- nNextLine = i+1;
- break;
- }
- }
-
- if( nNextLine == -1 ) // We never found the next line...
- return false;
-
- for( unsigned int firstChar = nNextLine; firstChar < end; firstChar++ )
- {
- char cNext = styler.SafeGetCharAt( firstChar );
- if( cNext == ' ' )
- continue;
- if( cNext == '\t' )
- continue;
- if( cNext == '!' )
- {
- if( styler.Match(firstChar, "!else") )
- return true;
- }
- break;
- }
-
- return false;
-}
-
-static int NsisCmp( const char *s1, const char *s2, bool bIgnoreCase )
-{
- if( bIgnoreCase )
- return CompareCaseInsensitive( s1, s2);
-
- return strcmp( s1, s2 );
-}
-
-static int calculateFoldNsis(unsigned int start, unsigned int end, int foldlevel, Accessor &styler, bool bElse, bool foldUtilityCmd )
-{
- int style = styler.StyleAt(end);
-
- // If the word is too long, it is not what we are looking for
- if( end - start > 20 )
- return foldlevel;
-
- if( foldUtilityCmd )
- {
- // Check the style at this point, if it is not valid, then return zero
- if( style != SCE_NSIS_FUNCTIONDEF && style != SCE_NSIS_SECTIONDEF &&
- style != SCE_NSIS_SUBSECTIONDEF && style != SCE_NSIS_IFDEFINEDEF &&
- style != SCE_NSIS_MACRODEF && style != SCE_NSIS_SECTIONGROUP &&
- style != SCE_NSIS_PAGEEX )
- return foldlevel;
- }
- else
- {
- if( style != SCE_NSIS_FUNCTIONDEF && style != SCE_NSIS_SECTIONDEF &&
- style != SCE_NSIS_SUBSECTIONDEF && style != SCE_NSIS_SECTIONGROUP &&
- style != SCE_NSIS_PAGEEX )
- return foldlevel;
- }
-
- int newFoldlevel = foldlevel;
- bool bIgnoreCase = false;
- if( styler.GetPropertyInt("nsis.ignorecase") == 1 )
- bIgnoreCase = true;
-
- char s[20]; // The key word we are looking for has atmost 13 characters
- for (unsigned int i = 0; i < end - start + 1 && i < 19; i++)
- {
- s[i] = static_cast<char>( styler[ start + i ] );
- s[i + 1] = '\0';
- }
-
- if( s[0] == '!' )
- {
- if( NsisCmp(s, "!ifndef", bIgnoreCase) == 0 || NsisCmp(s, "!ifdef", bIgnoreCase ) == 0 || NsisCmp(s, "!ifmacrodef", bIgnoreCase ) == 0 || NsisCmp(s, "!ifmacrondef", bIgnoreCase ) == 0 || NsisCmp(s, "!if", bIgnoreCase ) == 0 || NsisCmp(s, "!macro", bIgnoreCase ) == 0 )
- newFoldlevel++;
- else if( NsisCmp(s, "!endif", bIgnoreCase) == 0 || NsisCmp(s, "!macroend", bIgnoreCase ) == 0 )
- newFoldlevel--;
- else if( bElse && NsisCmp(s, "!else", bIgnoreCase) == 0 )
- newFoldlevel++;
- }
- else
- {
- if( NsisCmp(s, "Section", bIgnoreCase ) == 0 || NsisCmp(s, "SectionGroup", bIgnoreCase ) == 0 || NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "SubSection", bIgnoreCase ) == 0 || NsisCmp(s, "PageEx", bIgnoreCase ) == 0 )
- newFoldlevel++;
- else if( NsisCmp(s, "SectionGroupEnd", bIgnoreCase ) == 0 || NsisCmp(s, "SubSectionEnd", bIgnoreCase ) == 0 || NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 || NsisCmp(s, "SectionEnd", bIgnoreCase ) == 0 || NsisCmp(s, "PageExEnd", bIgnoreCase ) == 0 )
- newFoldlevel--;
- }
-
- return newFoldlevel;
-}
-
-static int classifyWordNsis(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler )
-{
- bool bIgnoreCase = false;
- if( styler.GetPropertyInt("nsis.ignorecase") == 1 )
- bIgnoreCase = true;
-
- bool bUserVars = false;
- if( styler.GetPropertyInt("nsis.uservars") == 1 )
- bUserVars = true;
-
- 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 < 99; i++)
- {
- if( bIgnoreCase )
- s[i] = static_cast<char>( tolower(styler[ start + i ] ) );
- else
- s[i] = static_cast<char>( styler[ start + i ] );
- s[i + 1] = '\0';
- }
-
- // Check for special words...
- if( NsisCmp(s, "!macro", bIgnoreCase ) == 0 || NsisCmp(s, "!macroend", bIgnoreCase) == 0 ) // Covers !macro and !macroend
- return SCE_NSIS_MACRODEF;
-
- if( NsisCmp(s, "!ifdef", bIgnoreCase ) == 0 || NsisCmp(s, "!ifndef", bIgnoreCase) == 0 || NsisCmp(s, "!endif", bIgnoreCase) == 0 ) // Covers !ifdef, !ifndef and !endif
- return SCE_NSIS_IFDEFINEDEF;
-
- if( NsisCmp(s, "!if", bIgnoreCase ) == 0 || NsisCmp(s, "!else", bIgnoreCase ) == 0 ) // Covers !if and else
- return SCE_NSIS_IFDEFINEDEF;
-
- if (NsisCmp(s, "!ifmacrodef", bIgnoreCase ) == 0 || NsisCmp(s, "!ifmacrondef", bIgnoreCase ) == 0 ) // Covers !ifmacrodef and !ifnmacrodef
- return SCE_NSIS_IFDEFINEDEF;
-
- if( NsisCmp(s, "SectionGroup", bIgnoreCase) == 0 || NsisCmp(s, "SectionGroupEnd", bIgnoreCase) == 0 ) // Covers SectionGroup and SectionGroupEnd
- return SCE_NSIS_SECTIONGROUP;
-
- if( NsisCmp(s, "Section", bIgnoreCase ) == 0 || NsisCmp(s, "SectionEnd", bIgnoreCase) == 0 ) // Covers Section and SectionEnd
- return SCE_NSIS_SECTIONDEF;
-
- if( NsisCmp(s, "SubSection", bIgnoreCase) == 0 || NsisCmp(s, "SubSectionEnd", bIgnoreCase) == 0 ) // Covers SubSection and SubSectionEnd
- return SCE_NSIS_SUBSECTIONDEF;
-
- if( NsisCmp(s, "PageEx", bIgnoreCase) == 0 || NsisCmp(s, "PageExEnd", bIgnoreCase) == 0 ) // Covers PageEx and PageExEnd
- return SCE_NSIS_PAGEEX;
-
- if( NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 ) // Covers Function and FunctionEnd
- return SCE_NSIS_FUNCTIONDEF;
-
- 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) > 3 )
- {
- if( s[1] == '{' && s[strlen(s)-1] == '}' )
- return SCE_NSIS_VARIABLE;
- }
-
- // See if the variable is a user defined variable
- if( s[0] == '$' && bUserVars )
- {
- bool bHasSimpleNsisChars = true;
- for (unsigned int j = 1; j < end - start + 1 && j < 99; j++)
- {
- if( !isNsisChar( s[j] ) )
- {
- bHasSimpleNsisChars = false;
- break;
- }
- }
-
- if( bHasSimpleNsisChars )
- return SCE_NSIS_VARIABLE;
- }
-
- // To check for numbers
- if( isNsisNumber( s[0] ) )
- {
- bool bHasSimpleNsisNumber = true;
- for (unsigned int j = 1; j < end - start + 1 && j < 99; j++)
- {
- if( !isNsisNumber( s[j] ) )
- {
- bHasSimpleNsisNumber = false;
- break;
- }
- }
-
- if( bHasSimpleNsisNumber )
- return SCE_NSIS_NUMBER;
- }
-
- return SCE_NSIS_DEFAULT;
-}
-
-static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler)
-{
- int state = SCE_NSIS_DEFAULT;
- if( startPos > 0 )
- state = styler.StyleAt(startPos-1); // Use the style from the previous line, usually default, but could be commentbox
-
- styler.StartAt( startPos );
- styler.GetLine( startPos );
-
- unsigned int nLengthDoc = startPos + length;
- styler.StartSegment( startPos );
-
- char cCurrChar;
- bool bVarInString = false;
- bool bClassicVarInString = false;
-
- unsigned int i;
- for( i = startPos; i < nLengthDoc; i++ )
- {
- cCurrChar = styler.SafeGetCharAt( i );
- char cNextChar = styler.SafeGetCharAt(i+1);
-
- switch(state)
- {
- case SCE_NSIS_DEFAULT:
- 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;
- bClassicVarInString = false;
- break;
- }
- if( cCurrChar == '\'' )
- {
- styler.ColourTo(i-1, state );
- state = SCE_NSIS_STRINGRQ;
- bVarInString = false;
- bClassicVarInString = false;
- break;
- }
- if( cCurrChar == '`' )
- {
- styler.ColourTo(i-1, state );
- state = SCE_NSIS_STRINGLQ;
- bVarInString = false;
- bClassicVarInString = false;
- break;
- }
-
- // NSIS KeyWord,Function, Variable, UserDefined:
- if( cCurrChar == '$' || isNsisChar(cCurrChar) || cCurrChar == '!' )
- {
- styler.ColourTo(i-1,state);
- state = SCE_NSIS_FUNCTION;
-
- // If it is a number, we must check and set style here first...
- if( isNsisNumber(cCurrChar) && (cNextChar == '\t' || cNextChar == ' ' || cNextChar == '\r' || cNextChar == '\n' ) )
- styler.ColourTo( i, SCE_NSIS_NUMBER);
-
- break;
- }
-
- if( cCurrChar == '/' && cNextChar == '*' )
- {
- styler.ColourTo(i-1,state);
- state = SCE_NSIS_COMMENTBOX;
- break;
- }
-
- break;
- case SCE_NSIS_COMMENT:
- if( cNextChar == '\n' || cNextChar == '\r' )
- {
- // Special case:
- if( cCurrChar == '\\' )
- {
- styler.ColourTo(i-2,state);
- styler.ColourTo(i,SCE_NSIS_DEFAULT);
- }
- else
- {
- styler.ColourTo(i,state);
- state = SCE_NSIS_DEFAULT;
- }
- }
- break;
- case SCE_NSIS_STRINGDQ:
- case SCE_NSIS_STRINGLQ:
- case SCE_NSIS_STRINGRQ:
-
- if( styler.SafeGetCharAt(i-1) == '\\' && styler.SafeGetCharAt(i-2) == '$' )
- break; // Ignore the next character, even if it is a quote of some sort
-
- if( cCurrChar == '"' && state == SCE_NSIS_STRINGDQ )
- {
- styler.ColourTo(i,state);
- state = SCE_NSIS_DEFAULT;
- break;
- }
-
- if( cCurrChar == '`' && state == SCE_NSIS_STRINGLQ )
- {
- styler.ColourTo(i,state);
- state = SCE_NSIS_DEFAULT;
- break;
- }
-
- if( cCurrChar == '\'' && state == SCE_NSIS_STRINGRQ )
- {
- styler.ColourTo(i,state);
- state = SCE_NSIS_DEFAULT;
- break;
- }
-
- if( cNextChar == '\r' || cNextChar == '\n' )
- {
- int nCurLine = styler.GetLine(i+1);
- int nBack = i;
- // We need to check if the previous line has a \ in it...
- bool bNextLine = false;
-
- while( nBack > 0 )
- {
- if( styler.GetLine(nBack) != nCurLine )
- break;
-
- char cTemp = styler.SafeGetCharAt(nBack, 'a'); // Letter 'a' is safe here
-
- if( cTemp == '\\' )
- {
- bNextLine = true;
- break;
- }
- if( cTemp != '\r' && cTemp != '\n' && cTemp != '\t' && cTemp != ' ' )
- break;
-
- nBack--;
- }
-
- if( bNextLine )
- {
- styler.ColourTo(i+1,state);
- }
- if( bNextLine == false )
- {
- styler.ColourTo(i,state);
- state = SCE_NSIS_DEFAULT;
- }
- }
- break;
-
- case SCE_NSIS_FUNCTION:
-
- // NSIS KeyWord:
- if( cCurrChar == '$' )
- state = SCE_NSIS_DEFAULT;
- else if( cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) )
- state = SCE_NSIS_DEFAULT;
- else if( (isNsisChar(cCurrChar) && !isNsisChar( cNextChar) && cNextChar != '}') || cCurrChar == '}' )
- {
- state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler );
- styler.ColourTo( i, state);
- state = SCE_NSIS_DEFAULT;
- }
- else if( !isNsisChar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' )
- {
- if( classifyWordNsis( styler.GetStartSegment(), i-1, keywordLists, styler) == SCE_NSIS_NUMBER )
- styler.ColourTo( i-1, SCE_NSIS_NUMBER );
-
- state = SCE_NSIS_DEFAULT;
-
- if( cCurrChar == '"' )
- {
- state = SCE_NSIS_STRINGDQ;
- bVarInString = false;
- bClassicVarInString = false;
- }
- else if( cCurrChar == '`' )
- {
- state = SCE_NSIS_STRINGLQ;
- bVarInString = false;
- bClassicVarInString = false;
- }
- else if( cCurrChar == '\'' )
- {
- state = SCE_NSIS_STRINGRQ;
- bVarInString = false;
- bClassicVarInString = false;
- }
- else if( cCurrChar == '#' || cCurrChar == ';' )
- {
- state = SCE_NSIS_COMMENT;
- }
- }
- break;
- case SCE_NSIS_COMMENTBOX:
-
- if( styler.SafeGetCharAt(i-1) == '*' && cCurrChar == '/' )
- {
- styler.ColourTo(i,state);
- state = SCE_NSIS_DEFAULT;
- }
- break;
- }
-
- if( state == SCE_NSIS_COMMENT || state == SCE_NSIS_COMMENTBOX )
- {
- styler.ColourTo(i,state);
- }
- else if( state == SCE_NSIS_STRINGDQ || state == SCE_NSIS_STRINGLQ || state == SCE_NSIS_STRINGRQ )
- {
- bool bIngoreNextDollarSign = false;
- bool bUserVars = false;
- if( styler.GetPropertyInt("nsis.uservars") == 1 )
- bUserVars = true;
-
- if( bVarInString && cCurrChar == '$' )
- {
- bVarInString = false;
- bIngoreNextDollarSign = true;
- }
- else if( bVarInString && cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' || cNextChar == '"' || cNextChar == '`' || cNextChar == '\'' ) )
- {
- styler.ColourTo( i+1, SCE_NSIS_STRINGVAR);
- bVarInString = false;
- bIngoreNextDollarSign = false;
- }
-
- // Covers "$INSTDIR and user vars like $MYVAR"
- else if( bVarInString && !isNsisChar(cNextChar) )
- {
- int nWordState = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler);
- if( nWordState == SCE_NSIS_VARIABLE )
- styler.ColourTo( i, SCE_NSIS_STRINGVAR);
- else if( bUserVars )
- styler.ColourTo( i, SCE_NSIS_STRINGVAR);
- bVarInString = false;
- }
- // Covers "${TEST}..."
- else if( bClassicVarInString && cNextChar == '}' )
- {
- styler.ColourTo( i+1, SCE_NSIS_STRINGVAR);
- bClassicVarInString = false;
- }
-
- // Start of var in string
- if( !bIngoreNextDollarSign && cCurrChar == '$' && cNextChar == '{' )
- {
- styler.ColourTo( i-1, state);
- bClassicVarInString = true;
- bVarInString = false;
- }
- else if( !bIngoreNextDollarSign && cCurrChar == '$' )
- {
- styler.ColourTo( i-1, state);
- bVarInString = true;
- bClassicVarInString = false;
- }
- }
- }
-
- // Colourise remaining document
- styler.ColourTo(nLengthDoc-1,state);
-}
-
-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;
-
- bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) == 1;
- bool foldUtilityCmd = styler.GetPropertyInt("nsis.foldutilcmd", 1) == 1;
- bool blockComment = false;
-
- int lineCurrent = styler.GetLine(startPos);
- unsigned int safeStartPos = styler.LineStart( lineCurrent );
-
- bool bArg1 = true;
- int nWordStart = -1;
-
- int levelCurrent = SC_FOLDLEVELBASE;
- if (lineCurrent > 0)
- levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
- int levelNext = levelCurrent;
- int style = styler.StyleAt(safeStartPos);
- if( style == SCE_NSIS_COMMENTBOX )
- {
- if( styler.SafeGetCharAt(safeStartPos) == '/' && styler.SafeGetCharAt(safeStartPos+1) == '*' )
- levelNext++;
- blockComment = true;
- }
-
- for (unsigned int i = safeStartPos; i < startPos + length; i++)
- {
- char chCurr = styler.SafeGetCharAt(i);
- style = styler.StyleAt(i);
- if( blockComment && style != SCE_NSIS_COMMENTBOX )
- {
- levelNext--;
- blockComment = false;
- }
- else if( !blockComment && style == SCE_NSIS_COMMENTBOX )
- {
- levelNext++;
- blockComment = true;
- }
-
- if( bArg1 && !blockComment)
- {
- if( nWordStart == -1 && (isNsisLetter(chCurr) || chCurr == '!') )
- {
- nWordStart = i;
- }
- else if( isNsisLetter(chCurr) == false && nWordStart > -1 )
- {
- int newLevel = calculateFoldNsis( nWordStart, i-1, levelNext, styler, foldAtElse, foldUtilityCmd );
-
- if( newLevel == levelNext )
- {
- if( foldAtElse && foldUtilityCmd )
- {
- if( NsisNextLineHasElse(i, startPos + length, styler) )
- levelNext--;
- }
- }
- else
- levelNext = newLevel;
- bArg1 = false;
- }
- }
-
- if( chCurr == '\n' )
- {
- if( bArg1 && foldAtElse && foldUtilityCmd && !blockComment )
- {
- if( NsisNextLineHasElse(i, startPos + length, styler) )
- levelNext--;
- }
-
- // If we are on a new line...
- 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;
- bArg1 = true; // New line, lets look at first argument again
- nWordStart = -1;
- }
- }
-
- 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);
-