diff options
Diffstat (limited to 'src/LexMPT.cpp')
-rwxr-xr-x | src/LexMPT.cpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/LexMPT.cpp b/src/LexMPT.cpp new file mode 100755 index 0000000..1058b9b --- /dev/null +++ b/src/LexMPT.cpp @@ -0,0 +1,182 @@ +// Scintilla source code edit control +/** @file LexMPT.cxx + ** Lexer for MPT specific files. Based on LexOthers.cxx + ** LOT = the text log file created by the MPT application while running a test program + ** Other MPT specific files to be added later. + **/ +// Copyright 2003 by Marius Gheorghe <mgheorghe@cabletest.com> +// The License.txt file describes the conditions under which this software may be distributed. + +#include <string.h> +#include <stdio.h> +#include <ctype.h> +#include <stdlib.h> +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "SString.h" + +static int GetLotLineState(SString &line) { + if (line.length()) { + // Most of the time the first non-blank character in line determines that line's type + // Now finds the first non-blank character + unsigned i; // Declares counter here to make it persistent after the for loop + for (i = 0; i < line.length(); ++i) { + if (!isspace(line[i])) + break; + } + + // Checks if it was a blank line + if (i == line.length()) + return SCE_LOT_DEFAULT; + + switch (line[i]) { + case '*': // Fail measurement + return SCE_LOT_FAIL; + + case '+': // Header + case '|': // Header + return SCE_LOT_HEADER; + + case ':': // Set test limits + return SCE_LOT_SET; + + case '-': // Section break + return SCE_LOT_BREAK; + + default: // Any other line + // Checks for message at the end of lot file + if (line.contains("PASSED")) { + return SCE_LOT_PASS; + } + else if (line.contains("FAILED")) { + return SCE_LOT_FAIL; + } + else if (line.contains("ABORTED")) { + return SCE_LOT_ABORT; + } + else { + return i ? SCE_LOT_PASS : SCE_LOT_DEFAULT; + } + } + } + else { + return SCE_LOT_DEFAULT; + } +} + +static void ColourizeLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { + styler.StartAt(startPos); + styler.StartSegment(startPos); + bool atLineStart = true;// Arms the 'at line start' flag + char chNext = styler.SafeGetCharAt(startPos); + SString line(""); + line.setsizegrowth(256); // Lot lines are less than 256 chars long most of the time. This should avoid reallocations + + // Styles LOT document + unsigned int i; // Declared here because it's used after the for loop + for (i = startPos; i < startPos + length; ++i) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + line += ch; + atLineStart = false; + + // LOT files are only used on the Win32 platform, thus EOL == CR+LF + // Searches for the end of line + if (ch == '\r' && chNext == '\n') { + line += chNext; // Gets the '\n' + ++i; // Advances past the '\n' + chNext = styler.SafeGetCharAt(i + 1); // Gets character of next line + styler.ColourTo(i, GetLotLineState(line)); + line = ""; + atLineStart = true; // Arms flag for next line + } + } + + // Last line may not have a line ending + if (!atLineStart) { + styler.ColourTo(i - 1, GetLotLineState(line)); + } +} + +// Folds an MPT LOT file: the blocks that can be folded are: +// sections (headed by a set line) +// passes (contiguous pass results within a section) +// fails (contiguous fail results within a section) +static void FoldLotDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { + bool foldCompact = styler.GetPropertyInt("fold.compact", 0) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + + char chNext = styler.SafeGetCharAt(startPos); + int style = SCE_LOT_DEFAULT; + int styleNext = styler.StyleAt(startPos); + int lev = SC_FOLDLEVELBASE; + + // Gets style of previous line if not at the beginning of the document + if (startPos > 1) + style = styler.StyleAt(startPos - 2); + + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if (ch == '\r' && chNext == '\n') { + // TO DO: + // Should really get the state of the previous line from the styler + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 2); + + switch (style) { +/* + case SCE_LOT_SET: + lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG; + break; +*/ + case SCE_LOT_FAIL: +/* + if (stylePrev != SCE_LOT_FAIL) + lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG; + else + lev = SC_FOLDLEVELBASE + 1; +*/ + lev = SC_FOLDLEVELBASE; + break; + + default: + if (lineCurrent == 0 || stylePrev == SCE_LOT_FAIL) + lev = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG; + else + lev = SC_FOLDLEVELBASE + 1; + + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + break; + } + + if (lev != styler.LevelAt(lineCurrent)) + styler.SetLevel(lineCurrent, lev); + + lineCurrent++; + visibleChars = 0; + } + + if (!isspacechar(ch)) + visibleChars++; + } + + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, lev | flagsNext); +} + +static const char * const emptyWordListDesc[] = { + 0 +}; + +LexerModule lmLot(SCLEX_LOT, ColourizeLotDoc, "lot", FoldLotDoc, emptyWordListDesc); |