SDL/docs
Ryan C. Gordon a5c892d2c3 stdlib: Improve Unicode support and consistency in string comparison functions.
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.
2024-03-29 15:01:40 -04:00
..
README-android.md rwops: Changed filenames that reference "rwops" to "iostream". 2024-03-14 23:30:59 -04:00
README-cmake.md Sync SDL3 wiki -> header 2024-02-25 22:26:23 +00:00
README-contributing.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-dynapi.md Fixed types used in documentation (thanks @Dragon-Baroque!) 2024-01-19 05:23:38 -08:00
README-emscripten.md rwops: Renamed SDL_RWops to SDL_IOStream, and other related symbols. 2024-03-14 19:38:12 -04:00
README-gdk.md Define SDL_PLATFORM_* macros instead of underscored ones (#8875) 2024-01-24 01:40:51 +00:00
README-git.md Sync SDL3 wiki -> header 2024-03-24 18:34:24 +00:00
README-hg.md Sync SDL3 wiki -> header 2024-03-24 18:34:24 +00:00
README-highdpi.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-ios.md Define SDL_PLATFORM_* macros instead of underscored ones (#8875) 2024-01-24 01:40:51 +00:00
README-kmsbsd.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-linux.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-macos.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-main-functions.md README-main-functions.md: Added notes about the new `appstate` parameter. 2024-03-27 23:04:36 -04:00
README-migration.md stdlib: Improve Unicode support and consistency in string comparison functions. 2024-03-29 15:01:40 -04:00
README-n3ds.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-ngage.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-platforms.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-porting.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-ps2.md Renamed SDL_HINT_PS2_DYNAMIC_VSYNC SDL_HINT_RENDER_PS2_DYNAMIC_VSYNC 2024-02-12 09:54:33 -08:00
README-psp.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-raspberrypi.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-riscos.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-touch.md touch: Replace GetNumTouchDevices/GetTouchDevice with a single function. 2023-11-29 20:50:44 -05:00
README-versions.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-visualc.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-vita.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-wayland.md docs: Hint envvars needs to use the hint string, not the macro name 2024-01-28 15:12:03 -05:00
README-windows.md docs: Convert everything to Unix-style endlines. 2023-11-29 11:29:57 -05:00
README-winrt.md rwops: Renamed SDL_RWops to SDL_IOStream, and other related symbols. 2024-03-14 19:38:12 -04:00
README.md Tweaking documentation for the SDL 3.0 preview release 2024-03-24 06:16:02 -07:00
doxyfile docs: Fix doxyfile 2023-02-19 10:01:33 -08:00
release_checklist.md Updated release_checklist.md for SDL 3.0 2023-01-04 23:47:01 -08:00

README.md

Simple DirectMedia Layer

https://www.libsdl.org/

Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware. It is used by video playback software, emulators, and popular games including Valve's award winning catalog and many Humble Bundle games.

SDL officially supports Windows, macOS, Linux, iOS, and Android. Support for other platforms may be found in the source code.

SDL is written in C, works natively with C++, and there are bindings available for several other languages, including C# and Python.

This library is distributed under the zlib license, which can be found in the file "LICENSE.txt".

Information on building SDL with CMake is available in README-cmake.md

The best way to learn how to use SDL is to check out the header files in the "include" subdirectory and the programs in the "test" subdirectory. The header files and test programs are well commented and always up to date.

Information on reporting bugs and contributing is available in README-contributing.md

More documentation and FAQs are available online at the wiki

If you need help with the library, or just want to discuss SDL related issues, you can join the SDL Discourse, which can be used as a web forum or a mailing list, at your preference.

If you want to report bugs or contribute patches, please submit them to our bug tracker

Enjoy!

Sam Lantinga mailto:slouken@libsdl.org