X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=utf8lib.c;h=bb775b7fd91b749a4593382f52691135c58f4250;hb=d0dcbfa6c0ab0ecb50a29e3f1227ba39f1aaf900;hp=151a1ca5b90f39b95bcdae64906c78597c341505;hpb=7c4137b67a26250669e48960259fa58cce39c1e8;p=xonotic%2Fdarkplaces.git diff --git a/utf8lib.c b/utf8lib.c index 151a1ca5..bb775b7f 100644 --- a/utf8lib.c +++ b/utf8lib.c @@ -682,6 +682,7 @@ u8_COM_StringLengthNoColors(const char *_s, size_t size_s, qboolean *valid) const unsigned char *s = (const unsigned char*)_s; const unsigned char *end; size_t len = 0; + size_t st, ln; if (!utf8_enable.integer) return COM_StringLengthNoColors(_s, size_s, valid); @@ -727,22 +728,46 @@ u8_COM_StringLengthNoColors(const char *_s, size_t size_s, qboolean *valid) ++len; // the character break; } - break; + ++s; + continue; default: - ++len; break; } - // start of a wide character - if (*s & 0xC0) + // ascii char, skip u8_analyze + if (*s < 0x80) + { + ++len; + ++s; + continue; + } + + // invalid, skip u8_analyze + if (*s < 0xC2) { - for (++s; *s >= 0x80 && *s <= 0xC0; ++s); + ++s; continue; } - // part of a wide character, we ignore that one - if (*s <= 0xBF) - --len; - ++s; + + if (!u8_analyze((const char*)s, &st, &ln, NULL, U8_ANALYZE_INFINITY)) + { + // we CAN end up here, if an invalid char is between this one and the end of the string + if(valid) + *valid = TRUE; + return len; + } + + if(end && s + st + ln > end) + { + // string length exceeded by new character + if(valid) + *valid = TRUE; + return len; + } + + // valid character, skip after it + s += st + ln; + ++len; } // never get here }