aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/LexOthers.cxx74
1 files changed, 45 insertions, 29 deletions
diff --git a/src/LexOthers.cxx b/src/LexOthers.cxx
index 5e3da2d0a..f074a046d 100644
--- a/src/LexOthers.cxx
+++ b/src/LexOthers.cxx
@@ -20,6 +20,11 @@
#include "Scintilla.h"
#include "SciLexer.h"
+static inline AtEOL(Accessor &styler, unsigned int i) {
+ return (styler[i] == '\n') ||
+ ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n'));
+}
+
static void ColouriseBatchLine(
char *lineBuffer,
unsigned int lengthLine,
@@ -130,11 +135,11 @@ static void ColouriseBatchDoc(
styler.StartAt(startPos);
styler.StartSegment(startPos);
- unsigned int linePos = 0, startLine = startPos;
+ unsigned int linePos = 0;
+ unsigned int startLine = startPos;
for (unsigned int i = startPos; i < startPos + length; i++) {
lineBuffer[linePos++] = styler[i];
- if (styler[i] == '\r' || styler[i] == '\n' || (linePos >=
- sizeof(lineBuffer) - 1)) {
+ if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
// End of line (or of line buffer) met, colourise it
if (styler[i + 1] == '\n') {
lineBuffer[linePos++] = styler[++i];
@@ -145,8 +150,8 @@ static void ColouriseBatchDoc(
startLine = i + 1;
}
}
- if (linePos > 0) {
- ColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length,
+ if (linePos > 0) { // Last line does not have ending characters
+ ColouriseBatchLine(lineBuffer, linePos, startLine, startPos + length - 1,
keywords, styler);
}
}
@@ -182,13 +187,16 @@ static void ColouriseDiffDoc(unsigned int startPos, int length, int, WordList *[
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)) {
+ if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+ // End of line (or of line buffer) met, colourise it
+ lineBuffer[linePos] = '\0';
ColouriseDiffLine(lineBuffer, i, styler);
linePos = 0;
}
}
- if (linePos > 0)
- ColouriseDiffLine(lineBuffer, startPos + length, styler);
+ if (linePos > 0) { // Last line does not have ending characters
+ ColouriseDiffLine(lineBuffer, startPos + length - 1, styler);
+ }
}
static void ColourisePropsLine(
@@ -199,7 +207,7 @@ static void ColourisePropsLine(
Accessor &styler) {
unsigned int i = 0;
- while (isspacechar(lineBuffer[i]) && (i < lengthLine)) // Skip initial spaces
+ while ((i < lengthLine) && isspacechar(lineBuffer[i])) // Skip initial spaces
i++;
if (i < lengthLine) {
if (lineBuffer[i] == '#' || lineBuffer[i] == '!' || lineBuffer[i] == ';') {
@@ -213,18 +221,18 @@ static void ColourisePropsLine(
styler.ColourTo(endPos, 0);
} else {
// Search for the '=' character
- while (lineBuffer[i] != '=' && (i < lengthLine - 1))
+ while ((i < lengthLine) && (lineBuffer[i] != '='))
i++;
- if (lineBuffer[i] == '=') {
+ if ((i < lengthLine) && (lineBuffer[i] == '=')) {
styler.ColourTo(startLine + i - 1, 0);
styler.ColourTo(startLine + i, 3);
- styler.ColourTo(endPos-1, 0);
+ styler.ColourTo(endPos, 0);
} else {
- styler.ColourTo(endPos-1, 0);
+ styler.ColourTo(endPos, 0);
}
}
} else {
- styler.ColourTo(endPos-1, 0);
+ styler.ColourTo(endPos, 0);
}
}
@@ -232,20 +240,21 @@ static void ColourisePropsDoc(unsigned int startPos, int length, int, WordList *
char lineBuffer[1024];
styler.StartAt(startPos);
styler.StartSegment(startPos);
- unsigned int linePos = 0, startLine = startPos;
+ unsigned int linePos = 0;
+ unsigned 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)) {
+ if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+ // End of line (or of line buffer) met, colourise it
lineBuffer[linePos] = '\0';
ColourisePropsLine(lineBuffer, linePos, startLine, i, styler);
linePos = 0;
startLine = i + 1;
}
}
- if (linePos > 0)
- ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length, styler);
+ if (linePos > 0) { // Last line does not have ending characters
+ ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length - 1, styler);
+ }
}
static void ColouriseMakeLine(
@@ -281,6 +290,8 @@ static void ColouriseMakeLine(
}
if (!bSpecial) {
if (lineBuffer[i] == ':') {
+ // We should check that no colouring was made since the beginning of the line,
+ // to avoid colouring stuff like /OUT:file
styler.ColourTo(startLine + lastNonSpace, SCE_MAKE_TARGET);
styler.ColourTo(startLine + i - 1, SCE_MAKE_DEFAULT);
styler.ColourTo(startLine + i, SCE_MAKE_OPERATOR);
@@ -300,9 +311,9 @@ static void ColouriseMakeLine(
i++;
}
if (state == SCE_MAKE_IDENTIFIER) {
- styler.ColourTo(endPos-1, SCE_MAKE_IDEOL); // Error, variable reference not ended
+ styler.ColourTo(endPos, SCE_MAKE_IDEOL); // Error, variable reference not ended
} else {
- styler.ColourTo(endPos-1, SCE_MAKE_DEFAULT);
+ styler.ColourTo(endPos, SCE_MAKE_DEFAULT);
}
}
@@ -310,18 +321,20 @@ static void ColouriseMakeDoc(unsigned int startPos, int length, int, WordList *[
char lineBuffer[1024];
styler.StartAt(startPos);
styler.StartSegment(startPos);
- unsigned int linePos = 0, startLine = startPos;
+ unsigned int linePos = 0;
+ unsigned int startLine = startPos;
for (unsigned int i = startPos; i < startPos + length; i++) {
lineBuffer[linePos++] = styler[i];
- if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) {
+ if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+ // End of line (or of line buffer) met, colourise it
lineBuffer[linePos] = '\0';
ColouriseMakeLine(lineBuffer, linePos, startLine, i, styler);
linePos = 0;
startLine = i + 1;
}
}
- if (linePos > 0) {
- ColouriseMakeLine(lineBuffer, linePos, startLine, startPos + length, styler);
+ if (linePos > 0) { // Last line does not have ending characters
+ ColouriseMakeLine(lineBuffer, linePos, startLine, startPos + length - 1, styler);
}
}
@@ -415,13 +428,16 @@ static void ColouriseErrorListDoc(unsigned int startPos, int length, int, WordLi
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)) {
+ if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) {
+ // End of line (or of line buffer) met, colourise it
+ lineBuffer[linePos] = '\0';
ColouriseErrorListLine(lineBuffer, linePos, i, styler);
linePos = 0;
}
}
- if (linePos > 0)
- ColouriseErrorListLine(lineBuffer, linePos, startPos + length, styler);
+ if (linePos > 0) { // Last line does not have ending characters
+ ColouriseErrorListLine(lineBuffer, linePos, startPos + length - 1, styler);
+ }
}
static int isSpecial(char s) {