diff options
author | nyamatongwe <devnull@localhost> | 2009-04-28 04:05:38 +0000 |
---|---|---|
committer | nyamatongwe <devnull@localhost> | 2009-04-28 04:05:38 +0000 |
commit | f3255f1ebb34302e47b9032cc1381f185d32484c (patch) | |
tree | 8ec49d704ff7f668fe80228df5189ae49fba1592 | |
parent | 001f6da7264086b397a9b63b5d4748d004b48b1b (diff) | |
download | scintilla-mirror-f3255f1ebb34302e47b9032cc1381f185d32484c.tar.gz |
Fix for bug #2780566 UTF-8 bug on Linux
-rw-r--r-- | src/PositionCache.cxx | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/PositionCache.cxx b/src/PositionCache.cxx index d9fb9a783..cd5becf1a 100644 --- a/src/PositionCache.cxx +++ b/src/PositionCache.cxx @@ -440,6 +440,10 @@ int BreakFinder::First() { return nextBreak; } +static bool IsTrailByte(int ch) { + return (ch >= 0x80) && (ch < (0x80 + 0x40)); +} + int BreakFinder::Next() { if (subBreak == -1) { int prev = nextBreak; @@ -472,15 +476,20 @@ int BreakFinder::Next() { } else { int lastGoodBreak = -1; int lastOKBreak = -1; + int lastUTF8Break = -1; int j; for (j = subBreak + 1; j <= nextBreak; j++) { if (IsSpaceOrTab(ll->chars[j - 1]) && !IsSpaceOrTab(ll->chars[j])) { lastGoodBreak = j; } - if (ll->chars[j] < 'A') { + if (static_cast<unsigned char>(ll->chars[j]) < 'A') { lastOKBreak = j; } - if (((j - subBreak) >= lengthEachSubdivision) && ((lastGoodBreak >= 0) || (lastOKBreak >= 0))) { + if (utf8 && !IsTrailByte(static_cast<unsigned char>(ll->chars[j]))) { + lastUTF8Break = j; + } + if (((j - subBreak) >= lengthEachSubdivision) && + ((lastGoodBreak >= 0) || (lastOKBreak >= 0) || (lastUTF8Break >= 0))) { break; } } @@ -488,6 +497,8 @@ int BreakFinder::Next() { subBreak = lastGoodBreak; } else if (lastOKBreak >= 0) { subBreak = lastOKBreak; + } else if (lastUTF8Break >= 0) { + subBreak = lastUTF8Break; } else { subBreak = nextBreak; } |