diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Accessor.cxx | 28 | ||||
-rw-r--r-- | src/KeyWords.cxx | 465 |
2 files changed, 196 insertions, 297 deletions
diff --git a/src/Accessor.cxx b/src/Accessor.cxx index 57b7e4dc4..60c5968c5 100644 --- a/src/Accessor.cxx +++ b/src/Accessor.cxx @@ -63,35 +63,31 @@ void StylingContext::StartAt(unsigned int start, char chMask) { Platform::SendScintilla(id, SCI_STARTSTYLING, start, chMask); } -void StylingContext::ColourSegment(unsigned int start, unsigned int end, int chAttr) { +void StylingContext::StartSegment(unsigned int pos) { + startSeg = pos; +} + +void StylingContext::ColourTo(unsigned int pos, int chAttr) { // Only perform styling if non empty range - if (end != start - 1) { - if (end < start) { - Platform::DebugPrintf("Bad colour positions %d - %d\n", start, end); + if (pos != startSeg - 1) { + if (pos < startSeg) { + Platform::DebugPrintf("Bad colour positions %d - %d\n", startSeg, pos); } - if (validLen + (end - start + 1) >= bufferSize) + if (validLen + (pos - startSeg + 1) >= bufferSize) Flush(); - if (validLen + (end - start + 1) >= bufferSize) { + if (validLen + (pos - startSeg + 1) >= bufferSize) { // Too big for buffer so send directly - Platform::SendScintilla(id, SCI_SETSTYLING, end - start + 1, chAttr); + Platform::SendScintilla(id, SCI_SETSTYLING, pos - startSeg + 1, chAttr); } else { if (chAttr != chWhile) chFlags = 0; chAttr |= chFlags; - for (unsigned int i = start; i <= end; i++) { + for (unsigned int i = startSeg; i <= pos; i++) { styleBuf[validLen++] = chAttr; } } } -} - -void StylingContext::StartSegment(unsigned int pos) { - startSeg = pos; -} - -void StylingContext::ColourTo(unsigned int pos, int chAttr) { - ColourSegment(startSeg, pos, chAttr); startSeg = pos+1; } diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 029db8064..cf5b3c0d6 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -113,7 +113,7 @@ static void classifyWordCpp(unsigned int start, unsigned int end, WordList &keyw if (keywords.InList(s)) chAttr = SCE_C_WORD; } - styler.ColourSegment(start, end, chAttr); + styler.ColourTo(end, chAttr); } static void ColouriseCppDoc(int codePage, int startPos, int length, @@ -127,9 +127,9 @@ static void ColouriseCppDoc(int codePage, int startPos, int length, int state = initStyle; char chPrev = ' '; char chNext = styler[startPos]; - int startSeg = startPos; unsigned int lengthDoc = startPos + length; int visChars = 0; + styler.StartSegment(startPos); for (unsigned int i = startPos; i <= lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); @@ -157,52 +157,43 @@ static void ColouriseCppDoc(int codePage, int startPos, int length, if (state == SCE_C_STRINGEOL) { if (ch != '\r' && ch != '\n') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_DEFAULT; - startSeg = i; } } if (state == SCE_C_DEFAULT) { if (iswordstart(ch)) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_WORD; - startSeg = i; } else if (ch == '/' && chNext == '*') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); if (styler.SafeGetCharAt(i + 2) == '*') state = SCE_C_COMMENTDOC; else state = SCE_C_COMMENT; - startSeg = i; } else if (ch == '/' && chNext == '/') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_COMMENTLINE; - startSeg = i; } else if (ch == '\"') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_STRING; - startSeg = i; } else if (ch == '\'') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_CHARACTER; - startSeg = i; } else if (ch == '#') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_PREPROCESSOR; - startSeg = i; } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i - 1, state); - styler.ColourSegment(i, i, SCE_C_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i-1, state); + styler.ColourTo(i, SCE_C_OPERATOR); if ((ch == '{') || (ch == '}')) { levelCurrent += (ch == '{') ? 1 : -1; } } } else if (state == SCE_C_WORD) { if (!iswordchar(ch)) { - classifyWordCpp(startSeg, i - 1, keywords, styler); + classifyWordCpp(styler.GetStartSegment(), i - 1, keywords, styler); state = SCE_C_DEFAULT; - startSeg = i; if (ch == '/' && chNext == '*') { if (styler.SafeGetCharAt(i + 2) == '*') state = SCE_C_COMMENTDOC; @@ -217,8 +208,7 @@ static void ColouriseCppDoc(int codePage, int startPos, int length, } else if (ch == '#') { state = SCE_C_PREPROCESSOR; } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i, SCE_C_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i, SCE_C_OPERATOR); if ((ch == '{') || (ch == '}')) { levelCurrent += (ch == '{') ? 1 : -1; } @@ -227,35 +217,36 @@ static void ColouriseCppDoc(int codePage, int startPos, int length, } else { if (state == SCE_C_PREPROCESSOR) { if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_DEFAULT; - startSeg = i; } } else if (state == SCE_C_COMMENT) { - if (ch == '/' && chPrev == '*' && ( - (i > startSeg + 2) || ((initStyle == SCE_C_COMMENT) && (startSeg == startPos)))) { - styler.ColourSegment(startSeg, i, state); - state = SCE_C_DEFAULT; - startSeg = i + 1; + if (ch == '/' && chPrev == '*') { + if (((i > styler.GetStartSegment() + 2) || ( + (initStyle == SCE_C_COMMENT) && + (styler.GetStartSegment() == startPos)))) { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + } } } else if (state == SCE_C_COMMENTDOC) { - if (ch == '/' && chPrev == '*' && ( - (i > startSeg + 3) || ((initStyle == SCE_C_COMMENTDOC) && (startSeg == startPos)))) { - styler.ColourSegment(startSeg, i, state); - state = SCE_C_DEFAULT; - startSeg = i + 1; + if (ch == '/' && chPrev == '*') { + if (((i > styler.GetStartSegment() + 3) || ( + (initStyle == SCE_C_COMMENTDOC) && + (styler.GetStartSegment() == startPos)))) { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + } } } else if (state == SCE_C_COMMENTLINE) { if (ch == '\r' || ch == '\n') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_DEFAULT; - startSeg = i; } } else if (state == SCE_C_STRING) { if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_STRINGEOL; - startSeg = i; } else if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; @@ -263,18 +254,16 @@ static void ColouriseCppDoc(int codePage, int startPos, int length, chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\"') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_C_DEFAULT; i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); - startSeg = i; } } else if (state == SCE_C_CHARACTER) { if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i-1, state); state = SCE_C_STRINGEOL; - startSeg = i; } else if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; @@ -282,12 +271,11 @@ static void ColouriseCppDoc(int codePage, int startPos, int length, chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\'') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_C_DEFAULT; i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); - startSeg = i; } } if (state == SCE_C_DEFAULT) { // One of the above succeeded @@ -307,8 +295,7 @@ static void ColouriseCppDoc(int codePage, int startPos, int length, } else if (iswordstart(ch)) { state = SCE_C_WORD; } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i, SCE_C_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i, SCE_C_OPERATOR); if ((ch == '{') || (ch == '}')) { levelCurrent += (ch == '{') ? 1 : -1; } @@ -317,8 +304,8 @@ static void ColouriseCppDoc(int codePage, int startPos, int length, } chPrev = ch; } - if (startSeg < lengthDoc) - styler.ColourSegment(startSeg, lengthDoc - 1, state); + styler.ColourTo(lengthDoc - 1, state); + // Fill in the real level of the next line, keeping the current flags as they will be filled in later if (fold) { int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; @@ -356,7 +343,7 @@ static int classifyWordPerl(unsigned int start, unsigned int end, WordList &keyw if (keywords.InList(s)) chAttr = SCE_PL_WORD; } - styler.ColourSegment(start, end, chAttr); + styler.ColourTo(end, chAttr); return chAttr; } @@ -423,7 +410,7 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty styler.StartAt(startPos); char chPrev = ' '; char chNext = styler[startPos]; - int startSeg = startPos; + styler.StartSegment(startPos); for (int i = startPos; i <= lengthDoc; i++) { char ch = chNext; chNext = styler.SafeGetCharAt(i + 1); @@ -438,33 +425,29 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty if (state == SCE_PL_DEFAULT) { if (iswordstart(ch)) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); if (ch == 's' && !isalnum(chNext)) { state = SCE_PL_REGSUBST; quotes = 0; quoteUp = '\0'; quoteDown = '\0'; quoteRep = 2; - startSeg = i; } else if (ch == 'm' && !isalnum(chNext)) { state = SCE_PL_REGEX; quotes = 0; quoteUp = '\0'; quoteDown = '\0'; quoteRep = 1; - startSeg = i; } else if (ch == 't' && chNext == 'r' && !isalnum(chNext2)) { state = SCE_PL_REGSUBST; quotes = 0; quoteUp = '\0'; quoteDown = '\0'; quoteRep = 2; - startSeg = i; i++; chNext = chNext2; } else if (ch == 'q' && (chNext == 'q' || chNext == 'r' || chNext == 'w' || chNext == 'x') && !isalnum(chNext2)) { state = SCE_PL_LONGQUOTE; - startSeg = i; i++; chNext = chNext2; quotes = 0; @@ -473,93 +456,75 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty quoteRep = 1; } else { state = SCE_PL_WORD; - startSeg = i; preferRE = false; } } else if (ch == '#') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_COMMENTLINE; - startSeg = i; } else if (ch == '\"') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_STRING; - startSeg = i; } else if (ch == '\'') { if (chPrev == '&') { // Archaic call - styler.ColourSegment(i, i, state); - startSeg = i + 1; + styler.ColourTo(i, state); } else { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_CHARACTER; - startSeg = i; } } else if (ch == '`') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_BACKTICKS; - startSeg = i; } else if (ch == '$') { preferRE = false; - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); if (isalnum(chNext) || chNext == '#' || chNext == '$' || chNext == '_') { state = SCE_PL_SCALAR; - startSeg = i; } else if (chNext != '{' && chNext != '[') { - styler.ColourSegment(i - 1, i, SCE_PL_SCALAR); + styler.ColourTo(i, SCE_PL_SCALAR); i++; - startSeg = i + 1; ch = ' '; chNext = ' '; } else { - styler.ColourSegment(i, i, SCE_PL_SCALAR); - startSeg = i + 1; + styler.ColourTo(i, SCE_PL_SCALAR); } } else if (ch == '@') { preferRE = false; - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') { state = SCE_PL_ARRAY; - startSeg = i; } else if (chNext != '{' && chNext != '[') { - styler.ColourSegment(i - 1, i, SCE_PL_ARRAY); + styler.ColourTo(i, SCE_PL_ARRAY); i++; - startSeg = i + 1; ch = ' '; } else { - styler.ColourSegment(i, i, SCE_PL_ARRAY); - startSeg = i + 1; + styler.ColourTo(i, SCE_PL_ARRAY); } } else if (ch == '%') { preferRE = false; - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); if (isalpha(chNext) || chNext == '#' || chNext == '$' || chNext == '_') { state = SCE_PL_HASH; - startSeg = i; } else if (chNext != '{' && chNext != '[') { - styler.ColourSegment(i - 1, i, SCE_PL_HASH); + styler.ColourTo(i, SCE_PL_HASH); i++; - startSeg = i + 1; ch = ' '; } else { - styler.ColourSegment(i, i, SCE_PL_HASH); - startSeg = i + 1; + styler.ColourTo(i, SCE_PL_HASH); } } else if (ch == '*') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_SYMBOLTABLE; - startSeg = i; } else if (ch == '/' && preferRE) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_REGEX; quoteUp = '/'; quoteDown = '/'; quotes = 1; quoteRep = 1; - startSeg = i; } else if (ch == '<' && chNext == '<') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_HERE; - startSeg = i; i++; ch = chNext; chNext = chNext2; @@ -567,9 +532,8 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty sookedpos = 0; sooked[sookedpos] = '\0'; } else if (ch == '=' && isalpha(chNext)) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_POD; - startSeg = i; quotes = 0; sookedpos = 0; sooked[sookedpos] = '\0'; @@ -578,23 +542,21 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty preferRE = false; else preferRE = true; - styler.ColourSegment(startSeg, i - 1, state); - styler.ColourSegment(i, i, SCE_PL_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_PL_OPERATOR); } } else if (state == SCE_PL_WORD) { if (!iswordchar(ch) && ch != '\'') { // Archaic Perl has quotes inside names - if (isMatch(styler, lengthDoc, startSeg, "__DATA__")) { - styler.ColourSegment(startSeg, i, SCE_PL_DATASECTION); + if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__DATA__")) { + styler.ColourTo(i, SCE_PL_DATASECTION); state = SCE_PL_DATASECTION; - } else if (isMatch(styler, lengthDoc, startSeg, "__END__")) { - styler.ColourSegment(startSeg, i, SCE_PL_DATASECTION); + } else if (isMatch(styler, lengthDoc, styler.GetStartSegment(), "__END__")) { + styler.ColourTo(i, SCE_PL_DATASECTION); state = SCE_PL_DATASECTION; } else { - if (classifyWordPerl(startSeg, i - 1, keywords, styler) == SCE_PL_WORD) + if (classifyWordPerl(styler.GetStartSegment(), i - 1, keywords, styler) == SCE_PL_WORD) preferRE = true; state = SCE_PL_DEFAULT; - startSeg = i; if (ch == '#') { state = SCE_PL_COMMENTLINE; } else if (ch == '\"') { @@ -604,7 +566,6 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty } else if (ch == '<' && chNext == '<') { state = SCE_PL_HERE; quotes = 0; - startSeg = i; sookedpos = 0; sooked[sookedpos] = '\0'; } else if (isPerlOperator(ch)) { @@ -612,18 +573,16 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty preferRE = false; else preferRE = true; - styler.ColourSegment(startSeg, i, SCE_PL_OPERATOR); + styler.ColourTo(i, SCE_PL_OPERATOR); state = SCE_PL_DEFAULT; - startSeg = i + 1; } } } } else { if (state == SCE_PL_COMMENTLINE) { if (ch == '\r' || ch == '\n') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_PL_DEFAULT; - startSeg = i; } } else if (state == SCE_PL_HERE) { if (isalnum(ch) && quotes < 2) { @@ -636,10 +595,9 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty } if (quotes > 1 && isMatch(styler, lengthDoc, i, sooked)) { - styler.ColourSegment(startSeg, i + sookedpos - 1, SCE_PL_HERE); + styler.ColourTo(i + sookedpos - 1, SCE_PL_HERE); state = SCE_PL_DEFAULT; i += sookedpos; - startSeg = i; chNext = ' '; } } else if (state == SCE_PL_STRING) { @@ -650,12 +608,11 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\"') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_PL_DEFAULT; i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); - startSeg = i; } } else if (state == SCE_PL_CHARACTER) { if (ch == '\\') { @@ -665,28 +622,25 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\'') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_PL_DEFAULT; i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); - startSeg = i; } } else if (state == SCE_PL_BACKTICKS) { if (ch == '`') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_PL_DEFAULT; i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); - startSeg = i; } } else if (state == SCE_PL_POD) { if (ch == '=') { if (isMatch(styler, lengthDoc, i, "=cut")) { - styler.ColourSegment(startSeg, i - 1 + 4, state); + styler.ColourTo(i - 1 + 4, state); i += 4; - startSeg = i; state = SCE_PL_DEFAULT; chNext = ' '; ch = ' '; @@ -694,32 +648,27 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty } } else if (state == SCE_PL_SCALAR) { if (isEndVar(ch)) { - styler.ColourSegment(startSeg, i - 1, state); - startSeg = i; + styler.ColourTo(i - 1, state); state = SCE_PL_DEFAULT; } } else if (state == SCE_PL_ARRAY) { if (isEndVar(ch)) { - styler.ColourSegment(startSeg, i - 1, state); - startSeg = i; + styler.ColourTo(i - 1, state); state = SCE_PL_DEFAULT; } } else if (state == SCE_PL_HASH) { if (isEndVar(ch)) { - styler.ColourSegment(startSeg, i - 1, state); - startSeg = i; + styler.ColourTo(i - 1, state); state = SCE_PL_DEFAULT; } } else if (state == SCE_PL_SYMBOLTABLE) { if (isEndVar(ch)) { - styler.ColourSegment(startSeg, i - 1, state); - startSeg = i; + styler.ColourTo(i - 1, state); state = SCE_PL_DEFAULT; } } else if (state == SCE_PL_REF) { if (isEndVar(ch)) { - styler.ColourSegment(startSeg, i - 1, state); - startSeg = i; + styler.ColourTo(i - 1, state); state = SCE_PL_DEFAULT; } } else if (state == SCE_PL_REGEX) { @@ -738,8 +687,7 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty } if (!isalpha(chNext)) { if (quoteRep <= 0) { - styler.ColourSegment(startSeg, i, state); - startSeg = i + 1; + styler.ColourTo(i, state); state = SCE_PL_DEFAULT; ch = ' '; } @@ -748,8 +696,7 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty quotes++; } else if (!isalpha(chNext)) { if (quoteRep <= 0) { - styler.ColourSegment(startSeg, i, state); - startSeg = i + 1; + styler.ColourTo(i, state); state = SCE_PL_DEFAULT; ch = ' '; } @@ -768,8 +715,7 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty } if (!isalpha(chNext)) { if (quoteRep <= 0) { - styler.ColourSegment(startSeg, i, state); - startSeg = i + 1; + styler.ColourTo(i, state); state = SCE_PL_DEFAULT; ch = ' '; } @@ -781,8 +727,7 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty quotes++; } else if (!isalpha(chNext)) { if (quoteRep <= 0) { - styler.ColourSegment(startSeg, i, state); - startSeg = i + 1; + styler.ColourTo(i, state); state = SCE_PL_DEFAULT; ch = ' '; } @@ -798,8 +743,7 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty if (quotes == 0) { quoteRep--; if (quoteRep <= 0) { - styler.ColourSegment(startSeg, i, state); - startSeg = i + 1; + styler.ColourTo(i, state); state = SCE_PL_DEFAULT; ch = ' '; } @@ -823,15 +767,13 @@ static void ColourisePerlDoc(int codePage, int startPos, int length, int initSty state = SCE_PL_WORD; preferRE = false; } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i, SCE_PL_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i, SCE_PL_OPERATOR); } } } chPrev = ch; } - if (startSeg < lengthDoc) - styler.ColourSegment(startSeg, lengthDoc, state); + styler.ColourTo(lengthDoc, state); } @@ -852,7 +794,7 @@ static int classifyWordVB(unsigned int start, unsigned int end, WordList &keywor chAttr = SCE_C_COMMENTLINE; } } - styler.ColourSegment(start, end, chAttr); + styler.ColourTo(end, chAttr); if (chAttr == SCE_C_COMMENTLINE) return SCE_C_COMMENTLINE; else @@ -863,7 +805,7 @@ static void ColouriseVBDoc(int codePage, int startPos, int length, int initStyle WordList &keywords, StylingContext &styler) { int state = initStyle; char chNext = styler[startPos]; - int startSeg = startPos; + styler.StartSegment(startPos); int lengthDoc = startPos + length; for (int i = startPos; i < lengthDoc; i++) { char ch = chNext; @@ -877,23 +819,19 @@ static void ColouriseVBDoc(int codePage, int startPos, int length, int initStyle if (state == SCE_C_DEFAULT) { if (iswordstart(ch)) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_WORD; - startSeg = i; } else if (ch == '\'') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_COMMENTLINE; - startSeg = i; } else if (ch == '\"') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_STRING; - startSeg = i; } } else if (state == SCE_C_WORD) { if (!iswordchar(ch)) { - state = classifyWordVB(startSeg, i - 1, keywords, styler); + state = classifyWordVB(styler.GetStartSegment(), i - 1, keywords, styler); if (state == SCE_C_DEFAULT) { - startSeg = i; if (ch == '\'') { state = SCE_C_COMMENTLINE; } else if (ch == '\"') { @@ -904,19 +842,17 @@ static void ColouriseVBDoc(int codePage, int startPos, int length, int initStyle } else { if (state == SCE_C_COMMENTLINE) { if (ch == '\r' || ch == '\n') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_DEFAULT; - startSeg = i; } } else if (state == SCE_C_STRING) { // VB doubles quotes to preserve them if (ch == '\"') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_C_DEFAULT; i++; ch = chNext; chNext = styler.SafeGetCharAt(i + 1); - startSeg = i; } } if (state == SCE_C_DEFAULT) { // One of the above succeeded @@ -930,8 +866,7 @@ static void ColouriseVBDoc(int codePage, int startPos, int length, int initStyle } } } - if (startSeg < lengthDoc) - styler.ColourSegment(startSeg, lengthDoc, state); + styler.ColourTo(lengthDoc, state); } static void classifyWordPy(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler, char *prevWord) { @@ -950,7 +885,7 @@ static void classifyWordPy(unsigned int start, unsigned int end, WordList &keywo chAttr = SCE_P_NUMBER; else if (keywords.InList(s)) chAttr = SCE_P_WORD; - styler.ColourSegment(start, end, chAttr); + styler.ColourTo(end, chAttr); strcpy(prevWord, s); } @@ -976,7 +911,7 @@ static void ColourisePyDoc(int codePage, int startPos, int length, int initStyle char chPrev2 = ' '; char chNext = styler[startPos]; char chNext2 = styler[startPos]; - int startSeg = startPos; + styler.StartSegment(startPos); int lengthDoc = startPos + length; bool atStartLine = true; for (int i = startPos; i <= lengthDoc; i++) { @@ -1002,8 +937,7 @@ static void ColourisePyDoc(int codePage, int startPos, int length, int initStyle if ((state == SCE_P_DEFAULT) || (state == SCE_P_TRIPLE) || (state == SCE_P_TRIPLEDOUBLE)) { // Perform colourisation of white space and triple quoted strings at end of each line to allow // tab marking to work inside white space and triple quoted strings - styler.ColourSegment(startSeg, i, state); - startSeg = i + 1; + styler.ColourTo(i, state); } int lev = indentCurrent; @@ -1032,23 +966,19 @@ static void ColourisePyDoc(int codePage, int startPos, int length, int initStyle if (state == SCE_P_STRINGEOL) { if (ch != '\r' && ch != '\n') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_P_DEFAULT; - startSeg = i; } } if (state == SCE_P_DEFAULT) { if (iswordstart(ch)) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_P_WORD; - startSeg = i; } else if (ch == '#') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE; - startSeg = i; } else if (ch == '\"') { - styler.ColourSegment(startSeg, i - 1, state); - startSeg = i; + styler.ColourTo(i - 1, state); if (chNext == '\"' && chNext2 == '\"') { i += 2; state = SCE_P_TRIPLEDOUBLE; @@ -1059,8 +989,7 @@ static void ColourisePyDoc(int codePage, int startPos, int length, int initStyle state = SCE_P_STRING; } } else if (ch == '\'') { - styler.ColourSegment(startSeg, i - 1, state); - startSeg = i; + styler.ColourTo(i - 1, state); if (chNext == '\'' && chNext2 == '\'') { i += 2; state = SCE_P_TRIPLE; @@ -1071,15 +1000,13 @@ static void ColourisePyDoc(int codePage, int startPos, int length, int initStyle state = SCE_P_CHARACTER; } } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i - 1, state); - styler.ColourSegment(i, i, SCE_P_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_P_OPERATOR); } } else if (state == SCE_P_WORD) { if (!iswordchar(ch)) { - classifyWordPy(startSeg, i - 1, keywords, styler, prevWord); + classifyWordPy(styler.GetStartSegment(), i - 1, keywords, styler, prevWord); state = SCE_P_DEFAULT; - startSeg = i; if (ch == '#') { state = chNext == '#' ? SCE_P_COMMENTBLOCK : SCE_P_COMMENTLINE; } else if (ch == '\"') { @@ -1103,22 +1030,19 @@ static void ColourisePyDoc(int codePage, int startPos, int length, int initStyle state = SCE_P_CHARACTER; } } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i, SCE_P_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i, SCE_P_OPERATOR); } } } else { if (state == SCE_P_COMMENTLINE || state == SCE_P_COMMENTBLOCK) { if (ch == '\r' || ch == '\n') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_P_DEFAULT; - startSeg = i; } } else if (state == SCE_P_STRING) { if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_P_STRINGEOL; - startSeg = i; } else if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; @@ -1126,15 +1050,13 @@ static void ColourisePyDoc(int codePage, int startPos, int length, int initStyle chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\"') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_P_DEFAULT; - startSeg = i + 1; } } else if (state == SCE_P_CHARACTER) { if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_P_STRINGEOL; - startSeg = i; } else if (ch == '\\') { if (chNext == '\"' || chNext == '\'' || chNext == '\\') { i++; @@ -1142,76 +1064,60 @@ static void ColourisePyDoc(int codePage, int startPos, int length, int initStyle chNext = styler.SafeGetCharAt(i + 1); } } else if (ch == '\'') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_P_DEFAULT; - startSeg = i + 1; } } else if (state == SCE_P_TRIPLE) { if (ch == '\'' && chPrev == '\'' && chPrev2 == '\'') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_P_DEFAULT; - startSeg = i + 1; } } else if (state == SCE_P_TRIPLEDOUBLE) { if (ch == '\"' && chPrev == '\"' && chPrev2 == '\"') { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_P_DEFAULT; - startSeg = i + 1; } } } chPrev2 = chPrev; chPrev = ch; } - if (startSeg <= lengthDoc) { - if (state == SCE_P_DEFAULT) { - styler.ColourSegment(startSeg, lengthDoc, state); - } else if (state == SCE_P_WORD) { - classifyWordPy(startSeg, lengthDoc, keywords, styler, prevWord); - } else if (state == SCE_P_COMMENTLINE) { - styler.ColourSegment(startSeg, lengthDoc, state); - } else if (state == SCE_P_COMMENTBLOCK) { - styler.ColourSegment(startSeg, lengthDoc, state); - } else if (state == SCE_P_STRING) { - styler.ColourSegment(startSeg, lengthDoc, state); - } else if (state == SCE_P_CHARACTER) { - styler.ColourSegment(startSeg, lengthDoc, state); - } else if (state == SCE_P_TRIPLE) { - styler.ColourSegment(startSeg, lengthDoc, state); - } else if (state == SCE_P_TRIPLEDOUBLE) { - styler.ColourSegment(startSeg, lengthDoc, state); - } + if (state == SCE_P_WORD) { + classifyWordPy(styler.GetStartSegment(), lengthDoc, keywords, styler, prevWord); + } else { + styler.ColourTo(lengthDoc, state); } } -static void ColouriseBatchLine(char *lineBuffer, int lengthLine, StylingContext &styler) { +static void ColouriseBatchLine(char *lineBuffer, int endLine, StylingContext &styler) { if (0 == strncmp(lineBuffer, "REM", 3)) { - styler.ColourSegment(0, lengthLine - 1, 1); + styler.ColourTo(endLine, 1); } else if (0 == strncmp(lineBuffer, "rem", 3)) { - styler.ColourSegment(0, lengthLine - 1, 1); + styler.ColourTo(endLine, 1); } else if (0 == strncmp(lineBuffer, "SET", 3)) { - styler.ColourSegment(0, lengthLine - 1, 2); + styler.ColourTo(endLine, 2); } else if (0 == strncmp(lineBuffer, "set", 3)) { - styler.ColourSegment(0, lengthLine - 1, 2); + styler.ColourTo(endLine, 2); } else if (lineBuffer[0] == ':') { - styler.ColourSegment(0, lengthLine - 1, 3); + styler.ColourTo(endLine, 3); } else { - styler.ColourSegment(0, lengthLine - 1, 0); + styler.ColourTo(endLine, 0); } } static void ColouriseBatchDoc(int startPos, int length, int, StylingContext &styler) { char lineBuffer[1024]; + styler.StartSegment(startPos); unsigned int linePos = 0; for (int i = startPos; i < startPos + length; i++) { lineBuffer[linePos++] = styler[i]; if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) { - ColouriseBatchLine(lineBuffer, linePos, styler); + ColouriseBatchLine(lineBuffer, i, styler); linePos = 0; } } if (linePos > 0) - ColouriseBatchLine(lineBuffer, linePos, styler); + ColouriseBatchLine(lineBuffer, startPos + length, styler); } enum { eScriptNone, eScriptJS, eScriptVBS, eScriptPython }; @@ -2327,85 +2233,90 @@ static void ColouriseHyperTextDoc(int codePage, int startPos, int length, styler.ColourTo(lengthDoc - 1, state); } -static void ColourisePropsLine(char *lineBuffer, int lengthLine, StylingContext &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.ColourSegment(0, lengthLine - 1, 1); + styler.ColourTo(endPos, 1); } else if (lineBuffer[i] == '[') { - styler.ColourSegment(0, lengthLine - 1, 2); + styler.ColourTo(endPos, 2); } else if (lineBuffer[i] == '@') { - styler.ColourSegment(0, i, 4); + styler.ColourTo(startLine+i, 4); if (lineBuffer[++i] == '=') - styler.ColourSegment(i, i, 3); - if (++i < lengthLine) - styler.ColourSegment(i, lengthLine - 1, 0); + styler.ColourTo(startLine+i, 3); + styler.ColourTo(endPos, 0); } else { while (lineBuffer[i] != '=' && (i < lengthLine)) // Search the '=' character i++; if (lineBuffer[i] == '=') { - styler.ColourSegment(0, i - 1, 0); - styler.ColourSegment(i, i, 3); - if (++i < lengthLine) - styler.ColourSegment(i, lengthLine - 1, 0); - } else - styler.ColourSegment(0, lengthLine - 1, 0); + styler.ColourTo(startLine+i-1, 0); + styler.ColourTo(startLine+i, 3); + styler.ColourTo(endPos, 0); + } else { + styler.ColourTo(endPos, 0); + } } } static void ColourisePropsDoc(int startPos, int length, int, StylingContext &styler) { char lineBuffer[1024]; + styler.StartSegment(startPos); unsigned int linePos = 0; + int startLine = startPos; for (int i = startPos; i <= startPos + length; i++) { lineBuffer[linePos++] = styler[i]; - if (styler[i] == '\r' || styler[i] == '\n' || (linePos >= sizeof(lineBuffer) - 1)) { + if ((styler[i] == '\r' && styler.SafeGetCharAt(i+1) != '\n') || + styler[i] == '\n' || + (linePos >= sizeof(lineBuffer) - 1)) { lineBuffer[linePos] = '\0'; - ColourisePropsLine(lineBuffer, linePos, styler); + ColourisePropsLine(lineBuffer, linePos, startLine, i, styler); linePos = 0; + startLine = i+1; } } if (linePos > 0) - ColourisePropsLine(lineBuffer, linePos, styler); + ColourisePropsLine(lineBuffer, linePos, startLine, startPos + length, styler); } -static void ColouriseMakeLine(char *lineBuffer, int lengthLine, StylingContext &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.ColourSegment(0, lengthLine - 1, 1); + styler.ColourTo(endPos, 1); } else { - styler.ColourSegment(0, lengthLine - 1, 0); + styler.ColourTo(endPos, 0); } } static void ColouriseMakeDoc(int startPos, int length, int, StylingContext &styler) { char lineBuffer[1024]; + styler.StartSegment(startPos); unsigned int linePos = 0; for (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, styler); + ColouriseMakeLine(lineBuffer, linePos, i, styler); linePos = 0; } } if (linePos > 0) - ColouriseMakeLine(lineBuffer, linePos, styler); + ColouriseMakeLine(lineBuffer, linePos, startPos + length, styler); } -static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, StylingContext &styler) { +static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, int endPos, StylingContext &styler) { if (lineBuffer[0] == '>') { // Command or return status - styler.ColourSegment(0, lengthLine - 1, 4); + styler.ColourTo(endPos, 4); } else if (strstr(lineBuffer, "File \"") && strstr(lineBuffer, ", line ")) { - styler.ColourSegment(0, lengthLine - 1, 1); + styler.ColourTo(endPos, 1); } else if (0 == strncmp(lineBuffer, "Error ", strlen("Error "))) { // Borland error message - styler.ColourSegment(0, lengthLine - 1, 5); + styler.ColourTo(endPos, 5); } else if (0 == strncmp(lineBuffer, "Warning ", strlen("Warning "))) { // Borland warning message - styler.ColourSegment(0, lengthLine - 1, 5); + styler.ColourTo(endPos, 5); } else { // Look for <filename>:<line>:message // Look for <filename>(line)message @@ -2440,27 +2351,28 @@ static void ColouriseErrorListLine(char *lineBuffer, int lengthLine, StylingCont } } if (state == 3) { - styler.ColourSegment(0, lengthLine - 1, 2); + styler.ColourTo(endPos, 2); } else if ((state == 14) || (state == 15)) { - styler.ColourSegment(0, lengthLine - 1, 3); + styler.ColourTo(endPos, 3); } else { - styler.ColourSegment(0, lengthLine - 1, 0); + styler.ColourTo(endPos, 0); } } } static void ColouriseErrorListDoc(int startPos, int length, int, StylingContext &styler) { char lineBuffer[1024]; + styler.StartSegment(startPos); unsigned int linePos = 0; for (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, styler); + ColouriseErrorListLine(lineBuffer, linePos, i, styler); linePos = 0; } } if (linePos > 0) - ColouriseErrorListLine(lineBuffer, linePos, styler); + ColouriseErrorListLine(lineBuffer, linePos, startPos + length, styler); } static void classifyWordSQL(unsigned int start, unsigned int end, WordList &keywords, StylingContext &styler) { @@ -2477,7 +2389,7 @@ static void classifyWordSQL(unsigned int start, unsigned int end, WordList &keyw if (keywords.InList(s)) chAttr = SCE_C_WORD; } - styler.ColourSegment(start, end, chAttr); + styler.ColourTo(end, chAttr); } static void ColouriseSQLDoc(int codePage, int startPos, int length, @@ -2491,7 +2403,7 @@ static void ColouriseSQLDoc(int codePage, int startPos, int length, int state = initStyle; char chPrev = ' '; char chNext = styler[startPos]; - int startSeg = startPos; + styler.StartSegment(startPos); int lengthDoc = startPos + length; bool prevCr = false; for (int i = startPos; i <= lengthDoc; i++) { @@ -2522,31 +2434,25 @@ static void ColouriseSQLDoc(int codePage, int startPos, int length, if (state == SCE_C_DEFAULT) { if (iswordstart(ch)) { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_WORD; - startSeg = i; } else if (ch == '/' && chNext == '*') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_COMMENT; - startSeg = i; } else if (ch == '-' && chNext == '-') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_COMMENTLINE; - startSeg = i; } else if (ch == '\'') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_STRING; - startSeg = i; } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i - 1, state); - styler.ColourSegment(i, i, SCE_C_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_C_OPERATOR); } } else if (state == SCE_C_WORD) { if (!iswordchar(ch)) { - classifyWordSQL(startSeg, i - 1, keywords, styler); + classifyWordSQL(styler.GetStartSegment(), i - 1, keywords, styler); state = SCE_C_DEFAULT; - startSeg = i; if (ch == '/' && chNext == '*') { state = SCE_C_COMMENT; } else if (ch == '-' && chNext == '-') { @@ -2554,33 +2460,31 @@ static void ColouriseSQLDoc(int codePage, int startPos, int length, } else if (ch == '\'') { state = SCE_C_STRING; } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i, SCE_C_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i, SCE_C_OPERATOR); } } } else { if (state == SCE_C_COMMENT) { - if (ch == '/' && chPrev == '*' && ( - (i > startSeg + 2) || ((initStyle == SCE_C_COMMENT) && (startSeg == startPos)))) { - state = SCE_C_DEFAULT; - styler.ColourSegment(startSeg, i, state); - startSeg = i + 1; + if (ch == '/' && chPrev == '*') { + if (((i > styler.GetStartSegment() + 2) || ((initStyle == SCE_C_COMMENT) && + (styler.GetStartSegment() == startPos)))) { + state = SCE_C_DEFAULT; + styler.ColourTo(i, state); + } } } else if (state == SCE_C_COMMENTLINE) { if (ch == '\r' || ch == '\n') { - styler.ColourSegment(startSeg, i - 1, state); + styler.ColourTo(i - 1, state); state = SCE_C_DEFAULT; - startSeg = i; } } else if (state == SCE_C_STRING) { if (ch == '\'') { if ( chNext == '\'' ) { i++; } else { - styler.ColourSegment(startSeg, i, state); + styler.ColourTo(i, state); state = SCE_C_DEFAULT; i++; - startSeg = i; } ch = chNext; chNext = styler.SafeGetCharAt(i + 1); @@ -2596,15 +2500,13 @@ static void ColouriseSQLDoc(int codePage, int startPos, int length, } else if (iswordstart(ch)) { state = SCE_C_WORD; } else if (isoperator(ch)) { - styler.ColourSegment(startSeg, i, SCE_C_OPERATOR); - startSeg = i + 1; + styler.ColourTo(i, SCE_C_OPERATOR); } } } chPrev = ch; } - if (startSeg < lengthDoc) - styler.ColourSegment(startSeg, lengthDoc - 1, state); + styler.ColourTo(lengthDoc - 1, state); } void ColouriseDoc(int codePage, int startPos, int lengthDoc, int initStyle, @@ -2642,7 +2544,8 @@ void ColouriseDoc(int codePage, int startPos, int lengthDoc, int initStyle, } else { // Null language means all style bytes are 0 so just mark the end - no need to fill in. styler.StartAt(startPos + lengthDoc - 1); - styler.ColourSegment(0, 0, 0); + styler.StartSegment(startPos + lengthDoc - 1); + styler.ColourTo(startPos + lengthDoc - 1, 0); } } } |