aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexlib/StyleContext.h
diff options
context:
space:
mode:
Diffstat (limited to 'lexlib/StyleContext.h')
-rw-r--r--lexlib/StyleContext.h25
1 files changed, 14 insertions, 11 deletions
diff --git a/lexlib/StyleContext.h b/lexlib/StyleContext.h
index 0b5dee379..fc6c60d2f 100644
--- a/lexlib/StyleContext.h
+++ b/lexlib/StyleContext.h
@@ -49,6 +49,7 @@ inline int BytesInUnicodeCodePoint(int codePoint) {
// syntactically significant. UTF-8 avoids this as all trail bytes are >= 0x80
class StyleContext {
LexAccessor &styler;
+ IDocumentWithLineEnd *multiByteAccess;
unsigned int endPos;
unsigned int lengthDocument;
@@ -60,11 +61,11 @@ class StyleContext {
StyleContext &operator=(const StyleContext &);
void GetNextChar() {
- if (styler.Encoding() == enc8bit) {
+ if (multiByteAccess) {
+ chNext = multiByteAccess->GetCharacterAndWidth(currentPos+width, &widthNext);
+ } else {
chNext = static_cast<unsigned char>(styler.SafeGetCharAt(currentPos+width, 0));
widthNext = 1;
- } else {
- styler.GetRelativePosition(currentPos+width, 0, &chNext, &widthNext);
}
// End of line determined from line end position, allowing CR, LF,
// CRLF and Unicode line ends as set by document.
@@ -91,6 +92,7 @@ public:
StyleContext(unsigned int startPos, unsigned int length,
int initStyle, LexAccessor &styler_, char chMask=31) :
styler(styler_),
+ multiByteAccess(0),
endPos(startPos + length),
posRelative(0),
currentPosLastRelative(0x7FFFFFFF),
@@ -105,6 +107,9 @@ public:
width(0),
chNext(0),
widthNext(1) {
+ if (styler.Encoding() != enc8bit) {
+ multiByteAccess = styler.MultiByteAccess();
+ }
styler.StartAt(startPos, chMask);
styler.StartSegment(startPos);
currentLine = styler.GetLine(startPos);
@@ -182,13 +187,7 @@ public:
int GetRelativeCharacter(int n) {
if (n == 0)
return ch;
- if (styler.Encoding() == enc8bit) {
- // fast version for single byte encodings
- return static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + n, 0));
- } else {
- int ch = 0;
- int width = 0;
- //styler.GetRelativePosition(currentPos, n, &ch, &width);
+ if (multiByteAccess) {
if ((currentPosLastRelative != currentPos) ||
((n > 0) && ((offsetRelative < 0) || (n < offsetRelative))) ||
((n < 0) && ((offsetRelative > 0) || (n > offsetRelative)))) {
@@ -196,11 +195,15 @@ public:
offsetRelative = 0;
}
int diffRelative = n - offsetRelative;
- int posNew = styler.GetRelativePosition(posRelative, diffRelative, &ch, &width);
+ int posNew = multiByteAccess->GetRelativePosition(posRelative, diffRelative);
+ int ch = multiByteAccess->GetCharacterAndWidth(posNew, 0);
posRelative = posNew;
currentPosLastRelative = currentPos;
offsetRelative = n;
return ch;
+ } else {
+ // fast version for single byte encodings
+ return static_cast<unsigned char>(styler.SafeGetCharAt(currentPos + n, 0));
}
}
bool Match(char ch0) const {