]> git.saurik.com Git - wxWidgets.git/blame - src/stc/scintilla/lexers/LexMPT.cxx
Add missing WXK constants for the control keys
[wxWidgets.git] / src / stc / scintilla / lexers / LexMPT.cxx
CommitLineData
8e54aaed
RD
1// Scintilla source code edit control
2/** @file LexMPT.cxx
3 ** Lexer for MPT specific files. Based on LexOthers.cxx
4 ** LOT = the text log file created by the MPT application while running a test program
5 ** Other MPT specific files to be added later.
6 **/
7// Copyright 2003 by Marius Gheorghe <mgheorghe@cabletest.com>
8// The License.txt file describes the conditions under which this software may be distributed.
9
1dcf666d 10#include <stdlib.h>
8e54aaed
RD
11#include <string.h>
12#include <stdio.h>
1dcf666d
RD
13#include <stdarg.h>
14#include <assert.h>
8e54aaed 15#include <ctype.h>
9e96e16f
RD
16
17#include <string>
18
1dcf666d 19#include "ILexer.h"
8e54aaed
RD
20#include "Scintilla.h"
21#include "SciLexer.h"
8e54aaed 22
1dcf666d
RD
23#include "WordList.h"
24#include "LexAccessor.h"
25#include "Accessor.h"
26#include "StyleContext.h"
27#include "CharacterSet.h"
28#include "LexerModule.h"
29
7e0c58e9
RD
30#ifdef SCI_NAMESPACE
31using namespace Scintilla;
32#endif
33
9e96e16f 34static int GetLotLineState(std::string &line) {
8e54aaed
RD
35 if (line.length()) {
36 // Most of the time the first non-blank character in line determines that line's type
37 // Now finds the first non-blank character
38 unsigned i; // Declares counter here to make it persistent after the for loop
39 for (i = 0; i < line.length(); ++i) {
1dcf666d 40 if (!(isascii(line[i]) && isspace(line[i])))
8e54aaed
RD
41 break;
42 }
43
44 // Checks if it was a blank line
45 if (i == line.length())
46 return SCE_LOT_DEFAULT;
47
48 switch (line[i]) {
49 case '*': // Fail measurement
50 return SCE_LOT_FAIL;
51
52 case '+': // Header
53 case '|': // Header
54 return SCE_LOT_HEADER;
55
56 case ':': // Set test limits
57 return SCE_LOT_SET;
58
59 case '-': // Section break
60 return SCE_LOT_BREAK;
61
62 default: // Any other line
63 // Checks for message at the end of lot file
9e96e16f 64 if (line.find("PASSED") != std::string::npos) {
8e54aaed
RD
65 return SCE_LOT_PASS;
66 }
9e96e16f 67 else if (line.find("FAILED") != std::string::npos) {
8e54aaed
RD
68 return SCE_LOT_FAIL;
69 }
9e96e16f 70 else if (line.find("ABORTED") != std::string::npos) {
8e54aaed
RD
71 return SCE_LOT_ABORT;
72 }
73 else {
1dcf666d 74 return i ? SCE_LOT_PASS : SCE_LOT_DEFAULT;
8e54aaed
RD
75 }
76 }
77 }
78 else {
79 return SCE_LOT_DEFAULT;
80 }
81}
82
83static void ColourizeLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
84 styler.StartAt(startPos);
85 styler.StartSegment(startPos);
86 bool atLineStart = true;// Arms the 'at line start' flag
87 char chNext = styler.SafeGetCharAt(startPos);
9e96e16f
RD
88 std::string line("");
89 line.reserve(256); // Lot lines are less than 256 chars long most of the time. This should avoid reallocations
8e54aaed
RD
90
91 // Styles LOT document
92 unsigned int i; // Declared here because it's used after the for loop
93 for (i = startPos; i < startPos + length; ++i) {
94 char ch = chNext;
95 chNext = styler.SafeGetCharAt(i + 1);
96 line += ch;
97 atLineStart = false;
98
99 // LOT files are only used on the Win32 platform, thus EOL == CR+LF
100 // Searches for the end of line
101 if (ch == '\r' && chNext == '\n') {
102 line += chNext; // Gets the '\n'
103 ++i; // Advances past the '\n'
104 chNext = styler.SafeGetCharAt(i + 1); // Gets character of next line
105 styler.ColourTo(i, GetLotLineState(line));
106 line = "";
107 atLineStart = true; // Arms flag for next line
108 }
109 }
110
111 // Last line may not have a line ending
112 if (!atLineStart) {
113 styler.ColourTo(i - 1, GetLotLineState(line));
114 }
115}
116
117// Folds an MPT LOT file: the blocks that can be folded are:
118// sections (headed by a set line)
119// passes (contiguous pass results within a section)
120// fails (contiguous fail results within a section)
121static void FoldLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) {
122 bool foldCompact = styler.GetPropertyInt("fold.compact", 0) != 0;
123 unsigned int endPos = startPos + length;
124 int visibleChars = 0;
125 int lineCurrent = styler.GetLine(startPos);
126
127 char chNext = styler.SafeGetCharAt(startPos);
128 int style = SCE_LOT_DEFAULT;
129 int styleNext = styler.StyleAt(startPos);
130 int lev = SC_FOLDLEVELBASE;
131
132 // Gets style of previous line if not at the beginning of the document
133 if (startPos > 1)
134 style = styler.StyleAt(startPos - 2);
135
136 for (unsigned int i = startPos; i < endPos; i++) {
137 char ch = chNext;
138 chNext = styler.SafeGetCharAt(i + 1);
139
140 if (ch == '\r' && chNext == '\n') {
141 // TO DO:
142 // Should really get the state of the previous line from the styler
1dcf666d 143 int stylePrev = style;
8e54aaed
RD
144 style = styleNext;
145 styleNext = styler.StyleAt(i + 2);
1dcf666d 146
8e54aaed
RD
147 switch (style) {
148/*
149 case SCE_LOT_SET:
150 lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
151 break;
152*/
153 case SCE_LOT_FAIL:
154/*
1dcf666d 155 if (stylePrev != SCE_LOT_FAIL)
8e54aaed
RD
156 lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
157 else
158 lev = SC_FOLDLEVELBASE + 1;
159*/
160 lev = SC_FOLDLEVELBASE;
161 break;
162
163 default:
1dcf666d 164 if (lineCurrent == 0 || stylePrev == SCE_LOT_FAIL)
8e54aaed
RD
165 lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG;
166 else
167 lev = SC_FOLDLEVELBASE + 1;
168
169 if (visibleChars == 0 && foldCompact)
170 lev |= SC_FOLDLEVELWHITEFLAG;
171 break;
172 }
173
1dcf666d 174 if (lev != styler.LevelAt(lineCurrent))
8e54aaed
RD
175 styler.SetLevel(lineCurrent, lev);
176
177 lineCurrent++;
178 visibleChars = 0;
179 }
180
181 if (!isspacechar(ch))
182 visibleChars++;
183 }
184
185 int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK;
186 styler.SetLevel(lineCurrent, lev | flagsNext);
187}
188
189static const char * const emptyWordListDesc[] = {
190 0
191};
192
193LexerModule lmLot(SCLEX_LOT, ColourizeLotDoc, "lot", FoldLotDoc, emptyWordListDesc);