X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=utf8lib.c;h=0461672d796688b3bee06f2ab17a2bc058a9067d;hb=36bcd3b371a113ce5cf3e91f7143e18672fe9c93;hp=16a94a7ae7fefe2fe108543fb69c52f39e68a780;hpb=8588130643358b707944100e8fa2f62ce0fae008;p=xonotic%2Fdarkplaces.git diff --git a/utf8lib.c b/utf8lib.c index 16a94a7a..0461672d 100644 --- a/utf8lib.c +++ b/utf8lib.c @@ -62,9 +62,8 @@ Uchar utf8_range[5] = { static qboolean u8_analyze(const char *_s, size_t *_start, size_t *_len, Uchar *_ch, size_t _maxlen) { const unsigned char *s = (const unsigned char*)_s; - //unsigned char bt;//, bc; - size_t i; - size_t bits, j; + size_t i, j; + size_t bits = 0; Uchar ch; i = 0; @@ -586,7 +585,7 @@ int u8_fromchar(Uchar w, char *to, size_t maxlen) to[3] = 0x80 | (w & 0x3F); w >>= 6; to[2] = 0x80 | (w & 0x3F); w >>= 6; to[1] = 0x80 | (w & 0x3F); w >>= 6; - to[0] = 0xE0 | w; + to[0] = 0xF0 | w; return 4; } return 0; @@ -683,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); @@ -691,7 +691,7 @@ u8_COM_StringLengthNoColors(const char *_s, size_t size_s, qboolean *valid) for(;;) { - switch((s == end) ? 0 : *s) + switch((s >= end) ? 0 : *s) { case 0: if(valid) @@ -728,22 +728,45 @@ u8_COM_StringLengthNoColors(const char *_s, size_t size_s, qboolean *valid) ++len; // the character break; } - break; + 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(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 }