mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Replace last usage of Utf8CharLen with Utf8View.
parent
9229956f04
commit
294f826364
|
@ -106,23 +106,6 @@ inline char32_t Utf8Consume(Titr &s)
|
|||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the length of a UTF-8 encoded character.
|
||||
* @param c Unicode character.
|
||||
* @return Length of UTF-8 encoding for character.
|
||||
*/
|
||||
inline int8_t Utf8CharLen(char32_t c)
|
||||
{
|
||||
if (c < 0x80) return 1;
|
||||
if (c < 0x800) return 2;
|
||||
if (c < 0x10000) return 3;
|
||||
if (c < 0x110000) return 4;
|
||||
|
||||
/* Invalid valid, we encode as a '?' */
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the length of an UTF-8 encoded value based on a single char. This
|
||||
* char should be the first byte of the UTF-8 encoding. If not, or encoding
|
||||
|
|
|
@ -170,24 +170,30 @@ bool Textbuf::InsertString(const char *str, bool marked, const char *caret, cons
|
|||
|
||||
if (str == nullptr) return false;
|
||||
|
||||
uint16_t bytes = 0, chars = 0;
|
||||
char32_t c;
|
||||
for (const char *ptr = str; (c = Utf8Consume(&ptr)) != '\0';) {
|
||||
if (!IsValidChar(c, this->afilter)) break;
|
||||
uint16_t chars = 0;
|
||||
uint16_t bytes;
|
||||
{
|
||||
Utf8View view(str);
|
||||
auto cur = view.begin();
|
||||
const auto end = view.end();
|
||||
while (cur != end) {
|
||||
if (!IsValidChar(*cur, this->afilter)) break;
|
||||
|
||||
uint8_t len = Utf8CharLen(c);
|
||||
if (this->buf.size() + bytes + len >= this->max_bytes) break;
|
||||
if (this->chars + chars + 1 > this->max_chars) break;
|
||||
auto next = cur;
|
||||
++next;
|
||||
if (this->buf.size() + next.GetByteOffset() >= this->max_bytes) break;
|
||||
if (this->chars + chars + 1 > this->max_chars) break;
|
||||
|
||||
bytes += len;
|
||||
chars++;
|
||||
|
||||
/* Move caret if needed. */
|
||||
if (ptr == caret) this->caretpos = insertpos + bytes;
|
||||
cur = next;
|
||||
chars++;
|
||||
}
|
||||
bytes = static_cast<uint16_t>(cur.GetByteOffset());
|
||||
}
|
||||
|
||||
if (bytes == 0) return false;
|
||||
|
||||
/* Move caret if needed. */
|
||||
if (str <= caret && caret <= str + bytes) this->caretpos = insertpos + (caret - str);
|
||||
|
||||
if (marked) {
|
||||
this->markpos = insertpos;
|
||||
this->markend = insertpos + bytes;
|
||||
|
|
Loading…
Reference in New Issue