diff options
author | nyamatongwe <unknown> | 2000-03-16 11:43:39 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2000-03-16 11:43:39 +0000 |
commit | 35b3616d73451024b36279c4b8a05f19eeb17468 (patch) | |
tree | 3837357cf607234f40e4b4705c24da1e40ba0758 /src/LexVB.cxx | |
parent | 0e0ffc9c30980dd8f91b4b942407887841ee0235 (diff) | |
download | scintilla-mirror-35b3616d73451024b36279c4b8a05f19eeb17468.tar.gz |
Split up KeyWords.cxx into 7 individual lexer files Lex*.cxx.
Fixed setting up of second view to get right document length.
Changed Python lexer to handle empty lines immediately after fold line
and last line of document.
Diffstat (limited to 'src/LexVB.cxx')
-rw-r--r-- | src/LexVB.cxx | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/LexVB.cxx b/src/LexVB.cxx new file mode 100644 index 000000000..a78ea07b5 --- /dev/null +++ b/src/LexVB.cxx @@ -0,0 +1,118 @@ +// SciTE - Scintilla based Text Editor +// LexVB.cxx - lexer for Visual Basic and VBScript +// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> +// 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" + +static int classifyWordVB(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { + + char s[100]; + bool wordIsNumber = isdigit(styler[start]) || (styler[start] == '.'); + for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + s[i] = tolower(styler[start + i]); + s[i + 1] = '\0'; + } + char chAttr = SCE_C_DEFAULT; + if (wordIsNumber) + chAttr = SCE_C_NUMBER; + else { + if (keywords.InList(s)) { + chAttr = SCE_C_WORD; + if (strcmp(s, "rem") == 0) + chAttr = SCE_C_COMMENTLINE; + } + } + styler.ColourTo(end, chAttr); + if (chAttr == SCE_C_COMMENTLINE) + return SCE_C_COMMENTLINE; + else + return SCE_C_DEFAULT; +} + +static void ColouriseVBDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], StylingContext &styler) { + + WordList &keywords = *keywordlists[0]; + + styler.StartAt(startPos); + + int state = initStyle; + char chNext = styler[startPos]; + styler.StartSegment(startPos); + int lengthDoc = startPos + length; + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + i += 1; + continue; + } + + if (state == SCE_C_DEFAULT) { + if (iswordstart(ch)) { + styler.ColourTo(i - 1, state); + state = SCE_C_WORD; + } else if (ch == '\'') { + styler.ColourTo(i - 1, state); + state = SCE_C_COMMENTLINE; + } else if (ch == '\"') { + styler.ColourTo(i - 1, state); + state = SCE_C_STRING; + } + } else if (state == SCE_C_WORD) { + if (!iswordchar(ch)) { + state = classifyWordVB(styler.GetStartSegment(), i - 1, keywords, styler); + if (state == SCE_C_DEFAULT) { + if (ch == '\'') { + state = SCE_C_COMMENTLINE; + } else if (ch == '\"') { + state = SCE_C_STRING; + } + } + } + } else { + if (state == SCE_C_COMMENTLINE) { + if (ch == '\r' || ch == '\n') { + styler.ColourTo(i - 1, state); + state = SCE_C_DEFAULT; + } + } else if (state == SCE_C_STRING) { + // VB doubles quotes to preserve them + if (ch == '\"') { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + i++; + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + } + } + if (state == SCE_C_DEFAULT) { // One of the above succeeded + if (ch == '\'') { + state = SCE_C_COMMENTLINE; + } else if (ch == '\"') { + state = SCE_C_STRING; + } else if (iswordstart(ch)) { + state = SCE_C_WORD; + } + } + } + } + styler.ColourTo(lengthDoc, state); +} + +static LexerModule lmVB(SCLEX_VB, ColouriseVBDoc); |