diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/LexMPT.cxx | 182 | 
1 files changed, 182 insertions, 0 deletions
| diff --git a/src/LexMPT.cxx b/src/LexMPT.cxx new file mode 100644 index 000000000..1058b9b49 --- /dev/null +++ b/src/LexMPT.cxx @@ -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); | 
