diff options
Diffstat (limited to 'src/LexNsis.cxx')
-rw-r--r-- | src/LexNsis.cxx | 655 |
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); - |