1 // Copyright (c) 1990-2007, Scientific Toolworks, Inc.
\r
2 // Author: Jason Haslam
\r
3 // The License.txt file describes the conditions under which this software may be distributed.
\r
11 #include "Platform.h"
\r
13 #include "PropSet.h"
\r
14 #include "Accessor.h"
\r
15 #include "KeyWords.h"
\r
16 #include "Scintilla.h"
\r
17 #include "SciLexer.h"
\r
18 #include "StyleContext.h"
\r
20 #ifdef SCI_NAMESPACE
\r
21 using namespace Scintilla;
\r
24 static void GetRange(unsigned int start,
\r
30 while ((i < end - start + 1) && (i < len-1)) {
\r
31 s[i] = static_cast<char>(tolower(styler[start + i]));
\r
37 static void ColourisePlmDoc(unsigned int startPos,
\r
40 WordList *keywordlists[],
\r
43 unsigned int endPos = startPos + length;
\r
44 int state = initStyle;
\r
46 styler.StartAt(startPos);
\r
47 styler.StartSegment(startPos);
\r
49 for (unsigned int i = startPos; i < endPos; i++) {
\r
50 char ch = styler.SafeGetCharAt(i);
\r
51 char chNext = styler.SafeGetCharAt(i + 1);
\r
53 if (state == SCE_PLM_DEFAULT) {
\r
54 if (ch == '/' && chNext == '*') {
\r
55 styler.ColourTo(i - 1, state);
\r
56 state = SCE_PLM_COMMENT;
\r
57 } else if (ch == '\'') {
\r
58 styler.ColourTo(i - 1, state);
\r
59 state = SCE_PLM_STRING;
\r
60 } else if (isdigit(ch)) {
\r
61 styler.ColourTo(i - 1, state);
\r
62 state = SCE_PLM_NUMBER;
\r
63 } else if (isalpha(ch)) {
\r
64 styler.ColourTo(i - 1, state);
\r
65 state = SCE_PLM_IDENTIFIER;
\r
66 } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||
\r
67 ch == '=' || ch == '<' || ch == '>' || ch == ':') {
\r
68 styler.ColourTo(i - 1, state);
\r
69 state = SCE_PLM_OPERATOR;
\r
70 } else if (ch == '$') {
\r
71 styler.ColourTo(i - 1, state);
\r
72 state = SCE_PLM_CONTROL;
\r
74 } else if (state == SCE_PLM_COMMENT) {
\r
75 if (ch == '*' && chNext == '/') {
\r
77 styler.ColourTo(i, state);
\r
78 state = SCE_PLM_DEFAULT;
\r
80 } else if (state == SCE_PLM_STRING) {
\r
82 if (chNext == '\'') {
\r
85 styler.ColourTo(i, state);
\r
86 state = SCE_PLM_DEFAULT;
\r
89 } else if (state == SCE_PLM_NUMBER) {
\r
90 if (!isdigit(ch) && !isalpha(ch) && ch != '$') {
\r
92 styler.ColourTo(i, state);
\r
93 state = SCE_PLM_DEFAULT;
\r
95 } else if (state == SCE_PLM_IDENTIFIER) {
\r
96 if (!isdigit(ch) && !isalpha(ch) && ch != '$') {
\r
97 // Get the entire identifier.
\r
99 int segmentStart = styler.GetStartSegment();
\r
100 GetRange(segmentStart, i - 1, styler, word, sizeof(word));
\r
103 if (keywordlists[0]->InList(word))
\r
104 styler.ColourTo(i, SCE_PLM_KEYWORD);
\r
106 styler.ColourTo(i, state);
\r
107 state = SCE_PLM_DEFAULT;
\r
109 } else if (state == SCE_PLM_OPERATOR) {
\r
110 if (ch != '=' && ch != '>') {
\r
112 styler.ColourTo(i, state);
\r
113 state = SCE_PLM_DEFAULT;
\r
115 } else if (state == SCE_PLM_CONTROL) {
\r
116 if (ch == '\r' || ch == '\n') {
\r
117 styler.ColourTo(i - 1, state);
\r
118 state = SCE_PLM_DEFAULT;
\r
122 styler.ColourTo(endPos - 1, state);
\r
125 static void FoldPlmDoc(unsigned int startPos,
\r
131 bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
\r
132 bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
\r
133 unsigned int endPos = startPos + length;
\r
134 int visibleChars = 0;
\r
135 int lineCurrent = styler.GetLine(startPos);
\r
136 int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK;
\r
137 int levelCurrent = levelPrev;
\r
138 char chNext = styler[startPos];
\r
139 int styleNext = styler.StyleAt(startPos);
\r
140 int style = initStyle;
\r
141 int startKeyword = 0;
\r
143 for (unsigned int i = startPos; i < endPos; i++) {
\r
145 chNext = styler.SafeGetCharAt(i + 1);
\r
146 int stylePrev = style;
\r
148 styleNext = styler.StyleAt(i + 1);
\r
149 bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
\r
151 if (stylePrev != SCE_PLM_KEYWORD && style == SCE_PLM_KEYWORD)
\r
154 if (style == SCE_PLM_KEYWORD && styleNext != SCE_PLM_KEYWORD) {
\r
156 GetRange(startKeyword, i, styler, word, sizeof(word));
\r
158 if (strcmp(word, "procedure") == 0 || strcmp(word, "do") == 0)
\r
160 else if (strcmp(word, "end") == 0)
\r
165 if (stylePrev != SCE_PLM_COMMENT && style == SCE_PLM_COMMENT)
\r
167 else if (stylePrev == SCE_PLM_COMMENT && style != SCE_PLM_COMMENT)
\r
172 int lev = levelPrev;
\r
173 if (visibleChars == 0 && foldCompact)
\r
174 lev |= SC_FOLDLEVELWHITEFLAG;
\r
175 if ((levelCurrent > levelPrev) && (visibleChars > 0))
\r
176 lev |= SC_FOLDLEVELHEADERFLAG;
\r
177 if (lev != styler.LevelAt(lineCurrent)) {
\r
178 styler.SetLevel(lineCurrent, lev);
\r
181 levelPrev = levelCurrent;
\r
185 if (!isspacechar(ch))
\r
189 int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
\r
190 styler.SetLevel(lineCurrent, levelPrev | flagsNext);
\r
193 static const char *const plmWordListDesc[] = {
\r
198 LexerModule lmPLM(SCLEX_PLM, ColourisePlmDoc, "PL/M", FoldPlmDoc, plmWordListDesc);
\r