]>
git.saurik.com Git - wxWidgets.git/blob - contrib/src/stc/scintilla/src/LexVB.cxx
67dfa784276a84b25cb6dd813cdd41e53807d72a
1 // SciTE - Scintilla based Text Editor
2 // LexVB.cxx - lexer for Visual Basic and VBScript
3 // Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
4 // The License.txt file describes the conditions under which this software may be distributed.
17 #include "Scintilla.h"
20 static int classifyWordVB(unsigned int start
, unsigned int end
, WordList
&keywords
, Accessor
&styler
) {
23 bool wordIsNumber
= isdigit(styler
[start
]) || (styler
[start
] == '.') ||
24 (styler
[start
] == '&' && tolower(styler
[start
+1]) == 'h');
26 for (i
= 0; i
< end
- start
+ 1 && i
< 30; i
++) {
27 s
[i
] = static_cast<char>(tolower(styler
[start
+ i
]));
30 char chAttr
= SCE_C_DEFAULT
;
32 chAttr
= SCE_C_NUMBER
;
34 if (strcmp(s
, "rem") == 0)
35 chAttr
= SCE_C_COMMENTLINE
;
36 else if (keywords
.InList(s
))
39 styler
.ColourTo(end
, chAttr
);
40 if (chAttr
== SCE_C_COMMENTLINE
)
41 return SCE_C_COMMENTLINE
;
46 static void ColouriseVBDoc(unsigned int startPos
, int length
, int initStyle
,
47 WordList
*keywordlists
[], Accessor
&styler
) {
49 WordList
&keywords
= *keywordlists
[0];
51 styler
.StartAt(startPos
);
54 int state
= initStyle
;
55 char chNext
= styler
[startPos
];
56 styler
.StartSegment(startPos
);
57 int lengthDoc
= startPos
+ length
;
58 for (int i
= startPos
; i
< lengthDoc
; i
++) {
60 chNext
= styler
.SafeGetCharAt(i
+ 1);
62 if (styler
.IsLeadByte(ch
)) {
63 chNext
= styler
.SafeGetCharAt(i
+ 2);
68 if (ch
== '\r' || ch
== '\n') {
70 if (state
== SCE_C_COMMENTLINE
|| state
== SCE_C_PREPROCESSOR
) {
71 styler
.ColourTo(i
- 1, state
);
72 state
= SCE_C_DEFAULT
;
79 if (state
== SCE_C_DEFAULT
) {
80 if (iswordstart(ch
)) {
81 styler
.ColourTo(i
- 1, state
);
83 } else if (ch
== '\'') {
84 styler
.ColourTo(i
- 1, state
);
85 state
= SCE_C_COMMENTLINE
;
86 } else if (ch
== '\"') {
87 styler
.ColourTo(i
- 1, state
);
89 } else if (ch
== '#' && visibleChars
== 1) {
90 // Preprocessor commands are alone on their line
91 styler
.ColourTo(i
- 1, state
);
92 state
= SCE_C_PREPROCESSOR
;
93 } else if (ch
== '&' && tolower(chNext
) == 'h') {
94 styler
.ColourTo(i
- 1, state
);
96 } else if (isoperator(ch
)) {
97 styler
.ColourTo(i
- 1, state
);
98 styler
.ColourTo(i
, SCE_C_OPERATOR
);
100 } else if (state
== SCE_C_WORD
) {
101 if (!iswordchar(ch
)) {
102 state
= classifyWordVB(styler
.GetStartSegment(), i
- 1, keywords
, styler
);
103 if (state
== SCE_C_DEFAULT
) {
105 state
= SCE_C_COMMENTLINE
;
106 } else if (ch
== '\"') {
107 state
= SCE_C_STRING
;
108 } else if (isoperator(ch
)) {
109 styler
.ColourTo(i
- 1, state
);
110 styler
.ColourTo(i
, SCE_C_OPERATOR
);
115 if (state
== SCE_C_STRING
) {
116 // VB doubles quotes to preserve them
118 styler
.ColourTo(i
, state
);
119 state
= SCE_C_DEFAULT
;
122 chNext
= styler
.SafeGetCharAt(i
+ 1);
125 if (state
== SCE_C_DEFAULT
) { // One of the above succeeded
127 state
= SCE_C_COMMENTLINE
;
128 } else if (ch
== '\"') {
129 state
= SCE_C_STRING
;
130 } else if (iswordstart(ch
)) {
136 styler
.ColourTo(lengthDoc
, state
);
139 LexerModule
lmVB(SCLEX_VB
, ColouriseVBDoc
);