mirror of https://github.com/libsdl-org/SDL
a5c892d2c3
SDL_strcasecmp (even when calling into a C runtime) does not work with Unicode chars, and depending on the user's locale, might not work with even basic ASCII strings. This implements the function from scratch, using "case-folding," which is a more robust method that deals with various languages. It involves a hashtable of a few hundred codepoints that are "uppercase" and how to map them to lowercase equivalents (possibly increasing the size of the string in the process). The vast majority of human languages (and Unicode) do not have letters with different cases, but still, this static table takes about 10 kilobytes on a 64-bit machine. Even this will fail in one known case: the Turkish 'i' folds differently if you're writing in Turkish vs other languages. Generally this is seen as unfortunate collateral damage in cases where you can't specify the language in use. In addition to case-folding the codepoints, the new functions also know how to decode the various formats to turn them into codepoints in the first place, instead of blindly stepping by one byte (or one wchar_t) per character. Also included is casefolding.txt from the Unicode Consortium and a perl script to generate the hashtable from that text file, so we can trivially update this if new languages are added in the future. A simple test using the new function: ```c #include <SDL3/SDL.h> int main(void) { const char *a = "α ε η"; const char *b = "Α Ε Η"; SDL_Log(" strcasecmp(\"%s\", \"%s\") == %d\n", a, b, strcasecmp(a, b)); SDL_Log("SDL_strcasecmp(\"%s\", \"%s\") == %d\n", a, b, SDL_strcasecmp(a, b)); return 0; } ``` Produces: ``` INFO: strcasecmp("α ε η", "Α Ε Η") == 32 INFO: SDL_strcasecmp("α ε η", "Α Ε Η") == 0 ``` glibc strcasecmp() fails to compare a Greek lowercase string to its uppercase equivalent, even with a UTF-8 locale, but SDL_strcasecmp() works. Other SDL_stdinc.h functions are changed to be more consistent, which is to say they now ignore any C runtime and often dictate that only English-based low-ASCII works with them. Fixes Issue #9313. |
||
---|---|---|
.. | ||
SDL_build_config.h | ||
SDL_build_config.h.cmake | ||
SDL_build_config_android.h | ||
SDL_build_config_emscripten.h | ||
SDL_build_config_ios.h | ||
SDL_build_config_macos.h | ||
SDL_build_config_minimal.h | ||
SDL_build_config_ngage.h | ||
SDL_build_config_windows.h | ||
SDL_build_config_wingdk.h | ||
SDL_build_config_winrt.h | ||
SDL_build_config_xbox.h | ||
SDL_revision.h.cmake |