diff options
Diffstat (limited to 'src/LexProgress.cxx')
-rw-r--r-- | src/LexProgress.cxx | 279 |
1 files changed, 0 insertions, 279 deletions
diff --git a/src/LexProgress.cxx b/src/LexProgress.cxx deleted file mode 100644 index 9e1940e29..000000000 --- a/src/LexProgress.cxx +++ /dev/null @@ -1,279 +0,0 @@ -// Scintilla source code edit control -/** @file LexProgress.cxx - ** Lexer for Progress 4GL. - ** Based on LexCPP.cxx of Neil Hodgson <neilh@scintilla.org> - **/ -// Copyright 2006-2007 by Yuval Papish <Yuval@YuvCom.com> -// The License.txt file describes the conditions under which this software may be distributed. - -/** TODO: -WebSpeed support in html lexer -Support "end triggers" expression of the triggers phrase -Support more than 6 comments levels -**/ -#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 "StyleContext.h" -#include "KeyWords.h" -#include "Scintilla.h" -#include "SciLexer.h" - -#ifdef SCI_NAMESPACE -using namespace Scintilla; -#endif - -static inline bool IsAWordChar(int ch) { - return (ch < 0x80) && (isalnum(ch) || ch == '_'); -} - -static inline bool IsAWordStart(int ch) { - return (ch < 0x80) && (isalpha(ch) || ch == '_'); -} - -enum SentenceStart { SetSentenceStart = 0xf, ResetSentenceStart = 0x10}; // true -> bit = 0 - -static void Colourise4glDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], - Accessor &styler) { - - WordList &keywords1 = *keywordlists[0]; // regular keywords - WordList &keywords2 = *keywordlists[1]; // block opening keywords, only when SentenceStart - WordList &keywords3 = *keywordlists[2]; // block opening keywords - //WordList &keywords4 = *keywordlists[3]; // preprocessor keywords. Not implemented - - - int visibleChars = 0; - int mask; - - StyleContext sc(startPos, length, initStyle, styler); - - for (; sc.More(); sc.Forward()) { - - if (sc.atLineStart) { - // Reset states to begining of colourise so no surprises - // if different sets of lines lexed. - visibleChars = 0; - } - - // Handle line continuation generically. - if ((sc.state & 0xf) < SCE_4GL_COMMENT1) { - if (sc.ch == '~') { - if (sc.chNext > ' ') { - // skip special char after ~ - sc.Forward(); - continue; - } - else { - // Skip whitespace between ~ and EOL - while (sc.More() && (sc.chNext == ' ' || sc.chNext == '\t') ) { - sc.Forward(); - } - if (sc.chNext == '\n' || sc.chNext == '\r') { - sc.Forward(); - if (sc.ch == '\r' && sc.chNext == '\n') { - sc.Forward(); - } - sc.Forward(); - continue; - } - } - } - } - // Determine if a new state should be terminated. - mask = sc.state & 0x10; - switch (sc.state & 0xf) { - case SCE_4GL_OPERATOR: - sc.SetState(SCE_4GL_DEFAULT | mask); - break; - case SCE_4GL_NUMBER: - if (!(IsADigit(sc.ch))) { - sc.SetState(SCE_4GL_DEFAULT | mask); - } - break; - case SCE_4GL_IDENTIFIER: - if (!IsAWordChar(sc.ch) && sc.ch != '-') { - char s[1000]; - sc.GetCurrentLowered(s, sizeof(s)); - if ((((sc.state & 0x10) == 0) && keywords2.InList(s)) || keywords3.InList(s)) { - sc.ChangeState(SCE_4GL_BLOCK | ResetSentenceStart); - } - else if (keywords1.InList(s)) { - if ((s[0] == 'e' && s[1] =='n' && s[2] == 'd' && !isalnum(s[3]) && s[3] != '-') || - (s[0] == 'f' && s[1] =='o' && s[2] == 'r' && s[3] == 'w' && s[4] =='a' && s[5] == 'r' && s[6] == 'd'&& !isalnum(s[7]))) { - sc.ChangeState(SCE_4GL_END | ResetSentenceStart); - } - else if ((s[0] == 'e' && s[1] =='l' && s[2] == 's' && s[3] == 'e') || - (s[0] == 't' && s[1] =='h' && s[2] == 'e' && s[3] == 'n')) { - sc.ChangeState(SCE_4GL_WORD & SetSentenceStart); - } - else { - sc.ChangeState(SCE_4GL_WORD | ResetSentenceStart); - } - } - sc.SetState(SCE_4GL_DEFAULT | (sc.state & 0x10)); - } - break; - case SCE_4GL_PREPROCESSOR: - if (sc.atLineStart) { - sc.SetState(SCE_4GL_DEFAULT & SetSentenceStart); - } - /* code removed to allow comments inside preprocessor - else if (sc.ch == '*' && sc.chNext == '/') { - sc.ForwardSetState(SCE_4GL_DEFAULT | sentenceStartState); } */ - break; - case SCE_4GL_STRING: - if (sc.ch == '\"') { - sc.ForwardSetState(SCE_4GL_DEFAULT | mask); - } - break; - case SCE_4GL_CHARACTER: - if (sc.ch == '\'') { - sc.ForwardSetState(SCE_4GL_DEFAULT | mask); - } - break; - default: - if ((sc.state & 0xf) >= SCE_4GL_COMMENT1) { - if (sc.ch == '*' && sc.chNext == '/') { - sc.Forward(); - if ((sc.state & 0xf) == SCE_4GL_COMMENT1) { - sc.ForwardSetState(SCE_4GL_DEFAULT | mask); - } - else - sc.SetState((sc.state & 0x1f) - 1); - } else if (sc.ch == '/' && sc.chNext == '*') { - sc.Forward(); - sc.SetState((sc.state & 0x1f) + 1); - } - } - } - - // Determine if a new state should be entered. - mask = sc.state & 0x10; - if ((sc.state & 0xf) == SCE_4GL_DEFAULT) { - if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { - sc.SetState(SCE_4GL_NUMBER | ResetSentenceStart); - } else if (IsAWordStart(sc.ch) || (sc.ch == '@')) { - sc.SetState(SCE_4GL_IDENTIFIER | mask); - } else if (sc.ch == '/' && sc.chNext == '*') { - sc.SetState(SCE_4GL_COMMENT1 | mask); - sc.Forward(); - } else if (sc.ch == '\"') { - sc.SetState(SCE_4GL_STRING | ResetSentenceStart); - } else if (sc.ch == '\'') { - sc.SetState(SCE_4GL_CHARACTER | ResetSentenceStart); - } else if (sc.ch == '&' && visibleChars == 0 && ((sc.state & 0x10) == 0)) { - sc.SetState(SCE_4GL_PREPROCESSOR | ResetSentenceStart); - // Skip whitespace between & and preprocessor word - do { - sc.Forward(); - } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More()); - // Handle syntactical line termination - } else if ((sc.ch == '.' || sc.ch == ':' || sc.ch == '}') && (sc.chNext == ' ' || sc.chNext == '\t' || sc.chNext == '\n' || sc.chNext == '\r')) { - sc.SetState(sc.state & SetSentenceStart); - } else if (isoperator(static_cast<char>(sc.ch))) { - /* This code allows highlight of handles. Alas, it would cause the phrase "last-event:function" - to be recognized as a BlockBegin */ - - if (sc.ch == ':') - sc.SetState(SCE_4GL_OPERATOR & SetSentenceStart); - /* else */ - sc.SetState(SCE_4GL_OPERATOR | ResetSentenceStart); - } - } - - if (!IsASpace(sc.ch)) { - visibleChars++; - } - } - sc.Complete(); -} - -static bool IsStreamCommentStyle(int style) { - return (style & 0xf) >= SCE_4GL_COMMENT1 ; -} - -// Store both the current line's fold level and the next lines in the -// level store to make it easy to pick up with each increment -// and to make it possible to fiddle the current level for "} else {". -static void FoldNoBox4glDoc(unsigned int startPos, int length, int initStyle, - Accessor &styler) { - bool foldComment = styler.GetPropertyInt("fold.comment") != 0; - bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; - bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0; - unsigned int endPos = startPos + length; - int visibleChars = 0; - int lineCurrent = styler.GetLine(startPos); - int levelCurrent = SC_FOLDLEVELBASE; - if (lineCurrent > 0) - levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; - int levelMinCurrent = levelCurrent; - int levelNext = levelCurrent; - char chNext = static_cast<char>(tolower(styler[startPos])); - int styleNext = styler.StyleAt(startPos); - int style = initStyle; - for (unsigned int i = startPos; i < endPos; i++) { - char ch = chNext; - chNext = static_cast<char>(tolower(styler.SafeGetCharAt(i + 1))); - int stylePrev = style; - style = styleNext; - styleNext = styler.StyleAt(i + 1); - bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - if (foldComment && IsStreamCommentStyle(style)) { - if (!IsStreamCommentStyle(stylePrev)) { - levelNext++; - } else if (!IsStreamCommentStyle(styleNext)) { // && !atEOL) { - // Comments don't end at end of line and the next character may be unstyled. - levelNext--; - } - } - else if ((style & 0xf) == SCE_4GL_BLOCK && !isalnum(chNext)) { - levelNext++; - } - else if ((style & 0xf) == SCE_4GL_END && (ch == 'e' || ch == 'f')) { - levelNext--; - } - if (atEOL) { - int levelUse = levelCurrent; - if (foldAtElse) { - levelUse = levelMinCurrent; - } - int lev = levelUse | levelNext << 16; - if (visibleChars == 0 && foldCompact) - lev |= SC_FOLDLEVELWHITEFLAG; - if (levelUse < levelNext) - lev |= SC_FOLDLEVELHEADERFLAG; - if (lev != styler.LevelAt(lineCurrent)) { - styler.SetLevel(lineCurrent, lev); - } - lineCurrent++; - levelCurrent = levelNext; - levelMinCurrent = levelCurrent; - visibleChars = 0; - } - if (!isspacechar(ch)) - visibleChars++; - } -} - -static void Fold4glDoc(unsigned int startPos, int length, int initStyle, WordList *[], - Accessor &styler) { - FoldNoBox4glDoc(startPos, length, initStyle, styler); -} - -static const char * const FglWordLists[] = { - "Primary keywords and identifiers", - "Secondary keywords and identifiers", - "Documentation comment keywords", - "Unused", - "Global classes and typedefs", - 0, - }; - -LexerModule lmProgress(SCLEX_PROGRESS, Colourise4glDoc, "progress", Fold4glDoc, FglWordLists); |