| 1 skipped line |
| 2 | U | 2 | U | /** @file LexNsis.cxx |
|
|
|
| 5 | C | // Copyright 2003, 2004 by Angelo Mandato <angelo [at] spaceblue [dot] com> | | 5 | C | // Copyright 2003 - 2005 by Angelo Mandato <angelo [at] spaceblue [dot] com> |
| 6 | C | // Last Updated: 02/22/2004 | | 6 | C | // Last Updated: 03/13/2005 |
| 7 | U | 7 | U | // The License.txt file describes the conditions under which this software may be distributed. |
|
|
|
| 28 skipped lines |
| 38 | U | 38 | U | #define SCE_NSIS_MACRODEF 12 |
|
| 39 | U | 39 | U | #define SCE_NSIS_STRINGVAR 13 |
|
| 40 | U | 40 | U | #define SCE_NSIS_NUMBER 14 |
|
| | | 41 | A | // ADDED for Scintilla v1.63 |
| | | 42 | A | #define SCE_NSIS_SECTIONGROUP 15 |
| | | 43 | A | #define SCE_NSIS_PAGEEX 16 |
| | | 44 | A | #define SCE_NSIS_FUNCTIONDEF 17 |
| | | 45 | A | #define SCE_NSIS_COMMENTBOX 18 |
|
|
| 43 | U | 48 | U | static bool isNsisNumber(char ch) |
|
| 11 skipped lines |
| 55 | U | 60 | U | return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); |
|
|
|
| | | 63 | A | static bool NsisNextLineHasElse(unsigned int start, unsigned int end, Accessor &styler) |
| | | 64 | A | { |
| | | 65 | A | int nNextLine = -1; |
| | | 66 | A | for( unsigned int i = start; i < end; i++ ) |
| | | 67 | A | { |
| 24 skipped lines |
| | | 92 | A | } |
| | | 93 | A | |
| | | 94 | A | return false; |
| | | 95 | A | } |
| | | 96 | A | |
| 58 | U | 97 | U | static int NsisCmp( char *s1, char *s2, bool bIgnoreCase ) |
|
|
|
| 2 skipped lines |
| 63 | U | 102 | U | return strcmp( s1, s2 ); |
|
|
|
| 66 | C | static int calculateFoldNsis(unsigned int start, unsigned int end, int foldlevel, Accessor &styler ) | | 105 | C | static int calculateFoldNsis(unsigned int start, unsigned int end, int foldlevel, Accessor &styler, bool bElse, bool foldUtilityCmd ) |
|
| | | 107 | A | int style = styler.StyleAt(end); |
| | | 108 | A | |
| 68 | U | 109 | U | // If the word is too long, it is not what we are looking for |
|
| 69 | C | if( end - start > 13 ) | | 110 | C | if( end - start > 20 ) |
| 70 | U | 111 | U | return foldlevel; |
|
|
| | | 113 | C | if( foldUtilityCmd ) |
| | | 114 | C | { |
| 72 | C | // Check the style at this point, if it is not valid, then return zero | | 115 | C | // Check the style at this point, if it is not valid, then return zero |
| 73 | C | if( styler.StyleAt(end) != SCE_NSIS_FUNCTION && styler.StyleAt(end) != SCE_NSIS_SECTIONDEF && | | 116 | C | if( style != SCE_NSIS_FUNCTIONDEF && style != SCE_NSIS_SECTIONDEF && |
| 74 | C | styler.StyleAt(end) != SCE_NSIS_SUBSECTIONDEF && styler.StyleAt(end) != SCE_NSIS_IFDEFINEDEF && | | 117 | C | style != SCE_NSIS_SUBSECTIONDEF && style != SCE_NSIS_IFDEFINEDEF && |
| 75 | C | styler.StyleAt(end) != SCE_NSIS_MACRODEF ) | | 118 | C | style != SCE_NSIS_MACRODEF && style != SCE_NSIS_SECTIONGROUP && |
| | | 119 | C | style != SCE_NSIS_PAGEEX ) |
| | | 120 | C | return foldlevel; |
| | | 121 | C | } |
| | | 122 | C | else |
| | | 123 | C | { |
| | | 124 | C | if( style != SCE_NSIS_FUNCTIONDEF && style != SCE_NSIS_SECTIONDEF && |
| | | 125 | C | style != SCE_NSIS_SUBSECTIONDEF && style != SCE_NSIS_SECTIONGROUP && |
| | | 126 | C | style != SCE_NSIS_PAGEEX ) |
| 76 | C | return foldlevel; | | 127 | C | return foldlevel; |
| | | 128 | C | } |
|
| 78 | U | 130 | U | int newFoldlevel = foldlevel; |
|
| 79 | U | 131 | U | bool bIgnoreCase = false; |
|
| 80 | U | 132 | U | if( styler.GetPropertyInt("nsis.ignorecase") == 1 ) |
|
| 81 | U | 133 | U | bIgnoreCase = true; |
|
|
| 83 | C | char s[15]; // The key word we are looking for has atmost 13 characters | | 135 | C | char s[20]; // The key word we are looking for has atmost 13 characters |
| 84 | C | for (unsigned int i = 0; i < end - start + 1 && i < 14; i++) | | 136 | C | for (unsigned int i = 0; i < end - start + 1 && i < 19; i++) |
|
| 86 | U | 138 | U | s[i] = static_cast<char>( styler[ start + i ] ); |
|
|
| 5 skipped lines |
|
| 94 | U | 146 | U | else if( NsisCmp(s, "!endif", bIgnoreCase) == 0 || NsisCmp(s, "!macroend", bIgnoreCase ) == 0 ) |
|
|
| | | 148 | A | else if( bElse && NsisCmp(s, "!else", bIgnoreCase) == 0 ) |
| | | 149 | A | newFoldlevel++; |
|
|
|
| 99 | C | if( NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "Section", bIgnoreCase ) == 0 || NsisCmp(s, "SubSection", bIgnoreCase ) == 0 ) | | 153 | C | 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 ) |
|
| 101 | C | else if( NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 || NsisCmp(s, "SectionEnd", bIgnoreCase ) == 0 || NsisCmp(s, "SubSectionEnd", bIgnoreCase ) == 0 ) | | 155 | C | 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 ) |
|
|
| 104 | C | | | 158 | C | |
| 105 | U | 159 | U | return newFoldlevel; |
|
|
|
| 30 skipped lines |
| 138 | U | 192 | U | if( NsisCmp(s, "!ifdef", bIgnoreCase ) == 0 || NsisCmp(s, "!ifndef", bIgnoreCase) == 0 || NsisCmp(s, "!endif", bIgnoreCase) == 0 ) |
|
| 139 | U | 193 | U | return SCE_NSIS_IFDEFINEDEF; |
|
|
| | | 195 | A | if( NsisCmp(s, "!else", bIgnoreCase ) == 0 ) // || NsisCmp(s, "!ifndef", bIgnoreCase) == 0 || NsisCmp(s, "!endif", bIgnoreCase) == 0 ) |
| | | 196 | A | return SCE_NSIS_IFDEFINEDEF; |
| | | 197 | A | |
| | | 198 | A | if( NsisCmp(s, "SectionGroup", bIgnoreCase) == 0 || NsisCmp(s, "SectionGroupEnd", bIgnoreCase) == 0 ) // Covers SectionGroup and SectionGroupEnd |
| | | 199 | A | return SCE_NSIS_SECTIONGROUP; |
| | | 200 | A | |
| 141 | U | 201 | U | if( NsisCmp(s, "Section", bIgnoreCase ) == 0 || NsisCmp(s, "SectionEnd", bIgnoreCase) == 0 ) // Covers Section and SectionEnd |
|
| 142 | U | 202 | U | return SCE_NSIS_SECTIONDEF; |
|
|
| 144 | U | 204 | U | if( NsisCmp(s, "SubSection", bIgnoreCase) == 0 || NsisCmp(s, "SubSectionEnd", bIgnoreCase) == 0 ) // Covers SubSection and SubSectionEnd |
|
| 145 | U | 205 | U | return SCE_NSIS_SUBSECTIONDEF; |
|
|
| | | 207 | C | if( NsisCmp(s, "PageEx", bIgnoreCase) == 0 || NsisCmp(s, "PageExEnd", bIgnoreCase) == 0 ) // Covers PageEx and PageExEnd |
| | | 208 | C | return SCE_NSIS_PAGEEX; |
| | | 209 | C | |
| 147 | C | if( NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 ) // Covers SubSection and SubSectionEnd | | 210 | C | if( NsisCmp(s, "Function", bIgnoreCase) == 0 || NsisCmp(s, "FunctionEnd", bIgnoreCase) == 0 ) // Covers Function and FunctionEnd |
| 148 | C | return SCE_NSIS_FUNCTION; | | 211 | C | return SCE_NSIS_FUNCTIONDEF; |
|
| 150 | U | 213 | U | if ( Functions.InList(s) ) |
|
| 151 | U | 214 | U | return SCE_NSIS_FUNCTION; |
|
| 36 skipped lines |
| 188 | U | 251 | U | bool bHasSimpleNsisNumber = true; |
|
| 189 | U | 252 | U | for (unsigned int j = 1; j < end - start + 1 && j < 99; j++) |
|
|
| 191 | R | if( s[j] == '\0' || s[j] == '\r' || s[j] == '\n' ) | | |
| 192 | R | break; | | |
| 193 | R | | | |
| 194 | U | 254 | U | if( !isNsisNumber( s[j] ) ) |
|
|
| 196 | U | 256 | U | bHasSimpleNsisNumber = false; |
|
| 11 skipped lines |
| 208 | U | 268 | U | static void ColouriseNsisDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) |
|
|
| 210 | U | 270 | U | int state = SCE_NSIS_DEFAULT; |
|
| | | 271 | A | if( startPos > 0 ) |
| | | 272 | A | state = styler.StyleAt(startPos-1); // Use the style from the previous line, usually default, but could be commentbox |
| | | 273 | A | |
| 211 | U | 274 | U | styler.StartAt( startPos ); |
|
| 212 | U | 275 | U | styler.GetLine( startPos ); |
|
|
| 56 skipped lines |
|
|
|
| | | 336 | A | |
| | | 337 | A | if( cCurrChar == '/' && cNextChar == '*' ) |
| | | 338 | A | { |
| | | 339 | A | styler.ColourTo(i-1,state); |
| | | 340 | A | state = SCE_NSIS_COMMENTBOX; |
| | | 341 | A | break; |
| | | 342 | A | } |
| | | 343 | A | |
|
| 274 | U | 345 | U | case SCE_NSIS_COMMENT: |
|
| 275 | U | 346 | U | if( cNextChar == '\n' || cNextChar == '\r' ) |
|
|
| | | 348 | C | // Special case: |
| | | 349 | C | if( cCurrChar == '\\' ) |
| | | 350 | C | { |
| 277 | C | styler.ColourTo(i,state); | | 351 | C | styler.ColourTo(i-2,state); |
| | | 352 | C | styler.ColourTo(i,SCE_NSIS_DEFAULT); |
| | | 353 | C | } |
| | | 354 | C | else |
| | | 355 | C | { |
| | | 356 | C | styler.ColourTo(i,state); |
| 278 | C | state = SCE_NSIS_DEFAULT; | | 357 | C | state = SCE_NSIS_DEFAULT; |
| | | 358 | C | } |
|
|
| 281 | U | 361 | U | case SCE_NSIS_STRINGDQ: |
|
| | | 362 | C | case SCE_NSIS_STRINGLQ: |
| | | 363 | C | case SCE_NSIS_STRINGRQ: |
| | | 364 | C | |
| 282 | C | if( cCurrChar == '"' || cNextChar == '\r' || cNextChar == '\n' ) | | 365 | C | if( styler.SafeGetCharAt(i-1) == '\\' && styler.SafeGetCharAt(i-2) == '$' ) |
| | | 366 | C | break; // Ignore the next character, even if it is a quote of some sort |
| | | 367 | C | |
| | | 368 | C | if( cCurrChar == '"' && state == SCE_NSIS_STRINGDQ ) |
|
| 284 | C | styler.ColourTo(i,SCE_NSIS_STRINGDQ); | | 370 | C | styler.ColourTo(i,state); |
| 285 | U | 371 | U | state = SCE_NSIS_DEFAULT; |
|
| | | 372 | A | break; |
|
| 287 | C | break; | | 374 | C | |
| 288 | C | case SCE_NSIS_STRINGLQ: | | |
| 289 | C | if( cCurrChar == '`' || cNextChar == '\r' || cNextChar == '\n' ) | | 375 | C | if( cCurrChar == '`' && state == SCE_NSIS_STRINGLQ ) |
| 290 | C | { | | 376 | C | { |
| 291 | C | styler.ColourTo(i,SCE_NSIS_STRINGLQ); | | 377 | C | styler.ColourTo(i,state); |
| 292 | U | 378 | U | state = SCE_NSIS_DEFAULT; |
|
| | | 379 | A | break; |
|
| 294 | C | break; | | 381 | C | |
| 295 | C | case SCE_NSIS_STRINGRQ: | | |
| 296 | C | if( cCurrChar == '\'' || cNextChar == '\r' || cNextChar == '\n' ) | | 382 | C | if( cCurrChar == '\'' && state == SCE_NSIS_STRINGRQ ) |
|
| 298 | C | styler.ColourTo(i,SCE_NSIS_STRINGRQ); | | 384 | C | styler.ColourTo(i,state); |
| 299 | U | 385 | U | state = SCE_NSIS_DEFAULT; |
|
| | | 386 | A | break; |
|
| | | 388 | A | |
| | | 389 | A | if( cNextChar == '\r' || cNextChar == '\n' ) |
| | | 390 | A | { |
| | | 391 | A | int nCurLine = styler.GetLine(i+1); |
| | | 392 | A | int nBack = i; |
| 26 skipped lines |
| | | 419 | A | { |
| | | 420 | A | styler.ColourTo(i,state); |
| | | 421 | A | state = SCE_NSIS_DEFAULT; |
| | | 422 | A | } |
| | | 423 | A | } |
|
| | | 425 | A | |
| 302 | U | 426 | U | case SCE_NSIS_FUNCTION: |
|
|
| 304 | U | 428 | U | // NSIS KeyWord: |
|
| 3 skipped lines |
| 308 | U | 432 | U | state = SCE_NSIS_DEFAULT; |
|
| 309 | U | 433 | U | else if( (isNsisChar(cCurrChar) && !isNsisChar( cNextChar) && cNextChar != '}') || cCurrChar == '}' ) |
|
|
| 311 | C | state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler); | | 435 | C | state = classifyWordNsis( styler.GetStartSegment(), i, keywordLists, styler ); |
| 312 | U | 436 | U | styler.ColourTo( i, state); |
|
| 313 | U | 437 | U | state = SCE_NSIS_DEFAULT; |
|
|
| 28 skipped lines |
|
|
|
| | | 470 | A | case SCE_NSIS_COMMENTBOX: |
| | | 471 | A | |
| | | 472 | A | if( styler.SafeGetCharAt(i-1) == '*' && cCurrChar == '/' ) |
| | | 473 | A | { |
| | | 474 | A | styler.ColourTo(i,state); |
| | | 475 | A | state = SCE_NSIS_DEFAULT; |
| | | 476 | A | } |
| | | 477 | A | break; |
|
|
| 348 | C | if( state == SCE_NSIS_COMMENT ) | | 480 | C | if( state == SCE_NSIS_COMMENT || state == SCE_NSIS_COMMENTBOX ) |
|
| 350 | U | 482 | U | styler.ColourTo(i,state); |
|
|
| 9 skipped lines |
| 361 | U | 493 | U | bVarInString = false; |
|
| 362 | U | 494 | U | bIngoreNextDollarSign = true; |
|
|
| 364 | C | else if( bVarInString && cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) ) | | 496 | C | else if( bVarInString && cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' || cNextChar == '"' || cNextChar == '`' || cNextChar == '\'' ) ) |
|
| | | 498 | A | styler.ColourTo( i+1, SCE_NSIS_STRINGVAR); |
| 366 | U | 499 | U | bVarInString = false; |
|
| 367 | C | bIngoreNextDollarSign = true; | | 500 | C | bIngoreNextDollarSign = false; |
|
|
| 370 | U | 503 | U | // Covers "$INSTDIR and user vars like $MYVAR" |
|
| 30 skipped lines |
|
|
| 403 | U | 536 | U | // Colourise remaining document |
|
| 404 | C | switch( state ) | | |
| 405 | C | { | | |
| 406 | C | case SCE_NSIS_COMMENT: | | |
| 407 | C | case SCE_NSIS_STRINGDQ: | | |
| 408 | C | case SCE_NSIS_STRINGLQ: | | |
| 409 | C | case SCE_NSIS_STRINGRQ: | | |
| 410 | C | case SCE_NSIS_VARIABLE: | | |
| 411 | C | case SCE_NSIS_STRINGVAR: | | |
| 412 | C | styler.ColourTo(nLengthDoc-1,state); break; | | 537 | C | styler.ColourTo(nLengthDoc-1,state); |
| 413 | C | | | |
| 414 | C | default: | | |
| 415 | C | styler.ColourTo(nLengthDoc-1,SCE_NSIS_DEFAULT); break; | | |
| 416 | C | } | | |
|
|
| 419 | U | 540 | U | static void FoldNsisDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) |
|
| 2 skipped lines |
| 422 | U | 543 | U | if( styler.GetPropertyInt("fold") == 0 ) |
|
|
|
| | | 546 | A | bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) == 1; |
| | | 547 | A | bool foldUtilityCmd = styler.GetPropertyInt("nsis.foldutilcmd", 1) == 1; |
| | | 548 | A | bool blockComment = false; |
| | | 549 | A | |
| 425 | U | 550 | U | int lineCurrent = styler.GetLine(startPos); |
|
| 426 | U | 551 | U | unsigned int safeStartPos = styler.LineStart( lineCurrent ); |
|
|
| 4 skipped lines |
| 432 | U | 557 | U | if (lineCurrent > 0) |
|
| 433 | U | 558 | U | levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; |
|
| 434 | U | 559 | U | int levelNext = levelCurrent; |
|
| | | 560 | A | int style = styler.StyleAt(safeStartPos); |
| | | 561 | A | if( style == SCE_NSIS_COMMENTBOX ) |
| | | 562 | A | { |
| | | 563 | A | if( styler.SafeGetCharAt(safeStartPos) == '/' && styler.SafeGetCharAt(safeStartPos+1) == '*' ) |
| | | 564 | A | levelNext++; |
| | | 565 | A | blockComment = true; |
| | | 566 | A | } |
|
| 436 | U | 568 | U | for (unsigned int i = safeStartPos; i < startPos + length; i++) |
|
|
| 438 | U | 570 | U | char chCurr = styler.SafeGetCharAt(i); |
|
| | | 571 | A | style = styler.StyleAt(i); |
| | | 572 | A | if( blockComment && style != SCE_NSIS_COMMENTBOX ) |
| | | 573 | A | { |
| | | 574 | A | levelNext--; |
| | | 575 | A | blockComment = false; |
| | | 576 | A | } |
| | | 577 | A | else if( !blockComment && style == SCE_NSIS_COMMENTBOX ) |
| | | 578 | A | { |
| | | 579 | A | levelNext++; |
| | | 580 | A | blockComment = true; |
| | | 581 | A | } |
|
| 440 | C | if( bArg1 ) //&& chCurr != '\n' ) | | 583 | C | if( bArg1 && !blockComment) |
|
| 442 | U | 585 | U | if( nWordStart == -1 && (isNsisLetter(chCurr) || chCurr == '!') ) |
|
| | | 586 | A | { |
|
| | | 588 | C | } |
| 444 | C | else if( !isNsisLetter(chCurr) && nWordStart > -1 ) | | 589 | C | else if( isNsisLetter(chCurr) == false && nWordStart > -1 ) |
|
| 446 | C | int newLevel = calculateFoldNsis( nWordStart, i-1, levelNext, styler ); | | 591 | C | int newLevel = calculateFoldNsis( nWordStart, i-1, levelNext, styler, foldAtElse, foldUtilityCmd ); |
| | | 592 | C | |
| 447 | C | if( newLevel != levelNext ) | | 593 | C | if( newLevel == levelNext ) |
| | | 594 | C | { |
| | | 595 | C | if( foldAtElse && foldUtilityCmd ) |
| | | 596 | C | { |
| | | 597 | C | if( NsisNextLineHasElse(i, startPos + length, styler) ) |
| | | 598 | C | levelNext--; |
| | | 599 | C | } |
| | | 600 | C | } |
| | | 601 | C | else |
| 448 | U | 602 | U | levelNext = newLevel; |
|
|
|
| 1 skipped line |
|
| 453 | U | 607 | U | if( chCurr == '\n' ) |
|
|
| | | 609 | A | if( bArg1 && foldAtElse && foldUtilityCmd && !blockComment ) |
| | | 610 | A | { |
| | | 611 | A | if( NsisNextLineHasElse(i, startPos + length, styler) ) |
| | | 612 | A | levelNext--; |
| | | 613 | A | } |
| | | 614 | A | |
| 455 | U | 615 | U | // If we are on a new line... |
|
| 456 | U | 616 | U | int levelUse = levelCurrent; |
|
| 457 | U | 617 | U | int lev = levelUse | levelNext << 16; |
|
| 458 | C | if (levelUse < levelNext) | | 618 | C | if (levelUse < levelNext ) |
| 459 | U | 619 | U | lev |= SC_FOLDLEVELHEADERFLAG; |
|
| 460 | U | 620 | U | if (lev != styler.LevelAt(lineCurrent)) |
|
| 461 | U | 621 | U | styler.SetLevel(lineCurrent, lev); |
|
| 22 skipped lines |
|
|
| 486 | U | 646 | U | LexerModule lmNsis(SCLEX_NSIS, ColouriseNsisDoc, "nsis", FoldNsisDoc, nsisWordLists); |
|
| | | 647 | A | |
|