diff options
Diffstat (limited to 'src/LexOthers.cxx')
-rw-r--r-- | src/LexOthers.cxx | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/src/LexOthers.cxx b/src/LexOthers.cxx new file mode 100644 index 000000000..d2a0d563b --- /dev/null +++ b/src/LexOthers.cxx @@ -0,0 +1,200 @@ +// SciTE - Scintilla based Text Editor +// LexOthers.cxx - lexers for properties files, batch files, make files and error lists +// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <stdio.h> +#include <stdarg.h> + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +static void ColouriseBatchLine(char *lineBuffer, int endLine, StylingContext &styler) { + if (0 == strncmp(lineBuffer, "REM", 3)) { + styler.ColourTo(endLine, 1); + } else if (0 == strncmp(lineBuffer, "rem", 3)) { + styler.ColourTo(endLine, 1); + } else if (0 == strncmp(lineBuffer, "SET", 3)) { + styler.ColourTo(endLine, 2); + } else if (0 == strncmp(lineBuffer, "set", 3)) { + styler.ColourTo(endLine, 2); + } else if (lineBuffer[0] == ':') { + styler.ColourTo(endLine, 3); + } else { + styler.ColourTo(endLine, 0); + } +} + +static void ColouriseBatchDoc(unsigned int startPos, int length, int, WordList *[], StylingContext &styler) { + char lineBuffer[1024]; + styler.StartAt(startPos); + styler.StartSegment(startPos); + unsigned int linePos = 0; + for (unsigned int i = startPos; i < startPos + length; i++) { + lineBuffer[linePos++] = styler[i]; + if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) { + ColouriseBatchLine(lineBuffer, i, styler); + linePos = 0; + } + } + if (linePos > 0) + ColouriseBatchLine(lineBuffer, startPos + length, styler); +} + +static void ColourisePropsLine(char *lineBuffer, int lengthLine, int startLine, int endPos, StylingContext &styler) { + int i = 0; + while (isspace(lineBuffer[i]) && (i < lengthLine)) // Skip initial spaces + i++; + if (lineBuffer[i] == '#' || lineBuffer[i] == '!' || lineBuffer[i] == ';') { + styler.ColourTo(endPos, 1); + } else if (lineBuffer[i] == '[') { + styler.ColourTo(endPos, 2); + } else if (lineBuffer[i] == '@') { + styler.ColourTo(startLine+i, 4); + if (lineBuffer[++i] == '=') + styler.ColourTo(startLine+i, 3); + styler.ColourTo(endPos, 0); + } else { + while (lineBuffer[i] != '=' && (i < lengthLine)) // Search the '=' character + i++; + if (lineBuffer[i] == '=') { + styler.ColourTo(startLine+i-1, 0); + styler.ColourTo(startLine+i, 3); + styler.ColourTo(endPos, 0); + } else { + styler.ColourTo(endPos, 0); + } + } +} + +static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *[], StylingContext &styler) { + char lineBuffer[1024]; + styler.StartAt(startPos); + styler.StartSegment(startPos); + unsigned int linePos = 0; + int startLine = startPos; + for (unsigned int i = startPos; i <= startPos + length; i++) { + lineBuffer[linePos++] = styler[i]; + if ((styler[i] == '\r' && styler.SafeGetCharAt(i+1) != '\n') || + styler[i] == '\n' || + (linePos >= sizeof(lineBuffer) - 1)) { + lineBuffer[linePos] = '\0'; + ColourisePropsLine(lineBuffer, linePos, startLine, i, styler); + linePos = 0; + startLine = i+1; + } + } + if (linePos > 0) + ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length, styler); +} + +static void ColouriseMakeLine(char *lineBuffer, int lengthLine, int endPos, StylingContext &styler) { + int i = 0; + while (isspace(lineBuffer[i]) && (i < lengthLine)) + i++; + if (lineBuffer[i] == '#' || lineBuffer[i] == '!') { + styler.ColourTo(endPos, 1); + } else { + styler.ColourTo(endPos, 0); + } +} + +static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[], StylingContext &styler) { + char lineBuffer[1024]; + styler.StartAt(startPos); + styler.StartSegment(startPos); + unsigned int linePos = 0; + for (unsigned int i = startPos; i <= startPos + length; i++) { + lineBuffer[linePos++] = styler[i]; + if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) { + ColouriseMakeLine(lineBuffer, linePos, i, styler); + linePos = 0; + } + } + if (linePos > 0) + ColouriseMakeLine(lineBuffer, linePos, startPos + length, styler); +} + +static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos, StylingContext &styler) { + if (lineBuffer[0] == '>') { + // Command or return status + styler.ColourTo(endPos, 4); + } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) { + styler.ColourTo(endPos, 1); + } else if (0 == strncmp(lineBuffer, "Error ", strlen("Error "))) { + // Borland error message + styler.ColourTo(endPos, 5); + } else if (0 == strncmp(lineBuffer, "Warning ", strlen("Warning "))) { + // Borland warning message + styler.ColourTo(endPos, 5); + } else { + // Look for <filename>:<line>:message + // Look for <filename>(line)message + // Look for <filename>(line,pos)message + int state = 0; + for (int i = 0; i < lengthLine; i++) { + if (state == 0 && lineBuffer[i] == ':' && isdigit(lineBuffer[i + 1])) { + state = 1; + } else if (state == 0 && lineBuffer[i] == '(') { + state = 10; + } else if (state == 1 && isdigit(lineBuffer[i])) { + state = 2; + } else if (state == 2 && lineBuffer[i] == ':') { + state = 3; + break; + } else if (state == 2 && !isdigit(lineBuffer[i])) { + state = 99; + } else if (state == 10 && isdigit(lineBuffer[i])) { + state = 11; + } else if (state == 11 && lineBuffer[i] == ',') { + state = 14; + } else if (state == 11 && lineBuffer[i] == ')') { + state = 12; + break; + } else if (state == 12 && lineBuffer[i] == ':') { + state = 13; + } else if (state == 14 && lineBuffer[i] == ')') { + state = 15; + break; + } else if (((state == 11) || (state == 14)) && !((lineBuffer[i] == ' ') || isdigit(lineBuffer[i]))) { + state = 99; + } + } + if (state == 3) { + styler.ColourTo(endPos, 2); + } else if ((state == 14) || (state == 15)) { + styler.ColourTo(endPos, 3); + } else { + styler.ColourTo(endPos, 0); + } + } +} + +static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordList *[], StylingContext &styler) { + char lineBuffer[1024]; + styler.StartAt(startPos); + styler.StartSegment(startPos); + unsigned int linePos = 0; + for (unsigned int i = startPos; i <= startPos + length; i++) { + lineBuffer[linePos++] = styler[i]; + if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) { + ColouriseErrorListLine(lineBuffer, linePos, i, styler); + linePos = 0; + } + } + if (linePos > 0) + ColouriseErrorListLine(lineBuffer, linePos, startPos + length, styler); +} + +static LexerModule lmProps(SCLEX_PROPERTIES, ColourisePropsDoc); +static LexerModule lmErrorList(SCLEX_ERRORLIST, ColouriseErrorListDoc); +static LexerModule lmMake(SCLEX_MAKEFILE, ColouriseMakeDoc); +static LexerModule lmBatch(SCLEX_BATCH, ColouriseBatchDoc); |