diff --git a/lib/libc/tests/stdio/snprintf_test.c b/lib/libc/tests/stdio/snprintf_test.c index 10d938435b96..323356b37a7d 100644 --- a/lib/libc/tests/stdio/snprintf_test.c +++ b/lib/libc/tests/stdio/snprintf_test.c @@ -1,139 +1,205 @@ /*- * Copyright (c) 2023 Dag-Erling Smørgrav * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #ifndef nitems #define nitems(a) (sizeof(a) / sizeof(a[0])) #endif #define SNPRINTF_TEST(output, format, ...) \ do { \ char buf[256]; \ assert(strlen(output) < nitems(buf)); \ int ret = snprintf(buf, nitems(buf), format, \ __VA_ARGS__); \ ATF_CHECK_EQ(strlen(output), ret); \ if (ret > 0) { \ ATF_CHECK_EQ(0, strcmp(output, buf)); \ } \ } while (0) ATF_TC_WITHOUT_HEAD(snprintf_b); ATF_TC_BODY(snprintf_b, tc) { SNPRINTF_TEST("0", "%b", 0); SNPRINTF_TEST(" 0", "%12b", 0); SNPRINTF_TEST("000000000000", "%012b", 0); SNPRINTF_TEST("1", "%b", 1); SNPRINTF_TEST(" 1", "%12b", 1); SNPRINTF_TEST("000000000001", "%012b", 1); SNPRINTF_TEST("1111111111111111111111111111111", "%b", INT_MAX); SNPRINTF_TEST("0", "%#b", 0); SNPRINTF_TEST(" 0", "%#12b", 0); SNPRINTF_TEST("000000000000", "%#012b", 0); SNPRINTF_TEST("0b1", "%#b", 1); SNPRINTF_TEST(" 0b1", "%#12b", 1); SNPRINTF_TEST("0b0000000001", "%#012b", 1); SNPRINTF_TEST("0b1111111111111111111111111111111", "%#b", INT_MAX); } ATF_TC_WITHOUT_HEAD(snprintf_B); ATF_TC_BODY(snprintf_B, tc) { SNPRINTF_TEST("0", "%B", 0); SNPRINTF_TEST(" 0", "%12B", 0); SNPRINTF_TEST("000000000000", "%012B", 0); SNPRINTF_TEST("1", "%B", 1); SNPRINTF_TEST(" 1", "%12B", 1); SNPRINTF_TEST("000000000001", "%012B", 1); SNPRINTF_TEST("1111111111111111111111111111111", "%B", INT_MAX); SNPRINTF_TEST("0", "%#B", 0); SNPRINTF_TEST(" 0", "%#12B", 0); SNPRINTF_TEST("000000000000", "%#012B", 0); SNPRINTF_TEST("0B1", "%#B", 1); SNPRINTF_TEST(" 0B1", "%#12B", 1); SNPRINTF_TEST("0B0000000001", "%#012B", 1); SNPRINTF_TEST("0B1111111111111111111111111111111", "%#B", INT_MAX); } ATF_TC_WITHOUT_HEAD(snprintf_d); ATF_TC_BODY(snprintf_d, tc) { SNPRINTF_TEST("0", "%d", 0); SNPRINTF_TEST(" 0", "%12d", 0); SNPRINTF_TEST("000000000000", "%012d", 0); SNPRINTF_TEST("1", "%d", 1); SNPRINTF_TEST(" 1", "%12d", 1); SNPRINTF_TEST("000000000001", "%012d", 1); SNPRINTF_TEST("2147483647", "%d", INT_MAX); SNPRINTF_TEST(" 2147483647", "%12d", INT_MAX); SNPRINTF_TEST("002147483647", "%012d", INT_MAX); SNPRINTF_TEST("2,147,483,647", "%'d", INT_MAX); } ATF_TC_WITHOUT_HEAD(snprintf_x); ATF_TC_BODY(snprintf_x, tc) { SNPRINTF_TEST("0", "%x", 0); SNPRINTF_TEST(" 0", "%12x", 0); SNPRINTF_TEST("000000000000", "%012x", 0); SNPRINTF_TEST("1", "%x", 1); SNPRINTF_TEST(" 1", "%12x", 1); SNPRINTF_TEST("000000000001", "%012x", 1); SNPRINTF_TEST("7fffffff", "%x", INT_MAX); SNPRINTF_TEST(" 7fffffff", "%12x", INT_MAX); SNPRINTF_TEST("00007fffffff", "%012x", INT_MAX); SNPRINTF_TEST("0", "%#x", 0); SNPRINTF_TEST(" 0", "%#12x", 0); SNPRINTF_TEST("000000000000", "%#012x", 0); SNPRINTF_TEST("0x1", "%#x", 1); SNPRINTF_TEST(" 0x1", "%#12x", 1); SNPRINTF_TEST("0x0000000001", "%#012x", 1); SNPRINTF_TEST("0x7fffffff", "%#x", INT_MAX); SNPRINTF_TEST(" 0x7fffffff", "%#12x", INT_MAX); SNPRINTF_TEST("0x007fffffff", "%#012x", INT_MAX); } ATF_TC_WITHOUT_HEAD(snprintf_X); ATF_TC_BODY(snprintf_X, tc) { SNPRINTF_TEST("0", "%X", 0); SNPRINTF_TEST(" 0", "%12X", 0); SNPRINTF_TEST("000000000000", "%012X", 0); SNPRINTF_TEST("1", "%X", 1); SNPRINTF_TEST(" 1", "%12X", 1); SNPRINTF_TEST("000000000001", "%012X", 1); SNPRINTF_TEST("7FFFFFFF", "%X", INT_MAX); SNPRINTF_TEST(" 7FFFFFFF", "%12X", INT_MAX); SNPRINTF_TEST("00007FFFFFFF", "%012X", INT_MAX); SNPRINTF_TEST("0", "%#X", 0); SNPRINTF_TEST(" 0", "%#12X", 0); SNPRINTF_TEST("000000000000", "%#012X", 0); SNPRINTF_TEST("0X1", "%#X", 1); SNPRINTF_TEST(" 0X1", "%#12X", 1); SNPRINTF_TEST("0X0000000001", "%#012X", 1); SNPRINTF_TEST("0X7FFFFFFF", "%#X", INT_MAX); SNPRINTF_TEST(" 0X7FFFFFFF", "%#12X", INT_MAX); SNPRINTF_TEST("0X007FFFFFFF", "%#012X", INT_MAX); } +ATF_TC_WITHOUT_HEAD(snprintf_wN); +ATF_TC_BODY(snprintf_wN, tc) +{ + SNPRINTF_TEST("0", "%w8d", (int8_t)0); + SNPRINTF_TEST("-128", "%w8d", (int8_t)CHAR_MIN); + SNPRINTF_TEST("127", "%w8d", (int8_t)CHAR_MAX); + SNPRINTF_TEST("0", "%w8u", (uint8_t)0); + SNPRINTF_TEST("255", "%w8u", (uint8_t)UCHAR_MAX); + + SNPRINTF_TEST("0", "%w16d", (int16_t)0); + SNPRINTF_TEST("-32768", "%w16d", (int16_t)SHRT_MIN); + SNPRINTF_TEST("32767", "%w16d", (int16_t)SHRT_MAX); + SNPRINTF_TEST("0", "%w16u", (uint16_t)0); + SNPRINTF_TEST("65535", "%w16u", (uint16_t)USHRT_MAX); + + SNPRINTF_TEST("0", "%w32d", (int32_t)0); + SNPRINTF_TEST("-2147483648", "%w32d", (int32_t)INT_MIN); + SNPRINTF_TEST("2147483647", "%w32d", (int32_t)INT_MAX); + SNPRINTF_TEST("0", "%w32u", (uint32_t)0); + SNPRINTF_TEST("4294967295", "%w32u", (uint32_t)UINT_MAX); + + SNPRINTF_TEST("0", "%w64d", (int64_t)0); + SNPRINTF_TEST("-9223372036854775808", "%w64d", (int64_t)LLONG_MIN); + SNPRINTF_TEST("9223372036854775807", "%w64d", (int64_t)LLONG_MAX); + SNPRINTF_TEST("0", "%w64u", (uint64_t)0); + SNPRINTF_TEST("18446744073709551615", "%w64u", (uint64_t)ULLONG_MAX); + + SNPRINTF_TEST("wd", "%wd", 0); + SNPRINTF_TEST("w1d", "%w1d", 0); + SNPRINTF_TEST("w128d", "%w128d", 0); +} + +ATF_TC_WITHOUT_HEAD(snprintf_wfN); +ATF_TC_BODY(snprintf_wfN, tc) +{ + SNPRINTF_TEST("0", "%wf8d", (int_fast8_t)0); + SNPRINTF_TEST("-2147483648", "%wf8d", (int_fast8_t)INT_MIN); + SNPRINTF_TEST("2147483647", "%wf8d", (int_fast8_t)INT_MAX); + SNPRINTF_TEST("0", "%wf8u", (uint8_t)0); + SNPRINTF_TEST("4294967295", "%wf8u", (uint_fast8_t)UINT_MAX); + + SNPRINTF_TEST("0", "%wf16d", (int_fast16_t)0); + SNPRINTF_TEST("-2147483648", "%wf16d", (int_fast16_t)INT_MIN); + SNPRINTF_TEST("2147483647", "%wf16d", (int_fast16_t)INT_MAX); + SNPRINTF_TEST("0", "%wf16u", (uint16_t)0); + SNPRINTF_TEST("4294967295", "%wf16u", (uint_fast16_t)UINT_MAX); + + SNPRINTF_TEST("0", "%wf32d", (int_fast32_t)0); + SNPRINTF_TEST("-2147483648", "%wf32d", (int_fast32_t)INT_MIN); + SNPRINTF_TEST("2147483647", "%wf32d", (int_fast32_t)INT_MAX); + SNPRINTF_TEST("0", "%wf32u", (uint32_t)0); + SNPRINTF_TEST("4294967295", "%wf32u", (uint_fast32_t)UINT_MAX); + + SNPRINTF_TEST("0", "%wf64d", (int_fast64_t)0); + SNPRINTF_TEST("-9223372036854775808", "%wf64d", (int_fast64_t)LLONG_MIN); + SNPRINTF_TEST("9223372036854775807", "%wf64d", (int_fast64_t)LLONG_MAX); + SNPRINTF_TEST("0", "%wf64u", (uint64_t)0); + SNPRINTF_TEST("18446744073709551615", "%wf64u", (uint_fast64_t)ULLONG_MAX); + + SNPRINTF_TEST("wfd", "%wfd", 0); + SNPRINTF_TEST("wf1d", "%wf1d", 0); + SNPRINTF_TEST("wf128d", "%wf128d", 0); +} + ATF_TP_ADD_TCS(tp) { setlocale(LC_NUMERIC, "en_US.UTF-8"); ATF_TP_ADD_TC(tp, snprintf_b); ATF_TP_ADD_TC(tp, snprintf_B); ATF_TP_ADD_TC(tp, snprintf_d); ATF_TP_ADD_TC(tp, snprintf_x); ATF_TP_ADD_TC(tp, snprintf_X); + ATF_TP_ADD_TC(tp, snprintf_wN); + ATF_TP_ADD_TC(tp, snprintf_wfN); return (atf_no_error()); } diff --git a/lib/libc/tests/stdio/sscanf_test.c b/lib/libc/tests/stdio/sscanf_test.c index 462b4a6586da..e916873d38c3 100644 --- a/lib/libc/tests/stdio/sscanf_test.c +++ b/lib/libc/tests/stdio/sscanf_test.c @@ -1,266 +1,331 @@ /*- * Copyright (c) 2023 Dag-Erling Smørgrav * * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include #include static const struct sscanf_test_case { char input[8]; struct { int ret, val, len; } b, o, d, x, i; } sscanf_test_cases[] = { // input binary octal decimal hexadecimal automatic // all digits { "0", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, { "1", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, }, { "2", { 0, 0, 0 }, { 1, 2, 1 }, { 1, 2, 1 }, { 1, 2, 1 }, { 1, 2, 1 }, }, { "3", { 0, 0, 0 }, { 1, 3, 1 }, { 1, 3, 1 }, { 1, 3, 1 }, { 1, 3, 1 }, }, { "4", { 0, 0, 0 }, { 1, 4, 1 }, { 1, 4, 1 }, { 1, 4, 1 }, { 1, 4, 1 }, }, { "5", { 0, 0, 0 }, { 1, 5, 1 }, { 1, 5, 1 }, { 1, 5, 1 }, { 1, 5, 1 }, }, { "6", { 0, 0, 0 }, { 1, 6, 1 }, { 1, 6, 1 }, { 1, 6, 1 }, { 1, 6, 1 }, }, { "7", { 0, 0, 0 }, { 1, 7, 1 }, { 1, 7, 1 }, { 1, 7, 1 }, { 1, 7, 1 }, }, { "8", { 0, 0, 0 }, { 0, 0, 0 }, { 1, 8, 1 }, { 1, 8, 1 }, { 1, 8, 1 }, }, { "9", { 0, 0, 0 }, { 0, 0, 0 }, { 1, 9, 1 }, { 1, 9, 1 }, { 1, 9, 1 }, }, { "A", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 10, 1 }, { 0, 0, 0 }, }, { "B", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 11, 1 }, { 0, 0, 0 }, }, { "C", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 12, 1 }, { 0, 0, 0 }, }, { "D", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 13, 1 }, { 0, 0, 0 }, }, { "E", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 14, 1 }, { 0, 0, 0 }, }, { "F", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 15, 1 }, { 0, 0, 0 }, }, { "X", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, }, { "a", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 10, 1 }, { 0, 0, 0 }, }, { "b", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 11, 1 }, { 0, 0, 0 }, }, { "c", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 12, 1 }, { 0, 0, 0 }, }, { "d", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 13, 1 }, { 0, 0, 0 }, }, { "e", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 14, 1 }, { 0, 0, 0 }, }, { "f", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 15, 1 }, { 0, 0, 0 }, }, { "x", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, }, // all digits with leading zero { "00", { 1, 0, 2 }, { 1, 0, 2 }, { 1, 0, 2 }, { 1, 0, 2 }, { 1, 0, 2 }, }, { "01", { 1, 1, 2 }, { 1, 1, 2 }, { 1, 1, 2 }, { 1, 1, 2 }, { 1, 1, 2 }, }, { "02", { 1, 0, 1 }, { 1, 2, 2 }, { 1, 2, 2 }, { 1, 2, 2 }, { 1, 2, 2 }, }, { "03", { 1, 0, 1 }, { 1, 3, 2 }, { 1, 3, 2 }, { 1, 3, 2 }, { 1, 3, 2 }, }, { "04", { 1, 0, 1 }, { 1, 4, 2 }, { 1, 4, 2 }, { 1, 4, 2 }, { 1, 4, 2 }, }, { "05", { 1, 0, 1 }, { 1, 5, 2 }, { 1, 5, 2 }, { 1, 5, 2 }, { 1, 5, 2 }, }, { "06", { 1, 0, 1 }, { 1, 6, 2 }, { 1, 6, 2 }, { 1, 6, 2 }, { 1, 6, 2 }, }, { "07", { 1, 0, 1 }, { 1, 7, 2 }, { 1, 7, 2 }, { 1, 7, 2 }, { 1, 7, 2 }, }, { "08", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 8, 2 }, { 1, 8, 2 }, { 1, 0, 1 }, }, { "09", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 9, 2 }, { 1, 9, 2 }, { 1, 0, 1 }, }, { "0A", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 10, 2 }, { 1, 0, 1 }, }, { "0B", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 2 }, { 1, 0, 1 }, }, { "0C", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 12, 2 }, { 1, 0, 1 }, }, { "0D", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 13, 2 }, { 1, 0, 1 }, }, { "0E", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 14, 2 }, { 1, 0, 1 }, }, { "0F", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 15, 2 }, { 1, 0, 1 }, }, { "0X", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, { "0a", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 10, 2 }, { 1, 0, 1 }, }, { "0b", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 2 }, { 1, 0, 1 }, }, { "0c", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 12, 2 }, { 1, 0, 1 }, }, { "0d", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 13, 2 }, { 1, 0, 1 }, }, { "0e", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 14, 2 }, { 1, 0, 1 }, }, { "0f", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 15, 2 }, { 1, 0, 1 }, }, { "0x", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, // all digits with leading one { "10", { 1, 2, 2 }, { 1, 8, 2 }, { 1, 10, 2 }, { 1, 16, 2 }, { 1, 10, 2 }, }, { "11", { 1, 3, 2 }, { 1, 9, 2 }, { 1, 11, 2 }, { 1, 17, 2 }, { 1, 11, 2 }, }, { "12", { 1, 1, 1 }, { 1, 10, 2 }, { 1, 12, 2 }, { 1, 18, 2 }, { 1, 12, 2 }, }, { "13", { 1, 1, 1 }, { 1, 11, 2 }, { 1, 13, 2 }, { 1, 19, 2 }, { 1, 13, 2 }, }, { "14", { 1, 1, 1 }, { 1, 12, 2 }, { 1, 14, 2 }, { 1, 20, 2 }, { 1, 14, 2 }, }, { "15", { 1, 1, 1 }, { 1, 13, 2 }, { 1, 15, 2 }, { 1, 21, 2 }, { 1, 15, 2 }, }, { "16", { 1, 1, 1 }, { 1, 14, 2 }, { 1, 16, 2 }, { 1, 22, 2 }, { 1, 16, 2 }, }, { "17", { 1, 1, 1 }, { 1, 15, 2 }, { 1, 17, 2 }, { 1, 23, 2 }, { 1, 17, 2 }, }, { "18", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 18, 2 }, { 1, 24, 2 }, { 1, 18, 2 }, }, { "19", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 19, 2 }, { 1, 25, 2 }, { 1, 19, 2 }, }, { "1A", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 26, 2 }, { 1, 1, 1 }, }, { "1B", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 27, 2 }, { 1, 1, 1 }, }, { "1C", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 28, 2 }, { 1, 1, 1 }, }, { "1D", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 29, 2 }, { 1, 1, 1 }, }, { "1E", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 30, 2 }, { 1, 1, 1 }, }, { "1F", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 31, 2 }, { 1, 1, 1 }, }, { "1X", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, }, { "1a", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 26, 2 }, { 1, 1, 1 }, }, { "1b", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 27, 2 }, { 1, 1, 1 }, }, { "1c", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 28, 2 }, { 1, 1, 1 }, }, { "1d", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 29, 2 }, { 1, 1, 1 }, }, { "1e", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 30, 2 }, { 1, 1, 1 }, }, { "1f", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 31, 2 }, { 1, 1, 1 }, }, { "1x", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, }, // all digits with leading binary prefix { "0b0", { 1, 0, 3 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 176, 3 }, { 1, 0, 3 }, }, { "0b1", { 1, 1, 3 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 177, 3 }, { 1, 1, 3 }, }, { "0b2", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 178, 3 }, { 1, 0, 1 }, }, { "0b3", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 179, 3 }, { 1, 0, 1 }, }, { "0b4", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 180, 3 }, { 1, 0, 1 }, }, { "0b5", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 181, 3 }, { 1, 0, 1 }, }, { "0b6", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 182, 3 }, { 1, 0, 1 }, }, { "0b7", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 183, 3 }, { 1, 0, 1 }, }, { "0b8", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 184, 3 }, { 1, 0, 1 }, }, { "0b9", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 185, 3 }, { 1, 0, 1 }, }, { "0bA", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 186, 3 }, { 1, 0, 1 }, }, { "0bB", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 187, 3 }, { 1, 0, 1 }, }, { "0bC", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 188, 3 }, { 1, 0, 1 }, }, { "0bD", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 189, 3 }, { 1, 0, 1 }, }, { "0bE", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 190, 3 }, { 1, 0, 1 }, }, { "0bF", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 191, 3 }, { 1, 0, 1 }, }, { "0bX", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 2 }, { 1, 0, 1 }, }, { "0ba", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 186, 3 }, { 1, 0, 1 }, }, { "0bb", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 187, 3 }, { 1, 0, 1 }, }, { "0bc", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 188, 3 }, { 1, 0, 1 }, }, { "0bd", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 189, 3 }, { 1, 0, 1 }, }, { "0be", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 190, 3 }, { 1, 0, 1 }, }, { "0bf", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 191, 3 }, { 1, 0, 1 }, }, { "0bx", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 2 }, { 1, 0, 1 }, }, // all digits with leading hexadecimal prefix { "0x0", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 3 }, { 1, 0, 3 }, }, { "0x1", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 1, 3 }, { 1, 1, 3 }, }, { "0x2", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 2, 3 }, { 1, 2, 3 }, }, { "0x3", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 3, 3 }, { 1, 3, 3 }, }, { "0x4", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 4, 3 }, { 1, 4, 3 }, }, { "0x5", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 5, 3 }, { 1, 5, 3 }, }, { "0x6", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 6, 3 }, { 1, 6, 3 }, }, { "0x7", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 7, 3 }, { 1, 7, 3 }, }, { "0x8", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 8, 3 }, { 1, 8, 3 }, }, { "0x9", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 9, 3 }, { 1, 9, 3 }, }, { "0xA", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 10, 3 }, { 1, 10, 3 }, }, { "0xB", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 3 }, { 1, 11, 3 }, }, { "0xC", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 12, 3 }, { 1, 12, 3 }, }, { "0xD", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 13, 3 }, { 1, 13, 3 }, }, { "0xE", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 14, 3 }, { 1, 14, 3 }, }, { "0xF", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 15, 3 }, { 1, 15, 3 }, }, { "0xX", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, { "0xa", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 10, 3 }, { 1, 10, 3 }, }, { "0xb", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 3 }, { 1, 11, 3 }, }, { "0xc", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 12, 3 }, { 1, 12, 3 }, }, { "0xd", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 13, 3 }, { 1, 13, 3 }, }, { "0xe", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 14, 3 }, { 1, 14, 3 }, }, { "0xf", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 15, 3 }, { 1, 15, 3 }, }, { "0xX", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, // terminator { "" } }; #define SSCANF_TEST(string, format, expret, expval, explen) \ do { \ int ret = 0, val = 0, len = 0; \ ret = sscanf(string, format "%n", &val, &len); \ ATF_CHECK_EQ(expret, ret); \ if (expret && ret) { \ ATF_CHECK_EQ(expval, val); \ ATF_CHECK_EQ(explen, len); \ } \ } while (0) ATF_TC_WITHOUT_HEAD(sscanf_b); ATF_TC_BODY(sscanf_b, tc) { const struct sscanf_test_case *stc; char input[16]; for (stc = sscanf_test_cases; *stc->input; stc++) { strcpy(input + 1, stc->input); SSCANF_TEST(input + 1, "%b", stc->b.ret, stc->b.val, stc->b.len); input[0] = '+'; SSCANF_TEST(input, "%b", stc->b.ret, stc->b.val, stc->b.len ? stc->b.len + 1 : 0); input[0] = '-'; SSCANF_TEST(input, "%b", stc->b.ret, -stc->b.val, stc->b.len ? stc->b.len + 1 : 0); } } ATF_TC_WITHOUT_HEAD(sscanf_o); ATF_TC_BODY(sscanf_o, tc) { const struct sscanf_test_case *stc; char input[16]; for (stc = sscanf_test_cases; *stc->input; stc++) { strcpy(input + 1, stc->input); SSCANF_TEST(input + 1, "%o", stc->o.ret, stc->o.val, stc->o.len); input[0] = '+'; SSCANF_TEST(input, "%o", stc->o.ret, stc->o.val, stc->o.len ? stc->o.len + 1 : 0); input[0] = '-'; SSCANF_TEST(input, "%o", stc->o.ret, -stc->o.val, stc->o.len ? stc->o.len + 1 : 0); } } ATF_TC_WITHOUT_HEAD(sscanf_d); ATF_TC_BODY(sscanf_d, tc) { const struct sscanf_test_case *stc; char input[16]; for (stc = sscanf_test_cases; *stc->input; stc++) { strcpy(input + 1, stc->input); SSCANF_TEST(input + 1, "%d", stc->d.ret, stc->d.val, stc->d.len); input[0] = '+'; SSCANF_TEST(input, "%d", stc->d.ret, stc->d.val, stc->d.len ? stc->d.len + 1 : 0); input[0] = '-'; SSCANF_TEST(input, "%d", stc->d.ret, -stc->d.val, stc->d.len ? stc->d.len + 1 : 0); } } ATF_TC_WITHOUT_HEAD(sscanf_x); ATF_TC_BODY(sscanf_x, tc) { const struct sscanf_test_case *stc; char input[16]; for (stc = sscanf_test_cases; *stc->input; stc++) { strcpy(input + 1, stc->input); SSCANF_TEST(input + 1, "%x", stc->x.ret, stc->x.val, stc->x.len); input[0] = '+'; SSCANF_TEST(input, "%x", stc->x.ret, stc->x.val, stc->x.len ? stc->x.len + 1 : 0); input[0] = '-'; SSCANF_TEST(input, "%x", stc->x.ret, -stc->x.val, stc->x.len ? stc->x.len + 1 : 0); } } ATF_TC_WITHOUT_HEAD(sscanf_i); ATF_TC_BODY(sscanf_i, tc) { const struct sscanf_test_case *stc; char input[16]; for (stc = sscanf_test_cases; *stc->input; stc++) { strcpy(input + 1, stc->input); SSCANF_TEST(input + 1, "%i", stc->i.ret, stc->i.val, stc->i.len); input[0] = '+'; SSCANF_TEST(input, "%i", stc->i.ret, stc->i.val, stc->i.len ? stc->i.len + 1 : 0); input[0] = '-'; SSCANF_TEST(input, "%i", stc->i.ret, -stc->i.val, stc->i.len ? stc->i.len + 1 : 0); } } +ATF_TC_WITHOUT_HEAD(sscanf_wN); +ATF_TC_BODY(sscanf_wN, tc) +{ + const char x00[] = "0x00"; + const char x7f[] = "0x7fffffffffffffff"; + const char xff[] = "0xffffffffffffffff"; + +#define SSCANF_WN_TEST(N, imin, umax) \ + do { \ + int##N##_t i; \ + uint##N##_t u; \ + ATF_CHECK_EQ(1, sscanf(x00, "%w" #N "i", &i)); \ + ATF_CHECK_EQ(0, i); \ + ATF_CHECK_EQ(1, sscanf(x7f, "%w" #N "i", &i)); \ + ATF_CHECK_EQ(imin, i); \ + ATF_CHECK_EQ(1, sscanf(x00, "%w" #N "x", &u)); \ + ATF_CHECK_EQ(0, u); \ + ATF_CHECK_EQ(1, sscanf(xff, "%w" #N "x", &u)); \ + ATF_CHECK_EQ(umax, u); \ + } while (0) + SSCANF_WN_TEST(8, -1, UCHAR_MAX); + SSCANF_WN_TEST(16, -1, USHRT_MAX); + SSCANF_WN_TEST(32, -1, UINT_MAX); + SSCANF_WN_TEST(64, LLONG_MAX, ULLONG_MAX); +#undef SSCANF_WN_TEST + + ATF_CHECK_EQ(0, sscanf(x00, "%wi", (int *)NULL)); + ATF_CHECK_EQ(0, sscanf(x00, "%w1i", (int *)NULL)); + ATF_CHECK_EQ(0, sscanf(x00, "%w128i", (int *)NULL)); +} + +ATF_TC_WITHOUT_HEAD(sscanf_wfN); +ATF_TC_BODY(sscanf_wfN, tc) +{ + const char x00[] = "0x00"; + const char x7f[] = "0x7fffffffffffffff"; + const char xff[] = "0xffffffffffffffff"; + +#define SSCANF_WFN_TEST(N, imin, umax) \ + do { \ + int_fast##N##_t i; \ + uint_fast##N##_t u; \ + ATF_CHECK_EQ(1, sscanf(x00, "%wf" #N "i", &i)); \ + ATF_CHECK_EQ(0, i); \ + ATF_CHECK_EQ(1, sscanf(x7f, "%wf" #N "i", &i)); \ + ATF_CHECK_EQ(imin, i); \ + ATF_CHECK_EQ(1, sscanf(x00, "%wf" #N "x", &u)); \ + ATF_CHECK_EQ(0, u); \ + ATF_CHECK_EQ(1, sscanf(xff, "%wf" #N "x", &u)); \ + ATF_CHECK_EQ(umax, u); \ + } while (0) + SSCANF_WFN_TEST(8, -1, UINT_MAX); + SSCANF_WFN_TEST(16, -1, UINT_MAX); + SSCANF_WFN_TEST(32, -1, UINT_MAX); + SSCANF_WFN_TEST(64, LLONG_MAX, ULLONG_MAX); +#undef SSCANF_WFN_TEST + + ATF_CHECK_EQ(0, sscanf(x00, "%wfi", (int *)NULL)); + ATF_CHECK_EQ(0, sscanf(x00, "%wf1i", (int *)NULL)); + ATF_CHECK_EQ(0, sscanf(x00, "%wf128i", (int *)NULL)); +} + /* * Test termination cases: non-numeric character, fixed width, EOF */ ATF_TC_WITHOUT_HEAD(sscanf_termination); ATF_TC_BODY(sscanf_termination, tc) { int a = 0, b = 0, c = 0; char d = 0; ATF_CHECK_EQ(4, sscanf("3.1415", "%d%c%2d%d", &a, &d, &b, &c)); ATF_CHECK_EQ(3, a); ATF_CHECK_EQ(14, b); ATF_CHECK_EQ(15, c); ATF_CHECK_EQ('.', d); } ATF_TP_ADD_TCS(tp) { setlocale(LC_NUMERIC, "en_US.UTF-8"); ATF_TP_ADD_TC(tp, sscanf_b); ATF_TP_ADD_TC(tp, sscanf_o); ATF_TP_ADD_TC(tp, sscanf_d); ATF_TP_ADD_TC(tp, sscanf_x); ATF_TP_ADD_TC(tp, sscanf_i); + ATF_TP_ADD_TC(tp, sscanf_wN); + ATF_TP_ADD_TC(tp, sscanf_wfN); ATF_TP_ADD_TC(tp, sscanf_termination); return (atf_no_error()); } diff --git a/lib/libc/tests/stdio/swprintf_test.c b/lib/libc/tests/stdio/swprintf_test.c index 23859b5cd2e1..f5dde349412b 100644 --- a/lib/libc/tests/stdio/swprintf_test.c +++ b/lib/libc/tests/stdio/swprintf_test.c @@ -1,140 +1,206 @@ /*- * Copyright (c) 2023 Dag-Erling Smørgrav * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #ifndef nitems #define nitems(a) (sizeof(a) / sizeof(a[0])) #endif #define SWPRINTF_TEST(output, format, ...) \ do { \ wchar_t buf[256]; \ assert(wcslen(L##output) < nitems(buf)); \ int ret = swprintf(buf, nitems(buf), L##format, \ __VA_ARGS__); \ ATF_CHECK_EQ(wcslen(L##output), ret); \ if (ret > 0) { \ ATF_CHECK_EQ(0, wcscmp(L##output, buf)); \ } \ } while (0) ATF_TC_WITHOUT_HEAD(swprintf_b); ATF_TC_BODY(swprintf_b, tc) { SWPRINTF_TEST("0", "%b", 0); SWPRINTF_TEST(" 0", "%12b", 0); SWPRINTF_TEST("000000000000", "%012b", 0); SWPRINTF_TEST("1", "%b", 1); SWPRINTF_TEST(" 1", "%12b", 1); SWPRINTF_TEST("000000000001", "%012b", 1); SWPRINTF_TEST("1111111111111111111111111111111", "%b", INT_MAX); SWPRINTF_TEST("0", "%#b", 0); SWPRINTF_TEST(" 0", "%#12b", 0); SWPRINTF_TEST("000000000000", "%#012b", 0); SWPRINTF_TEST("0b1", "%#b", 1); SWPRINTF_TEST(" 0b1", "%#12b", 1); SWPRINTF_TEST("0b0000000001", "%#012b", 1); SWPRINTF_TEST("0b1111111111111111111111111111111", "%#b", INT_MAX); } ATF_TC_WITHOUT_HEAD(swprintf_B); ATF_TC_BODY(swprintf_B, tc) { SWPRINTF_TEST("0", "%B", 0); SWPRINTF_TEST(" 0", "%12B", 0); SWPRINTF_TEST("000000000000", "%012B", 0); SWPRINTF_TEST("1", "%B", 1); SWPRINTF_TEST(" 1", "%12B", 1); SWPRINTF_TEST("000000000001", "%012B", 1); SWPRINTF_TEST("1111111111111111111111111111111", "%B", INT_MAX); SWPRINTF_TEST("0", "%#B", 0); SWPRINTF_TEST(" 0", "%#12B", 0); SWPRINTF_TEST("000000000000", "%#012B", 0); SWPRINTF_TEST("0B1", "%#B", 1); SWPRINTF_TEST(" 0B1", "%#12B", 1); SWPRINTF_TEST("0B0000000001", "%#012B", 1); SWPRINTF_TEST("0B1111111111111111111111111111111", "%#B", INT_MAX); } ATF_TC_WITHOUT_HEAD(swprintf_d); ATF_TC_BODY(swprintf_d, tc) { SWPRINTF_TEST("0", "%d", 0); SWPRINTF_TEST(" 0", "%12d", 0); SWPRINTF_TEST("000000000000", "%012d", 0); SWPRINTF_TEST("1", "%d", 1); SWPRINTF_TEST(" 1", "%12d", 1); SWPRINTF_TEST("000000000001", "%012d", 1); SWPRINTF_TEST("2147483647", "%d", INT_MAX); SWPRINTF_TEST(" 2147483647", "%12d", INT_MAX); SWPRINTF_TEST("002147483647", "%012d", INT_MAX); SWPRINTF_TEST("2,147,483,647", "%'d", INT_MAX); } ATF_TC_WITHOUT_HEAD(swprintf_x); ATF_TC_BODY(swprintf_x, tc) { SWPRINTF_TEST("0", "%x", 0); SWPRINTF_TEST(" 0", "%12x", 0); SWPRINTF_TEST("000000000000", "%012x", 0); SWPRINTF_TEST("1", "%x", 1); SWPRINTF_TEST(" 1", "%12x", 1); SWPRINTF_TEST("000000000001", "%012x", 1); SWPRINTF_TEST("7fffffff", "%x", INT_MAX); SWPRINTF_TEST(" 7fffffff", "%12x", INT_MAX); SWPRINTF_TEST("00007fffffff", "%012x", INT_MAX); SWPRINTF_TEST("0", "%#x", 0); SWPRINTF_TEST(" 0", "%#12x", 0); SWPRINTF_TEST("000000000000", "%#012x", 0); SWPRINTF_TEST("0x1", "%#x", 1); SWPRINTF_TEST(" 0x1", "%#12x", 1); SWPRINTF_TEST("0x0000000001", "%#012x", 1); SWPRINTF_TEST("0x7fffffff", "%#x", INT_MAX); SWPRINTF_TEST(" 0x7fffffff", "%#12x", INT_MAX); SWPRINTF_TEST("0x007fffffff", "%#012x", INT_MAX); } ATF_TC_WITHOUT_HEAD(swprintf_X); ATF_TC_BODY(swprintf_X, tc) { SWPRINTF_TEST("0", "%X", 0); SWPRINTF_TEST(" 0", "%12X", 0); SWPRINTF_TEST("000000000000", "%012X", 0); SWPRINTF_TEST("1", "%X", 1); SWPRINTF_TEST(" 1", "%12X", 1); SWPRINTF_TEST("000000000001", "%012X", 1); SWPRINTF_TEST("7FFFFFFF", "%X", INT_MAX); SWPRINTF_TEST(" 7FFFFFFF", "%12X", INT_MAX); SWPRINTF_TEST("00007FFFFFFF", "%012X", INT_MAX); SWPRINTF_TEST("0", "%#X", 0); SWPRINTF_TEST(" 0", "%#12X", 0); SWPRINTF_TEST("000000000000", "%#012X", 0); SWPRINTF_TEST("0X1", "%#X", 1); SWPRINTF_TEST(" 0X1", "%#12X", 1); SWPRINTF_TEST("0X0000000001", "%#012X", 1); SWPRINTF_TEST("0X7FFFFFFF", "%#X", INT_MAX); SWPRINTF_TEST(" 0X7FFFFFFF", "%#12X", INT_MAX); SWPRINTF_TEST("0X007FFFFFFF", "%#012X", INT_MAX); } +ATF_TC_WITHOUT_HEAD(swprintf_wN); +ATF_TC_BODY(swprintf_wN, tc) +{ + SWPRINTF_TEST("0", "%w8d", (int8_t)0); + SWPRINTF_TEST("-128", "%w8d", (int8_t)CHAR_MIN); + SWPRINTF_TEST("127", "%w8d", (int8_t)CHAR_MAX); + SWPRINTF_TEST("0", "%w8u", (uint8_t)0); + SWPRINTF_TEST("255", "%w8u", (uint8_t)UCHAR_MAX); + + SWPRINTF_TEST("0", "%w16d", (int16_t)0); + SWPRINTF_TEST("-32768", "%w16d", (int16_t)SHRT_MIN); + SWPRINTF_TEST("32767", "%w16d", (int16_t)SHRT_MAX); + SWPRINTF_TEST("0", "%w16u", (uint16_t)0); + SWPRINTF_TEST("65535", "%w16u", (uint16_t)USHRT_MAX); + + SWPRINTF_TEST("0", "%w32d", (int32_t)0); + SWPRINTF_TEST("-2147483648", "%w32d", (int32_t)INT_MIN); + SWPRINTF_TEST("2147483647", "%w32d", (int32_t)INT_MAX); + SWPRINTF_TEST("0", "%w32u", (uint32_t)0); + SWPRINTF_TEST("4294967295", "%w32u", (uint32_t)UINT_MAX); + + SWPRINTF_TEST("0", "%w64d", (int64_t)0); + SWPRINTF_TEST("-9223372036854775808", "%w64d", (int64_t)LLONG_MIN); + SWPRINTF_TEST("9223372036854775807", "%w64d", (int64_t)LLONG_MAX); + SWPRINTF_TEST("0", "%w64u", (uint64_t)0); + SWPRINTF_TEST("18446744073709551615", "%w64u", (uint64_t)ULLONG_MAX); + + SWPRINTF_TEST("wd", "%wd", 0); + SWPRINTF_TEST("w1d", "%w1d", 0); + SWPRINTF_TEST("w128d", "%w128d", 0); +} + +ATF_TC_WITHOUT_HEAD(swprintf_wfN); +ATF_TC_BODY(swprintf_wfN, tc) +{ + SWPRINTF_TEST("0", "%wf8d", (int_fast8_t)0); + SWPRINTF_TEST("-2147483648", "%wf8d", (int_fast8_t)INT_MIN); + SWPRINTF_TEST("2147483647", "%wf8d", (int_fast8_t)INT_MAX); + SWPRINTF_TEST("0", "%wf8u", (uint8_t)0); + SWPRINTF_TEST("4294967295", "%wf8u", (uint_fast8_t)UINT_MAX); + + SWPRINTF_TEST("0", "%wf16d", (int_fast16_t)0); + SWPRINTF_TEST("-2147483648", "%wf16d", (int_fast16_t)INT_MIN); + SWPRINTF_TEST("2147483647", "%wf16d", (int_fast16_t)INT_MAX); + SWPRINTF_TEST("0", "%wf16u", (uint16_t)0); + SWPRINTF_TEST("4294967295", "%wf16u", (uint_fast16_t)UINT_MAX); + + SWPRINTF_TEST("0", "%wf32d", (int_fast32_t)0); + SWPRINTF_TEST("-2147483648", "%wf32d", (int_fast32_t)INT_MIN); + SWPRINTF_TEST("2147483647", "%wf32d", (int_fast32_t)INT_MAX); + SWPRINTF_TEST("0", "%wf32u", (uint32_t)0); + SWPRINTF_TEST("4294967295", "%wf32u", (uint_fast32_t)UINT_MAX); + + SWPRINTF_TEST("0", "%wf64d", (int_fast64_t)0); + SWPRINTF_TEST("-9223372036854775808", "%wf64d", (int_fast64_t)LLONG_MIN); + SWPRINTF_TEST("9223372036854775807", "%wf64d", (int_fast64_t)LLONG_MAX); + SWPRINTF_TEST("0", "%wf64u", (uint64_t)0); + SWPRINTF_TEST("18446744073709551615", "%wf64u", (uint_fast64_t)ULLONG_MAX); + + SWPRINTF_TEST("wfd", "%wfd", 0); + SWPRINTF_TEST("wf1d", "%wf1d", 0); + SWPRINTF_TEST("wf128d", "%wf128d", 0); +} + ATF_TP_ADD_TCS(tp) { setlocale(LC_NUMERIC, "en_US.UTF-8"); ATF_TP_ADD_TC(tp, swprintf_b); ATF_TP_ADD_TC(tp, swprintf_B); ATF_TP_ADD_TC(tp, swprintf_d); ATF_TP_ADD_TC(tp, swprintf_x); ATF_TP_ADD_TC(tp, swprintf_X); + ATF_TP_ADD_TC(tp, swprintf_wN); + ATF_TP_ADD_TC(tp, swprintf_wfN); return (atf_no_error()); } diff --git a/lib/libc/tests/stdio/swscanf_test.c b/lib/libc/tests/stdio/swscanf_test.c index 10eaf786e5fa..f7ad30b963a7 100644 --- a/lib/libc/tests/stdio/swscanf_test.c +++ b/lib/libc/tests/stdio/swscanf_test.c @@ -1,267 +1,334 @@ /*- * Copyright (c) 2023 Dag-Erling Smørgrav * * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include #include #include +#define L(s) L ## s + static const struct swscanf_test_case { wchar_t input[8]; struct { int ret, val, len; } b, o, d, x, i; } swscanf_test_cases[] = { // input binary octal decimal hexadecimal automatic // all digits { L"0", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, { L"1", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, }, { L"2", { 0, 0, 0 }, { 1, 2, 1 }, { 1, 2, 1 }, { 1, 2, 1 }, { 1, 2, 1 }, }, { L"3", { 0, 0, 0 }, { 1, 3, 1 }, { 1, 3, 1 }, { 1, 3, 1 }, { 1, 3, 1 }, }, { L"4", { 0, 0, 0 }, { 1, 4, 1 }, { 1, 4, 1 }, { 1, 4, 1 }, { 1, 4, 1 }, }, { L"5", { 0, 0, 0 }, { 1, 5, 1 }, { 1, 5, 1 }, { 1, 5, 1 }, { 1, 5, 1 }, }, { L"6", { 0, 0, 0 }, { 1, 6, 1 }, { 1, 6, 1 }, { 1, 6, 1 }, { 1, 6, 1 }, }, { L"7", { 0, 0, 0 }, { 1, 7, 1 }, { 1, 7, 1 }, { 1, 7, 1 }, { 1, 7, 1 }, }, { L"8", { 0, 0, 0 }, { 0, 0, 0 }, { 1, 8, 1 }, { 1, 8, 1 }, { 1, 8, 1 }, }, { L"9", { 0, 0, 0 }, { 0, 0, 0 }, { 1, 9, 1 }, { 1, 9, 1 }, { 1, 9, 1 }, }, { L"A", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 10, 1 }, { 0, 0, 0 }, }, { L"B", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 11, 1 }, { 0, 0, 0 }, }, { L"C", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 12, 1 }, { 0, 0, 0 }, }, { L"D", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 13, 1 }, { 0, 0, 0 }, }, { L"E", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 14, 1 }, { 0, 0, 0 }, }, { L"F", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 15, 1 }, { 0, 0, 0 }, }, { L"X", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, }, { L"a", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 10, 1 }, { 0, 0, 0 }, }, { L"b", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 11, 1 }, { 0, 0, 0 }, }, { L"c", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 12, 1 }, { 0, 0, 0 }, }, { L"d", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 13, 1 }, { 0, 0, 0 }, }, { L"e", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 14, 1 }, { 0, 0, 0 }, }, { L"f", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 1, 15, 1 }, { 0, 0, 0 }, }, { L"x", { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, }, // all digits with leading zero { L"00", { 1, 0, 2 }, { 1, 0, 2 }, { 1, 0, 2 }, { 1, 0, 2 }, { 1, 0, 2 }, }, { L"01", { 1, 1, 2 }, { 1, 1, 2 }, { 1, 1, 2 }, { 1, 1, 2 }, { 1, 1, 2 }, }, { L"02", { 1, 0, 1 }, { 1, 2, 2 }, { 1, 2, 2 }, { 1, 2, 2 }, { 1, 2, 2 }, }, { L"03", { 1, 0, 1 }, { 1, 3, 2 }, { 1, 3, 2 }, { 1, 3, 2 }, { 1, 3, 2 }, }, { L"04", { 1, 0, 1 }, { 1, 4, 2 }, { 1, 4, 2 }, { 1, 4, 2 }, { 1, 4, 2 }, }, { L"05", { 1, 0, 1 }, { 1, 5, 2 }, { 1, 5, 2 }, { 1, 5, 2 }, { 1, 5, 2 }, }, { L"06", { 1, 0, 1 }, { 1, 6, 2 }, { 1, 6, 2 }, { 1, 6, 2 }, { 1, 6, 2 }, }, { L"07", { 1, 0, 1 }, { 1, 7, 2 }, { 1, 7, 2 }, { 1, 7, 2 }, { 1, 7, 2 }, }, { L"08", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 8, 2 }, { 1, 8, 2 }, { 1, 0, 1 }, }, { L"09", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 9, 2 }, { 1, 9, 2 }, { 1, 0, 1 }, }, { L"0A", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 10, 2 }, { 1, 0, 1 }, }, { L"0B", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 2 }, { 1, 0, 1 }, }, { L"0C", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 12, 2 }, { 1, 0, 1 }, }, { L"0D", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 13, 2 }, { 1, 0, 1 }, }, { L"0E", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 14, 2 }, { 1, 0, 1 }, }, { L"0F", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 15, 2 }, { 1, 0, 1 }, }, { L"0X", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, { L"0a", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 10, 2 }, { 1, 0, 1 }, }, { L"0b", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 2 }, { 1, 0, 1 }, }, { L"0c", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 12, 2 }, { 1, 0, 1 }, }, { L"0d", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 13, 2 }, { 1, 0, 1 }, }, { L"0e", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 14, 2 }, { 1, 0, 1 }, }, { L"0f", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 15, 2 }, { 1, 0, 1 }, }, { L"0x", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, // all digits with leading one { L"10", { 1, 2, 2 }, { 1, 8, 2 }, { 1, 10, 2 }, { 1, 16, 2 }, { 1, 10, 2 }, }, { L"11", { 1, 3, 2 }, { 1, 9, 2 }, { 1, 11, 2 }, { 1, 17, 2 }, { 1, 11, 2 }, }, { L"12", { 1, 1, 1 }, { 1, 10, 2 }, { 1, 12, 2 }, { 1, 18, 2 }, { 1, 12, 2 }, }, { L"13", { 1, 1, 1 }, { 1, 11, 2 }, { 1, 13, 2 }, { 1, 19, 2 }, { 1, 13, 2 }, }, { L"14", { 1, 1, 1 }, { 1, 12, 2 }, { 1, 14, 2 }, { 1, 20, 2 }, { 1, 14, 2 }, }, { L"15", { 1, 1, 1 }, { 1, 13, 2 }, { 1, 15, 2 }, { 1, 21, 2 }, { 1, 15, 2 }, }, { L"16", { 1, 1, 1 }, { 1, 14, 2 }, { 1, 16, 2 }, { 1, 22, 2 }, { 1, 16, 2 }, }, { L"17", { 1, 1, 1 }, { 1, 15, 2 }, { 1, 17, 2 }, { 1, 23, 2 }, { 1, 17, 2 }, }, { L"18", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 18, 2 }, { 1, 24, 2 }, { 1, 18, 2 }, }, { L"19", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 19, 2 }, { 1, 25, 2 }, { 1, 19, 2 }, }, { L"1A", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 26, 2 }, { 1, 1, 1 }, }, { L"1B", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 27, 2 }, { 1, 1, 1 }, }, { L"1C", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 28, 2 }, { 1, 1, 1 }, }, { L"1D", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 29, 2 }, { 1, 1, 1 }, }, { L"1E", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 30, 2 }, { 1, 1, 1 }, }, { L"1F", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 31, 2 }, { 1, 1, 1 }, }, { L"1X", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, }, { L"1a", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 26, 2 }, { 1, 1, 1 }, }, { L"1b", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 27, 2 }, { 1, 1, 1 }, }, { L"1c", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 28, 2 }, { 1, 1, 1 }, }, { L"1d", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 29, 2 }, { 1, 1, 1 }, }, { L"1e", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 30, 2 }, { 1, 1, 1 }, }, { L"1f", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 31, 2 }, { 1, 1, 1 }, }, { L"1x", { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, }, // all digits with leading binary prefix { L"0b0", { 1, 0, 3 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 176, 3 }, { 1, 0, 3 }, }, { L"0b1", { 1, 1, 3 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 177, 3 }, { 1, 1, 3 }, }, { L"0b2", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 178, 3 }, { 1, 0, 1 }, }, { L"0b3", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 179, 3 }, { 1, 0, 1 }, }, { L"0b4", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 180, 3 }, { 1, 0, 1 }, }, { L"0b5", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 181, 3 }, { 1, 0, 1 }, }, { L"0b6", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 182, 3 }, { 1, 0, 1 }, }, { L"0b7", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 183, 3 }, { 1, 0, 1 }, }, { L"0b8", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 184, 3 }, { 1, 0, 1 }, }, { L"0b9", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 185, 3 }, { 1, 0, 1 }, }, { L"0bA", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 186, 3 }, { 1, 0, 1 }, }, { L"0bB", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 187, 3 }, { 1, 0, 1 }, }, { L"0bC", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 188, 3 }, { 1, 0, 1 }, }, { L"0bD", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 189, 3 }, { 1, 0, 1 }, }, { L"0bE", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 190, 3 }, { 1, 0, 1 }, }, { L"0bF", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 191, 3 }, { 1, 0, 1 }, }, { L"0bX", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 2 }, { 1, 0, 1 }, }, { L"0ba", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 186, 3 }, { 1, 0, 1 }, }, { L"0bb", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 187, 3 }, { 1, 0, 1 }, }, { L"0bc", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 188, 3 }, { 1, 0, 1 }, }, { L"0bd", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 189, 3 }, { 1, 0, 1 }, }, { L"0be", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 190, 3 }, { 1, 0, 1 }, }, { L"0bf", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 191, 3 }, { 1, 0, 1 }, }, { L"0bx", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 2 }, { 1, 0, 1 }, }, // all digits with leading hexadecimal prefix { L"0x0", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 3 }, { 1, 0, 3 }, }, { L"0x1", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 1, 3 }, { 1, 1, 3 }, }, { L"0x2", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 2, 3 }, { 1, 2, 3 }, }, { L"0x3", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 3, 3 }, { 1, 3, 3 }, }, { L"0x4", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 4, 3 }, { 1, 4, 3 }, }, { L"0x5", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 5, 3 }, { 1, 5, 3 }, }, { L"0x6", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 6, 3 }, { 1, 6, 3 }, }, { L"0x7", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 7, 3 }, { 1, 7, 3 }, }, { L"0x8", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 8, 3 }, { 1, 8, 3 }, }, { L"0x9", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 9, 3 }, { 1, 9, 3 }, }, { L"0xA", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 10, 3 }, { 1, 10, 3 }, }, { L"0xB", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 3 }, { 1, 11, 3 }, }, { L"0xC", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 12, 3 }, { 1, 12, 3 }, }, { L"0xD", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 13, 3 }, { 1, 13, 3 }, }, { L"0xE", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 14, 3 }, { 1, 14, 3 }, }, { L"0xF", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 15, 3 }, { 1, 15, 3 }, }, { L"0xX", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, { L"0xa", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 10, 3 }, { 1, 10, 3 }, }, { L"0xb", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 11, 3 }, { 1, 11, 3 }, }, { L"0xc", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 12, 3 }, { 1, 12, 3 }, }, { L"0xd", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 13, 3 }, { 1, 13, 3 }, }, { L"0xe", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 14, 3 }, { 1, 14, 3 }, }, { L"0xf", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 15, 3 }, { 1, 15, 3 }, }, { L"0xX", { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, { 1, 0, 1 }, }, // terminator { L"" } }; #define SWSCANF_TEST(string, format, expret, expval, explen) \ do { \ int ret = 0, val = 0, len = 0; \ - ret = swscanf(string, format "%n", &val, &len); \ + ret = swscanf(string, format L"%n", &val, &len); \ ATF_CHECK_EQ(expret, ret); \ if (expret && ret) { \ ATF_CHECK_EQ(expval, val); \ ATF_CHECK_EQ(explen, len); \ } \ } while (0) ATF_TC_WITHOUT_HEAD(swscanf_b); ATF_TC_BODY(swscanf_b, tc) { const struct swscanf_test_case *stc; wchar_t input[16]; for (stc = swscanf_test_cases; *stc->input; stc++) { wcscpy(input + 1, stc->input); SWSCANF_TEST(input + 1, L"%b", stc->b.ret, stc->b.val, stc->b.len); input[0] = L'+'; SWSCANF_TEST(input, L"%b", stc->b.ret, stc->b.val, stc->b.len ? stc->b.len + 1 : 0); input[0] = L'-'; SWSCANF_TEST(input, L"%b", stc->b.ret, -stc->b.val, stc->b.len ? stc->b.len + 1 : 0); } } ATF_TC_WITHOUT_HEAD(swscanf_o); ATF_TC_BODY(swscanf_o, tc) { const struct swscanf_test_case *stc; wchar_t input[16]; for (stc = swscanf_test_cases; *stc->input; stc++) { wcscpy(input + 1, stc->input); SWSCANF_TEST(input + 1, L"%o", stc->o.ret, stc->o.val, stc->o.len); input[0] = L'+'; SWSCANF_TEST(input, L"%o", stc->o.ret, stc->o.val, stc->o.len ? stc->o.len + 1 : 0); input[0] = L'-'; SWSCANF_TEST(input, L"%o", stc->o.ret, -stc->o.val, stc->o.len ? stc->o.len + 1 : 0); } } ATF_TC_WITHOUT_HEAD(swscanf_d); ATF_TC_BODY(swscanf_d, tc) { const struct swscanf_test_case *stc; wchar_t input[16]; for (stc = swscanf_test_cases; *stc->input; stc++) { wcscpy(input + 1, stc->input); SWSCANF_TEST(input + 1, L"%d", stc->d.ret, stc->d.val, stc->d.len); input[0] = L'+'; SWSCANF_TEST(input, L"%d", stc->d.ret, stc->d.val, stc->d.len ? stc->d.len + 1 : 0); input[0] = L'-'; SWSCANF_TEST(input, L"%d", stc->d.ret, -stc->d.val, stc->d.len ? stc->d.len + 1 : 0); } } ATF_TC_WITHOUT_HEAD(swscanf_x); ATF_TC_BODY(swscanf_x, tc) { const struct swscanf_test_case *stc; wchar_t input[16]; for (stc = swscanf_test_cases; *stc->input; stc++) { wcscpy(input + 1, stc->input); SWSCANF_TEST(input + 1, L"%x", stc->x.ret, stc->x.val, stc->x.len); input[0] = L'+'; SWSCANF_TEST(input, L"%x", stc->x.ret, stc->x.val, stc->x.len ? stc->x.len + 1 : 0); input[0] = L'-'; SWSCANF_TEST(input, L"%x", stc->x.ret, -stc->x.val, stc->x.len ? stc->x.len + 1 : 0); } } ATF_TC_WITHOUT_HEAD(swscanf_i); ATF_TC_BODY(swscanf_i, tc) { const struct swscanf_test_case *stc; wchar_t input[16]; for (stc = swscanf_test_cases; *stc->input; stc++) { wcscpy(input + 1, stc->input); SWSCANF_TEST(input + 1, L"%i", stc->i.ret, stc->i.val, stc->i.len); input[0] = L'+'; SWSCANF_TEST(input, L"%i", stc->i.ret, stc->i.val, stc->i.len ? stc->i.len + 1 : 0); input[0] = L'-'; SWSCANF_TEST(input, L"%i", stc->i.ret, -stc->i.val, stc->i.len ? stc->i.len + 1 : 0); } } +ATF_TC_WITHOUT_HEAD(swscanf_wN); +ATF_TC_BODY(swscanf_wN, tc) +{ + const wchar_t x00[] = L"0x00"; + const wchar_t x7f[] = L"0x7fffffffffffffff"; + const wchar_t xff[] = L"0xffffffffffffffff"; + +#define SWSCANF_WN_TEST(N, imin, umax) \ + do { \ + int##N##_t i; \ + uint##N##_t u; \ + ATF_CHECK_EQ(1, swscanf(x00, L"%w" L(#N) L"i", &i)); \ + ATF_CHECK_EQ(0, i); \ + ATF_CHECK_EQ(1, swscanf(x7f, L"%w" L(#N) L"i", &i)); \ + ATF_CHECK_EQ(imin, i); \ + ATF_CHECK_EQ(1, swscanf(x00, L"%w" L(#N) L"x", &u)); \ + ATF_CHECK_EQ(0, u); \ + ATF_CHECK_EQ(1, swscanf(xff, L"%w" L(#N) L"x", &u)); \ + ATF_CHECK_EQ(umax, u); \ + } while (0) + SWSCANF_WN_TEST(8, -1, UCHAR_MAX); + SWSCANF_WN_TEST(16, -1, USHRT_MAX); + SWSCANF_WN_TEST(32, -1, UINT_MAX); + SWSCANF_WN_TEST(64, LLONG_MAX, ULLONG_MAX); +#undef SWSCANF_WN_TEST + + ATF_CHECK_EQ(0, swscanf(x00, L"%wi", (int *)NULL)); + ATF_CHECK_EQ(0, swscanf(x00, L"%w1i", (int *)NULL)); + ATF_CHECK_EQ(0, swscanf(x00, L"%w128i", (int *)NULL)); +} + +ATF_TC_WITHOUT_HEAD(swscanf_wfN); +ATF_TC_BODY(swscanf_wfN, tc) +{ + const wchar_t x00[] = L"0x00"; + const wchar_t x7f[] = L"0x7fffffffffffffff"; + const wchar_t xff[] = L"0xffffffffffffffff"; + +#define SWSCANF_WFN_TEST(N, imin, umax) \ + do { \ + int_fast##N##_t i; \ + uint_fast##N##_t u; \ + ATF_CHECK_EQ(1, swscanf(x00, L"%wf" L(#N) L"i", &i)); \ + ATF_CHECK_EQ(0, i); \ + ATF_CHECK_EQ(1, swscanf(x7f, L"%wf" L(#N) L"i", &i)); \ + ATF_CHECK_EQ(imin, i); \ + ATF_CHECK_EQ(1, swscanf(x00, L"%wf" L(#N) L"x", &u)); \ + ATF_CHECK_EQ(0, u); \ + ATF_CHECK_EQ(1, swscanf(xff, L"%wf" L(#N) L"x", &u)); \ + ATF_CHECK_EQ(umax, u); \ + } while (0) + SWSCANF_WFN_TEST(8, -1, UINT_MAX); + SWSCANF_WFN_TEST(16, -1, UINT_MAX); + SWSCANF_WFN_TEST(32, -1, UINT_MAX); + SWSCANF_WFN_TEST(64, LLONG_MAX, ULLONG_MAX); +#undef SWSCANF_WFN_TEST + + ATF_CHECK_EQ(0, swscanf(x00, L"%wfi", (int *)NULL)); + ATF_CHECK_EQ(0, swscanf(x00, L"%wf1i", (int *)NULL)); + ATF_CHECK_EQ(0, swscanf(x00, L"%wf128i", (int *)NULL)); +} + /* * Test termination cases: non-numeric character, fixed width, EOF */ ATF_TC_WITHOUT_HEAD(swscanf_termination); ATF_TC_BODY(swscanf_termination, tc) { int a = 0, b = 0, c = 0; - char d = 0; + wchar_t d = 0; - ATF_CHECK_EQ(4, swscanf(L"3.1415", L"%d%c%2d%d", &a, &d, &b, &c)); + ATF_CHECK_EQ(4, swscanf(L"3.1415", L"%d%lc%2d%d", &a, &d, &b, &c)); ATF_CHECK_EQ(3, a); ATF_CHECK_EQ(14, b); ATF_CHECK_EQ(15, c); ATF_CHECK_EQ(L'.', d); } ATF_TP_ADD_TCS(tp) { setlocale(LC_NUMERIC, "en_US.UTF-8"); ATF_TP_ADD_TC(tp, swscanf_b); ATF_TP_ADD_TC(tp, swscanf_o); ATF_TP_ADD_TC(tp, swscanf_d); ATF_TP_ADD_TC(tp, swscanf_x); ATF_TP_ADD_TC(tp, swscanf_i); + ATF_TP_ADD_TC(tp, swscanf_wN); + ATF_TP_ADD_TC(tp, swscanf_wfN); ATF_TP_ADD_TC(tp, swscanf_termination); return (atf_no_error()); }