Only convert the result of XLookupString() if it's not already UTF-8

Fixes https://github.com/libsdl-org/SDL/issues/7766
This commit is contained in:
Sam Lantinga
2023-06-04 02:06:52 -07:00
parent c369b90019
commit 491ae20d96
3 changed files with 43 additions and 3 deletions

View File

@@ -36,7 +36,7 @@
#define UTF8_IsLeadByte(c) ((c) >= 0xC0 && (c) <= 0xF4)
#define UTF8_IsTrailingByte(c) ((c) >= 0x80 && (c) <= 0xBF)
static unsigned UTF8_GetTrailingBytes(unsigned char c)
static size_t UTF8_GetTrailingBytes(unsigned char c)
{
if (c >= 0xC0 && c <= 0xDF) {
return 1;
@@ -676,6 +676,42 @@ size_t SDL_utf8strnlen(const char *str, size_t bytes)
return retval;
}
SDL_bool SDL_utf8valid(const char *str, size_t bytes)
{
while (*str && bytes > 0) {
Uint8 ch = (Uint8)*str;
if (ch <= 0x7F) {
++str;
--bytes;
continue;
}
if (UTF8_IsLeadByte(ch)) {
size_t left = UTF8_GetTrailingBytes(ch);
if (bytes < left) {
return SDL_FALSE;
}
++str;
--bytes;
while (left-- > 0) {
ch = (Uint8)*str;
if (!UTF8_IsTrailingByte(ch)) {
return SDL_FALSE;
}
++str;
--bytes;
}
} else {
return SDL_FALSE;
}
}
return SDL_TRUE;
}
size_t SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen)
{
#ifdef HAVE_STRLCAT