diff options
Diffstat (limited to 'lexers/LexPerl.cxx')
-rw-r--r-- | lexers/LexPerl.cxx | 116 |
1 files changed, 58 insertions, 58 deletions
diff --git a/lexers/LexPerl.cxx b/lexers/LexPerl.cxx index da9038778..8a7c78b1d 100644 --- a/lexers/LexPerl.cxx +++ b/lexers/LexPerl.cxx @@ -188,22 +188,6 @@ static int styleCheckIdentifier(LexAccessor &styler, unsigned int bk) { return 0; } -static int inputsymbolScan(LexAccessor &styler, unsigned int pos, unsigned int endPos) { - // looks forward for matching > on same line; a bit ugly - unsigned int fw = pos; - while (++fw < endPos) { - int fwch = static_cast<unsigned char>(styler.SafeGetCharAt(fw)); - if (fwch == '\r' || fwch == '\n') { - return 0; - } else if (fwch == '>') { - if (styler.Match(fw - 2, "<=>")) // '<=>' case - return 0; - return fw - pos; - } - } - return 0; -} - static int podLineScan(LexAccessor &styler, unsigned int &pos, unsigned int endPos) { // forward scan the current line to classify line for POD style int state = -1; @@ -398,6 +382,7 @@ public: static ILexer *LexerFactoryPerl() { return new LexerPerl(); } + int InputSymbolScan(StyleContext &sc); void InterpolateSegment(StyleContext &sc, int maxSeg, bool isPattern=false); }; @@ -427,6 +412,21 @@ int SCI_METHOD LexerPerl::WordListSet(int n, const char *wl) { return firstModification; } +int LexerPerl::InputSymbolScan(StyleContext &sc) { + // forward scan for matching > on same line; file handles + int c, sLen = 0; + while ((c = sc.GetRelativeCharacter(++sLen))) { + if (c == '\r' || c == '\n') { + return 0; + } else if (c == '>') { + if (sc.Match("<=>")) // '<=>' case + return 0; + return sLen; + } + } + return 0; +} + void LexerPerl::InterpolateSegment(StyleContext &sc, int maxSeg, bool isPattern) { // interpolate a segment (with no active backslashes or delimiters within) // switch in or out of an interpolation style or continue current style @@ -441,39 +441,42 @@ void LexerPerl::InterpolateSegment(StyleContext &sc, int maxSeg, bool isPattern) if (sc.ch == '$' && sc.chNext == '#') { // starts with $# sLen++; } - while ((maxSeg > sLen) && (sc.GetRelative(sLen) == '$')) // >0 $ dereference within + while ((maxSeg > sLen) && (sc.GetRelativeCharacter(sLen) == '$')) // >0 $ dereference within sLen++; - if ((maxSeg > sLen) && (sc.GetRelative(sLen) == '{')) { // { start for {word} + if ((maxSeg > sLen) && (sc.GetRelativeCharacter(sLen) == '{')) { // { start for {word} sLen++; braces = true; } if (maxSeg > sLen) { - int c = sc.GetRelative(sLen); + int c = sc.GetRelativeCharacter(sLen); if (setWordStart.Contains(c)) { // word (various) sLen++; isVar = true; - while ((maxSeg > sLen) && setWord.Contains(sc.GetRelative(sLen))) + while (maxSeg > sLen) { + if (!setWord.Contains(sc.GetRelativeCharacter(sLen))) + break; sLen++; + } } else if (braces && IsADigit(c) && (sLen == 2)) { // digit for ${digit} sLen++; isVar = true; } } if (braces) { - if ((maxSeg > sLen) && (sc.GetRelative(sLen) == '}')) { // } end for {word} + if ((maxSeg > sLen) && (sc.GetRelativeCharacter(sLen) == '}')) { // } end for {word} sLen++; } else isVar = false; } } if (!isVar && (maxSeg > 1)) { // $- or @-specific variable patterns - sLen = 1; int c = sc.chNext; if (sc.ch == '$') { + sLen = 1; if (IsADigit(c)) { // $[0-9] and slurp trailing digits sLen++; isVar = true; - while ((maxSeg > sLen) && IsADigit(sc.GetRelative(sLen))) + while ((maxSeg > sLen) && IsADigit(sc.GetRelativeCharacter(sLen))) sLen++; } else if (setSpecialVar.Contains(c)) { // $ special variables sLen++; @@ -483,12 +486,13 @@ void LexerPerl::InterpolateSegment(StyleContext &sc, int maxSeg, bool isPattern) isVar = true; } else if (c == '^') { // $^A control-char style sLen++; - if ((maxSeg > sLen) && setControlVar.Contains(sc.GetRelative(sLen))) { + if ((maxSeg > sLen) && setControlVar.Contains(sc.GetRelativeCharacter(sLen))) { sLen++; isVar = true; } } } else if (sc.ch == '@') { + sLen = 1; if (!isPattern && ((c == '+') || (c == '-'))) { // @ specials non-pattern sLen++; isVar = true; @@ -896,19 +900,18 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, break; } while (!sc.atLineEnd) { // "EOF" and `EOF` interpolated - int s = 0, endType = 0; - int maxSeg = endPos - sc.currentPos; - while (s < maxSeg) { // scan to break string into segments - int c = sc.GetRelative(s); + int c, sLen = 0, endType = 0; + while ((c = sc.GetRelativeCharacter(sLen))) { + // scan to break string into segments if (c == '\\') { endType = 1; break; } else if (c == '\r' || c == '\n') { endType = 2; break; } - s++; + sLen++; } - if (s > 0) // process non-empty segments - InterpolateSegment(sc, s); + if (sLen > 0) // process non-empty segments + InterpolateSegment(sc, sLen); if (endType == 1) { sc.Forward(); // \ at end-of-line does not appear to have any effect, skip @@ -969,10 +972,9 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, } else if (!Quote.Up && !IsASpace(sc.ch)) { Quote.Open(sc.ch); } else { - int s = 0, endType = 0; - int maxSeg = endPos - sc.currentPos; - while (s < maxSeg) { // scan to break string into segments - int c = sc.GetRelative(s); + int c, sLen = 0, endType = 0; + while ((c = sc.GetRelativeCharacter(sLen))) { + // scan to break string into segments if (IsASpace(c)) { break; } else if (c == '\\' && Quote.Up != '\\') { @@ -985,13 +987,13 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, } } else if (c == Quote.Up) Quote.Count++; - s++; + sLen++; } - if (s > 0) { // process non-empty segments + if (sLen > 0) { // process non-empty segments if (Quote.Up != '\'') { - InterpolateSegment(sc, s, true); + InterpolateSegment(sc, sLen, true); } else // non-interpolated path - sc.Forward(s); + sc.Forward(sLen); } if (endType == 1) sc.Forward(); @@ -1005,11 +1007,10 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, } else if (!Quote.Up && !IsASpace(sc.ch)) { Quote.Open(sc.ch); } else { - int s = 0, endType = 0; - int maxSeg = endPos - sc.currentPos; + int c, sLen = 0, endType = 0; bool isPattern = (Quote.Rep == 2); - while (s < maxSeg) { // scan to break string into segments - int c = sc.GetRelative(s); + while ((c = sc.GetRelativeCharacter(sLen))) { + // scan to break string into segments if (c == '\\' && Quote.Up != '\\') { endType = 2; break; } else if (Quote.Count == 0 && Quote.Rep == 1) { @@ -1020,7 +1021,7 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, // For '#', if no whitespace in between, it's a delimiter. if (IsASpace(c)) { // Keep going - } else if (c == '#' && IsASpaceOrTab(sc.GetRelative(s - 1))) { + } else if (c == '#' && IsASpaceOrTab(sc.GetRelative(sLen - 1))) { endType = 3; } else Quote.Open(c); @@ -1039,13 +1040,13 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, Quote.Count++; } else if (IsASpace(c)) break; - s++; + sLen++; } - if (s > 0) { // process non-empty segments + if (sLen > 0) { // process non-empty segments if (sc.state == SCE_PL_REGSUBST && Quote.Up != '\'') { - InterpolateSegment(sc, s, isPattern); + InterpolateSegment(sc, sLen, isPattern); } else // non-interpolated path - sc.Forward(s); + sc.Forward(sLen); } if (endType == 2) { sc.Forward(); @@ -1063,10 +1064,9 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, if (!Quote.Down && !IsASpace(sc.ch)) { Quote.Open(sc.ch); } else { - int s = 0, endType = 0; - int maxSeg = endPos - sc.currentPos; - while (s < maxSeg) { // scan to break string into segments - int c = sc.GetRelative(s); + int c, sLen = 0, endType = 0; + while ((c = sc.GetRelativeCharacter(sLen))) { + // scan to break string into segments if (IsASpace(c)) { break; } else if (c == '\\' && Quote.Up != '\\') { @@ -1078,23 +1078,23 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, } } else if (c == Quote.Up) Quote.Count++; - s++; + sLen++; } - if (s > 0) { // process non-empty segments + if (sLen > 0) { // process non-empty segments switch (sc.state) { case SCE_PL_STRING: case SCE_PL_STRING_QQ: case SCE_PL_BACKTICKS: - InterpolateSegment(sc, s); + InterpolateSegment(sc, sLen); break; case SCE_PL_STRING_QX: if (Quote.Up != '\'') { - InterpolateSegment(sc, s); + InterpolateSegment(sc, sLen); break; } // (continued for ' delim) default: // non-interpolated path - sc.Forward(s); + sc.Forward(sLen); } } if (endType == 2) { @@ -1474,7 +1474,7 @@ void SCI_METHOD LexerPerl::Lex(unsigned int startPos, int length, int initStyle, } else if (sc.ch == '<') { // handle '<', inputsymbol if (preferRE) { // forward scan - int i = inputsymbolScan(styler, sc.currentPos, endPos); + int i = InputSymbolScan(sc); if (i > 0) { sc.SetState(SCE_PL_IDENTIFIER); sc.Forward(i); |