}
return 0;
+ case 65001:
+ /* Locale encoding is CP65001 = UTF-8. */
+ if (strcmp (locale_charset (), "UTF-8") != 0)
+ return 77;
+ {
+ char input[] = "s\303\274\303\237\360\237\230\213!"; /* "süß😋!" */
+ memset (&state, '\0', sizeof (mbstate_t));
+
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, input, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == 's');
+ ASSERT (mbsinit (&state));
+ input[0] = '\0';
+
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, input + 1, 1, &state);
+ ASSERT (ret == (size_t)(-2));
+ ASSERT (wc == (char32_t) 0xBADFACE);
+ ASSERT (!mbsinit (&state));
+ input[1] = '\0';
+
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, input + 2, 7, &state);
+ ASSERT (ret == 1);
+ ASSERT (c32tob (wc) == EOF);
+ ASSERT (wc == 0x00FC); /* expect Unicode encoding */
+ ASSERT (mbsinit (&state));
+ input[2] = '\0';
+
+ /* Test support of NULL first argument. */
+ ret = mbrtoc32 (NULL, input + 3, 6, &state);
+ ASSERT (ret == 2);
+ ASSERT (mbsinit (&state));
+
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, input + 3, 6, &state);
+ ASSERT (ret == 2);
+ ASSERT (c32tob (wc) == EOF);
+ ASSERT (wc == 0x00DF); /* expect Unicode encoding */
+ ASSERT (mbsinit (&state));
+ input[3] = '\0';
+ input[4] = '\0';
+
+ /* Test support of NULL first argument. */
+ ret = mbrtoc32 (NULL, input + 5, 4, &state);
+ ASSERT (ret == 4);
+ ASSERT (mbsinit (&state));
+
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, input + 5, 4, &state);
+ ASSERT (ret == 4);
+ ASSERT (c32tob (wc) == EOF);
+ ASSERT (wc == 0x1F60B); /* expect Unicode encoding */
+ ASSERT (mbsinit (&state));
+ input[5] = '\0';
+ input[6] = '\0';
+ input[7] = '\0';
+ input[8] = '\0';
+
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, input + 9, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (wc == '!');
+ ASSERT (mbsinit (&state));
+
+ /* Test some invalid input. */
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\377", 1, &state); /* 0xFF */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\303\300", 2, &state); /* 0xC3 0xC0 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\343\300", 2, &state); /* 0xE3 0xC0 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\343\300\200", 3, &state); /* 0xE3 0xC0 0x80 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\343\200\300", 3, &state); /* 0xE3 0x80 0xC0 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\363\300", 2, &state); /* 0xF3 0xC0 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\363\300\200\200", 4, &state); /* 0xF3 0xC0 0x80 0x80 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\363\200\300", 3, &state); /* 0xF3 0x80 0xC0 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\363\200\300\200", 4, &state); /* 0xF3 0x80 0xC0 0x80 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, "\363\200\200\300", 4, &state); /* 0xF3 0x80 0x80 0xC0 */
+ ASSERT (ret == (size_t)-1);
+ ASSERT (errno == EILSEQ);
+ }
+ return 0;
+
case 932:
/* Locale encoding is CP932, similar to Shift_JIS. */
{
}
return 0;
- case 65001:
- /* Locale encoding is CP65001 = UTF-8. */
- if (strcmp (locale_charset (), "UTF-8") != 0)
- return 77;
- {
- char input[] = "s\303\274\303\237\360\237\230\213!"; /* "süß😋!" */
- memset (&state, '\0', sizeof (mbstate_t));
-
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, input, 1, &state);
- ASSERT (ret == 1);
- ASSERT (wc == 's');
- ASSERT (mbsinit (&state));
- input[0] = '\0';
-
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, input + 1, 1, &state);
- ASSERT (ret == (size_t)(-2));
- ASSERT (wc == (char32_t) 0xBADFACE);
- ASSERT (!mbsinit (&state));
- input[1] = '\0';
-
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, input + 2, 7, &state);
- ASSERT (ret == 1);
- ASSERT (c32tob (wc) == EOF);
- ASSERT (wc == 0x00FC); /* expect Unicode encoding */
- ASSERT (mbsinit (&state));
- input[2] = '\0';
-
- /* Test support of NULL first argument. */
- ret = mbrtoc32 (NULL, input + 3, 6, &state);
- ASSERT (ret == 2);
- ASSERT (mbsinit (&state));
-
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, input + 3, 6, &state);
- ASSERT (ret == 2);
- ASSERT (c32tob (wc) == EOF);
- ASSERT (wc == 0x00DF); /* expect Unicode encoding */
- ASSERT (mbsinit (&state));
- input[3] = '\0';
- input[4] = '\0';
-
- /* Test support of NULL first argument. */
- ret = mbrtoc32 (NULL, input + 5, 4, &state);
- ASSERT (ret == 4);
- ASSERT (mbsinit (&state));
-
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, input + 5, 4, &state);
- ASSERT (ret == 4);
- ASSERT (c32tob (wc) == EOF);
- ASSERT (wc == 0x1F60B); /* expect Unicode encoding */
- ASSERT (mbsinit (&state));
- input[5] = '\0';
- input[6] = '\0';
- input[7] = '\0';
- input[8] = '\0';
-
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, input + 9, 1, &state);
- ASSERT (ret == 1);
- ASSERT (wc == '!');
- ASSERT (mbsinit (&state));
-
- /* Test some invalid input. */
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\377", 1, &state); /* 0xFF */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\303\300", 2, &state); /* 0xC3 0xC0 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\343\300", 2, &state); /* 0xE3 0xC0 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\343\300\200", 3, &state); /* 0xE3 0xC0 0x80 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\343\200\300", 3, &state); /* 0xE3 0x80 0xC0 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\363\300", 2, &state); /* 0xF3 0xC0 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\363\300\200\200", 4, &state); /* 0xF3 0xC0 0x80 0x80 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\363\200\300", 3, &state); /* 0xF3 0x80 0xC0 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\363\200\300\200", 4, &state); /* 0xF3 0x80 0xC0 0x80 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
-
- memset (&state, '\0', sizeof (mbstate_t));
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, "\363\200\200\300", 4, &state); /* 0xF3 0x80 0x80 0xC0 */
- ASSERT (ret == (size_t)-1);
- ASSERT (errno == EILSEQ);
- }
- return 0;
-
default:
return 1;
}
"C" locale. Furthermore, when you attempt to set the "C" or "POSIX"
locale via setlocale(), what you get is a "C" locale with UTF-8 encoding,
that is, effectively the "C.UTF-8" locale. */
- if (argc > 1 && strcmp (argv[1], "5") == 0 && MB_CUR_MAX > 1)
- argv[1] = "2";
+ if (argc > 1 && strcmp (argv[1], "1") == 0 && MB_CUR_MAX > 1)
+ argv[1] = "3";
#endif
if (argc > 1)
switch (argv[1][0])
{
case '1':
+ /* C or POSIX locale. */
+ {
+ int c;
+ char buf[1];
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ for (c = 0; c < 0x100; c++)
+ if (c != 0)
+ {
+ /* We are testing all nonnull bytes. */
+ buf[0] = c;
+
+ wc = (char32_t) 0xBADFACE;
+ ret = mbrtoc32 (&wc, buf, 1, &state);
+ /* POSIX:2018 says regarding mbrtowc: "In the POSIX locale an
+ [EILSEQ] error cannot occur since all byte values are valid
+ characters." It is reasonable to expect mbrtoc32 to behave
+ in the same way. */
+ ASSERT (ret == 1);
+ if (c < 0x80)
+ /* c is an ASCII character. */
+ ASSERT (wc == c);
+ else
+ /* On most platforms, the bytes 0x80..0xFF map to U+0080..U+00FF.
+ But on musl libc, the bytes 0x80..0xFF map to U+DF80..U+DFFF. */
+ ASSERT (wc == (btoc32 (c) == 0xDF00 + c ? btoc32 (c) : c));
+ ASSERT (mbsinit (&state));
+
+ ret = mbrtoc32 (NULL, buf, 1, &state);
+ ASSERT (ret == 1);
+ ASSERT (mbsinit (&state));
+ }
+ }
+ return 0;
+
+ case '2':
/* Locale encoding is ISO-8859-1 or ISO-8859-15. */
{
char input[] = "B\374\337er"; /* "Büßer" */
}
return 0;
- case '2':
+ case '3':
/* Locale encoding is UTF-8. */
{
char input[] = "s\303\274\303\237\360\237\230\213!"; /* "süß😋!" */
}
return 0;
- case '3':
+ case '4':
/* Locale encoding is EUC-JP. */
{
char input[] = "<\306\374\313\334\270\354>"; /* "<日本語>" */
}
return 0;
- case '4':
+ case '5':
/* Locale encoding is GB18030. */
#if GL_CHAR32_T_IS_UNICODE && (defined __NetBSD__ || defined __sun)
fputs ("Skipping test: The GB18030 converter in this system's iconv is broken.\n", stderr);
ASSERT (mbsinit (&state));
}
return 0;
-
- case '5':
- /* C or POSIX locale. */
- {
- int c;
- char buf[1];
-
- memset (&state, '\0', sizeof (mbstate_t));
- for (c = 0; c < 0x100; c++)
- if (c != 0)
- {
- /* We are testing all nonnull bytes. */
- buf[0] = c;
-
- wc = (char32_t) 0xBADFACE;
- ret = mbrtoc32 (&wc, buf, 1, &state);
- /* POSIX:2018 says regarding mbrtowc: "In the POSIX locale an
- [EILSEQ] error cannot occur since all byte values are valid
- characters." It is reasonable to expect mbrtoc32 to behave
- in the same way. */
- ASSERT (ret == 1);
- if (c < 0x80)
- /* c is an ASCII character. */
- ASSERT (wc == c);
- else
- /* On most platforms, the bytes 0x80..0xFF map to U+0080..U+00FF.
- But on musl libc, the bytes 0x80..0xFF map to U+DF80..U+DFFF. */
- ASSERT (wc == (btoc32 (c) == 0xDF00 + c ? btoc32 (c) : c));
- ASSERT (mbsinit (&state));
-
- ret = mbrtoc32 (NULL, buf, 1, &state);
- ASSERT (ret == 1);
- ASSERT (mbsinit (&state));
- }
- }
- return 0;
}
return 1;