Don't bother re-encoding Latin1 characters in the ASCII range

main
Sam Lantinga 2023-06-04 05:37:06 -07:00
parent 491ae20d96
commit 6150b5b3cb
3 changed files with 13 additions and 40 deletions

View File

@ -28,7 +28,4 @@
/* Return the smallest power of 2 greater than or equal to 'x' */
extern int SDL_powerof2(int x);
/* Return whether the string is valid UTF8 */
extern SDL_bool SDL_utf8valid(const char *str, size_t bytes);
#endif /* SDL_utils_h_ */

View File

@ -676,42 +676,6 @@ 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

View File

@ -760,10 +760,22 @@ static Bool isReparentNotify(Display *display, XEvent *ev, XPointer arg)
ev->xreparent.serial == unmap->serial;
}
static SDL_bool IsHighLatin1(const char *string, int length)
{
while (length-- > 0) {
Uint8 ch = (Uint8)*string;
if (ch >= 0x80) {
return SDL_TRUE;
}
++string;
}
return SDL_FALSE;
}
static int XLookupStringAsUTF8(XKeyEvent *event_struct, char *buffer_return, int bytes_buffer, KeySym *keysym_return, XComposeStatus *status_in_out)
{
int result = X11_XLookupString(event_struct, buffer_return, bytes_buffer, keysym_return, status_in_out);
if (result > 0 && !SDL_utf8valid(buffer_return, (size_t)result)) {
if (IsHighLatin1(buffer_return, result)) {
char *utf8_text = SDL_iconv_string("UTF-8", "ISO-8859-1", buffer_return, result);
if (utf8_text) {
SDL_strlcpy(buffer_return, utf8_text, bytes_buffer);