mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r9003) -Codechange: Introduce a function Utf8PrevCharLen that finds the starting character of an UTF-8 sequence from a given position and returns the length to the first UTF-8 encoding byte of that sequence.
This commit is contained in:
parent
ead8c82ab6
commit
0d643c624b
|
@ -805,11 +805,7 @@ static void DelChar(Textbuf *tb, bool backspace)
|
|||
uint width;
|
||||
size_t len;
|
||||
|
||||
if (backspace) {
|
||||
do {
|
||||
tb->caretpos--;
|
||||
} while (IsUtf8Part(*(tb->buf + tb->caretpos)));
|
||||
}
|
||||
if (backspace) tb->caretpos -= Utf8PrevCharLen(tb->buf + tb->caretpos);
|
||||
|
||||
len = Utf8Decode(&c, tb->buf + tb->caretpos);
|
||||
width = GetCharacterWidth(FS_NORMAL, c);
|
||||
|
@ -892,10 +888,7 @@ bool MoveTextBufferPos(Textbuf *tb, int navmode)
|
|||
if (tb->caretpos != 0) {
|
||||
WChar c;
|
||||
|
||||
do {
|
||||
tb->caretpos--;
|
||||
} while (IsUtf8Part(*(tb->buf + tb->caretpos)));
|
||||
|
||||
tb->caretpos -= Utf8PrevCharLen(tb->buf + tb->caretpos);
|
||||
Utf8Decode(&c, tb->buf + tb->caretpos);
|
||||
tb->caretxoffs -= GetCharacterWidth(FS_NORMAL, c);
|
||||
|
||||
|
|
22
src/string.h
22
src/string.h
|
@ -106,6 +106,28 @@ static inline bool IsUtf8Part(char c)
|
|||
return GB(c, 6, 2) == 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the (partial) length of the previous UNICODE character
|
||||
* in an UTF-8 encoded string.
|
||||
* @param s char pointer pointing to the first char of the next character
|
||||
* @returns the decoded length in bytes (size) of the UNICODE character
|
||||
* that was just before the one where 's' is pointing to
|
||||
* @note If 's' is not pointing to the first byte of the next UNICODE character
|
||||
* only a partial length of the sequence will be returned.
|
||||
* For example given this sequence: 0xE3 0x85 0x80, 0xE3 0x81 0x9E
|
||||
* 1. 's' is pointing to the second 0xE3, return value is 3
|
||||
* 2. 's' is pointing to 0x80, return value is 2.
|
||||
* So take care with the return values of this function. To get the real length
|
||||
* for an (invalid) sequence, pass the string offset of this function's return
|
||||
* value to Utf8EncodedCharLen() or Utf8Decode()
|
||||
*/
|
||||
static inline size_t Utf8PrevCharLen(const char *s)
|
||||
{
|
||||
size_t len = 1;
|
||||
while (IsUtf8Part(*--s)) len++;
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
static inline bool IsPrintable(WChar c)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue