| #ifdef NDEBUG |
| #undef NDEBUG |
| #endif |
| |
| #include <assert.h> |
| #include <errno.h> |
| #include <limits.h> |
| #include <locale.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <wchar.h> |
| |
| #define WIN32_LEAN_AND_MEAN |
| #include <windows.h> |
| |
| int main (void) { |
| /** |
| * Test "C" locale |
| */ |
| assert (setlocale (LC_ALL, "C") != NULL); |
| |
| /** |
| * All bytes in range [0,255] are valid and must convert to themselves |
| */ |
| for (int c = 0; c < 0x100; ++c) { |
| assert (btowc (c) == c); |
| } |
| |
| /** |
| * Try convert sign-extended input |
| */ |
| for (char c = CHAR_MIN; c < 0; ++c) { |
| assert (btowc (c) == (c == EOF ? WEOF : (BYTE) c)); |
| } |
| |
| /** |
| * Test SBCS code page |
| */ |
| assert (setlocale (LC_ALL, "English_United States.1252") != NULL); |
| assert (MB_CUR_MAX == 1); |
| |
| /** |
| * All bytes in range [0,127] are valid and must convert to themselves |
| */ |
| for (int c = 0; c < 0x80; ++c) { |
| assert (btowc (c) == c); |
| } |
| |
| /** |
| * All bytes in range [0,255] are valid |
| */ |
| for (int c = 0x80; c < 0x100; ++c) { |
| assert (btowc (c) != WEOF); |
| } |
| |
| /** |
| * Disable tests for DBCS code pages with msvcrt10.dll since it does not |
| * support multibyte characters. |
| * |
| * Calling setlocale with locale string which requests DBCS code page |
| * result in runtime error. |
| */ |
| #if __MSVCRT_VERSION__ != 0x0100 |
| /** |
| * Test DBCS code page |
| */ |
| assert (setlocale (LC_ALL, "Japanese_Japan.932") != NULL); |
| assert (MB_CUR_MAX == 2); |
| |
| /** |
| * All bytes in range [0,127] are valid and must convert to themselves |
| */ |
| for (int c = 0; c < 0x80; ++c) { |
| assert (btowc (c) == c); |
| } |
| |
| /** |
| * Try to convert lead bytes |
| */ |
| for (int c = 0x80; c < 0x100; ++c) { |
| if (IsDBCSLeadByteEx (932, (BYTE) c)) { |
| assert (btowc (c) == WEOF); |
| } |
| } |
| #endif |
| #ifdef _UCRT |
| /** |
| * Test UTF-8 |
| */ |
| if (setlocale (LC_ALL, ".UTF-8") != NULL) { |
| assert (MB_CUR_MAX == 4); |
| |
| /** |
| * All bytes in range [0,127] are valid and must convert to themselves |
| */ |
| for (int c = 0; c < 0x80; ++c) { |
| assert (btowc (c) == c); |
| } |
| |
| /** |
| * All bytes in range [128,255] are invalid |
| */ |
| for (int c = 0x80; c < 0x100; ++c) { |
| assert (btowc (c) == WEOF); |
| } |
| } |
| #endif |
| |
| return 0; |
| } |