xref: /freebsd/lib/libc/tests/stdio/swscanf_test.c (revision 12b1c1e3)
1b9385720SDag-Erling Smørgrav /*-
2b9385720SDag-Erling Smørgrav  * Copyright (c) 2023 Dag-Erling Smørgrav
3b9385720SDag-Erling Smørgrav  *
4b9385720SDag-Erling Smørgrav  * SPDX-License-Identifier: BSD-2-Clause
5b9385720SDag-Erling Smørgrav  */
6b9385720SDag-Erling Smørgrav 
712b1c1e3SDag-Erling Smørgrav #include <limits.h>
8b9385720SDag-Erling Smørgrav #include <locale.h>
9b9385720SDag-Erling Smørgrav #include <stdint.h>
10b9385720SDag-Erling Smørgrav #include <stdio.h>
11b9385720SDag-Erling Smørgrav #include <wchar.h>
12b9385720SDag-Erling Smørgrav 
13b9385720SDag-Erling Smørgrav #include <atf-c.h>
14b9385720SDag-Erling Smørgrav 
1512b1c1e3SDag-Erling Smørgrav #define L(s) L ## s
1612b1c1e3SDag-Erling Smørgrav 
17b9385720SDag-Erling Smørgrav static const struct swscanf_test_case {
18b9385720SDag-Erling Smørgrav 	wchar_t input[8];
19b9385720SDag-Erling Smørgrav 	struct {
20b9385720SDag-Erling Smørgrav 		int ret, val, len;
21b9385720SDag-Erling Smørgrav 	} b, o, d, x, i;
22b9385720SDag-Erling Smørgrav } swscanf_test_cases[] = {
23b9385720SDag-Erling Smørgrav //	input		binary		octal		decimal		hexadecimal	automatic
24b9385720SDag-Erling Smørgrav 	// all digits
25b9385720SDag-Erling Smørgrav 	{ L"0",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
26b9385720SDag-Erling Smørgrav 	{ L"1",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 }, },
27b9385720SDag-Erling Smørgrav 	{ L"2",		{ 0,   0, 0 },	{ 1,   2, 1 },	{ 1,   2, 1 },	{ 1,   2, 1 },	{ 1,   2, 1 }, },
28b9385720SDag-Erling Smørgrav 	{ L"3",		{ 0,   0, 0 },	{ 1,   3, 1 },	{ 1,   3, 1 },	{ 1,   3, 1 },	{ 1,   3, 1 }, },
29b9385720SDag-Erling Smørgrav 	{ L"4",		{ 0,   0, 0 },	{ 1,   4, 1 },	{ 1,   4, 1 },	{ 1,   4, 1 },	{ 1,   4, 1 }, },
30b9385720SDag-Erling Smørgrav 	{ L"5",		{ 0,   0, 0 },	{ 1,   5, 1 },	{ 1,   5, 1 },	{ 1,   5, 1 },	{ 1,   5, 1 }, },
31b9385720SDag-Erling Smørgrav 	{ L"6",		{ 0,   0, 0 },	{ 1,   6, 1 },	{ 1,   6, 1 },	{ 1,   6, 1 },	{ 1,   6, 1 }, },
32b9385720SDag-Erling Smørgrav 	{ L"7",		{ 0,   0, 0 },	{ 1,   7, 1 },	{ 1,   7, 1 },	{ 1,   7, 1 },	{ 1,   7, 1 }, },
33b9385720SDag-Erling Smørgrav 	{ L"8",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,   8, 1 },	{ 1,   8, 1 },	{ 1,   8, 1 }, },
34b9385720SDag-Erling Smørgrav 	{ L"9",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,   9, 1 },	{ 1,   9, 1 },	{ 1,   9, 1 }, },
35b9385720SDag-Erling Smørgrav 	{ L"A",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  10, 1 },	{ 0,   0, 0 }, },
36b9385720SDag-Erling Smørgrav 	{ L"B",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  11, 1 },	{ 0,   0, 0 }, },
37b9385720SDag-Erling Smørgrav 	{ L"C",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  12, 1 },	{ 0,   0, 0 }, },
38b9385720SDag-Erling Smørgrav 	{ L"D",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  13, 1 },	{ 0,   0, 0 }, },
39b9385720SDag-Erling Smørgrav 	{ L"E",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  14, 1 },	{ 0,   0, 0 }, },
40b9385720SDag-Erling Smørgrav 	{ L"F",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  15, 1 },	{ 0,   0, 0 }, },
41b9385720SDag-Erling Smørgrav 	{ L"X",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 }, },
42b9385720SDag-Erling Smørgrav 	{ L"a",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  10, 1 },	{ 0,   0, 0 }, },
43b9385720SDag-Erling Smørgrav 	{ L"b",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  11, 1 },	{ 0,   0, 0 }, },
44b9385720SDag-Erling Smørgrav 	{ L"c",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  12, 1 },	{ 0,   0, 0 }, },
45b9385720SDag-Erling Smørgrav 	{ L"d",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  13, 1 },	{ 0,   0, 0 }, },
46b9385720SDag-Erling Smørgrav 	{ L"e",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  14, 1 },	{ 0,   0, 0 }, },
47b9385720SDag-Erling Smørgrav 	{ L"f",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  15, 1 },	{ 0,   0, 0 }, },
48b9385720SDag-Erling Smørgrav 	{ L"x",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 }, },
49b9385720SDag-Erling Smørgrav 	// all digits with leading zero
50b9385720SDag-Erling Smørgrav 	{ L"00",	{ 1,   0, 2 },	{ 1,   0, 2 },	{ 1,   0, 2 },	{ 1,   0, 2 },	{ 1,   0, 2 }, },
51b9385720SDag-Erling Smørgrav 	{ L"01",	{ 1,   1, 2 },	{ 1,   1, 2 },	{ 1,   1, 2 },	{ 1,   1, 2 },	{ 1,   1, 2 }, },
52b9385720SDag-Erling Smørgrav 	{ L"02",	{ 1,   0, 1 },	{ 1,   2, 2 },	{ 1,   2, 2 },	{ 1,   2, 2 },	{ 1,   2, 2 }, },
53b9385720SDag-Erling Smørgrav 	{ L"03",	{ 1,   0, 1 },	{ 1,   3, 2 },	{ 1,   3, 2 },	{ 1,   3, 2 },	{ 1,   3, 2 }, },
54b9385720SDag-Erling Smørgrav 	{ L"04",	{ 1,   0, 1 },	{ 1,   4, 2 },	{ 1,   4, 2 },	{ 1,   4, 2 },	{ 1,   4, 2 }, },
55b9385720SDag-Erling Smørgrav 	{ L"05",	{ 1,   0, 1 },	{ 1,   5, 2 },	{ 1,   5, 2 },	{ 1,   5, 2 },	{ 1,   5, 2 }, },
56b9385720SDag-Erling Smørgrav 	{ L"06",	{ 1,   0, 1 },	{ 1,   6, 2 },	{ 1,   6, 2 },	{ 1,   6, 2 },	{ 1,   6, 2 }, },
57b9385720SDag-Erling Smørgrav 	{ L"07",	{ 1,   0, 1 },	{ 1,   7, 2 },	{ 1,   7, 2 },	{ 1,   7, 2 },	{ 1,   7, 2 }, },
58b9385720SDag-Erling Smørgrav 	{ L"08",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   8, 2 },	{ 1,   8, 2 },	{ 1,   0, 1 }, },
59b9385720SDag-Erling Smørgrav 	{ L"09",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   9, 2 },	{ 1,   9, 2 },	{ 1,   0, 1 }, },
60b9385720SDag-Erling Smørgrav 	{ L"0A",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  10, 2 },	{ 1,   0, 1 }, },
61b9385720SDag-Erling Smørgrav 	{ L"0B",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 2 },	{ 1,   0, 1 }, },
62b9385720SDag-Erling Smørgrav 	{ L"0C",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  12, 2 },	{ 1,   0, 1 }, },
63b9385720SDag-Erling Smørgrav 	{ L"0D",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  13, 2 },	{ 1,   0, 1 }, },
64b9385720SDag-Erling Smørgrav 	{ L"0E",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  14, 2 },	{ 1,   0, 1 }, },
65b9385720SDag-Erling Smørgrav 	{ L"0F",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  15, 2 },	{ 1,   0, 1 }, },
66b9385720SDag-Erling Smørgrav 	{ L"0X",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
67b9385720SDag-Erling Smørgrav 	{ L"0a",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  10, 2 },	{ 1,   0, 1 }, },
68b9385720SDag-Erling Smørgrav 	{ L"0b",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 2 },	{ 1,   0, 1 }, },
69b9385720SDag-Erling Smørgrav 	{ L"0c",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  12, 2 },	{ 1,   0, 1 }, },
70b9385720SDag-Erling Smørgrav 	{ L"0d",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  13, 2 },	{ 1,   0, 1 }, },
71b9385720SDag-Erling Smørgrav 	{ L"0e",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  14, 2 },	{ 1,   0, 1 }, },
72b9385720SDag-Erling Smørgrav 	{ L"0f",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  15, 2 },	{ 1,   0, 1 }, },
73b9385720SDag-Erling Smørgrav 	{ L"0x",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
74b9385720SDag-Erling Smørgrav 	// all digits with leading one
75b9385720SDag-Erling Smørgrav 	{ L"10",	{ 1,   2, 2 },	{ 1,   8, 2 },	{ 1,  10, 2 },	{ 1,  16, 2 },	{ 1,  10, 2 }, },
76b9385720SDag-Erling Smørgrav 	{ L"11",	{ 1,   3, 2 },	{ 1,   9, 2 },	{ 1,  11, 2 },	{ 1,  17, 2 },	{ 1,  11, 2 }, },
77b9385720SDag-Erling Smørgrav 	{ L"12",	{ 1,   1, 1 },	{ 1,  10, 2 },	{ 1,  12, 2 },	{ 1,  18, 2 },	{ 1,  12, 2 }, },
78b9385720SDag-Erling Smørgrav 	{ L"13",	{ 1,   1, 1 },	{ 1,  11, 2 },	{ 1,  13, 2 },	{ 1,  19, 2 },	{ 1,  13, 2 }, },
79b9385720SDag-Erling Smørgrav 	{ L"14",	{ 1,   1, 1 },	{ 1,  12, 2 },	{ 1,  14, 2 },	{ 1,  20, 2 },	{ 1,  14, 2 }, },
80b9385720SDag-Erling Smørgrav 	{ L"15",	{ 1,   1, 1 },	{ 1,  13, 2 },	{ 1,  15, 2 },	{ 1,  21, 2 },	{ 1,  15, 2 }, },
81b9385720SDag-Erling Smørgrav 	{ L"16",	{ 1,   1, 1 },	{ 1,  14, 2 },	{ 1,  16, 2 },	{ 1,  22, 2 },	{ 1,  16, 2 }, },
82b9385720SDag-Erling Smørgrav 	{ L"17",	{ 1,   1, 1 },	{ 1,  15, 2 },	{ 1,  17, 2 },	{ 1,  23, 2 },	{ 1,  17, 2 }, },
83b9385720SDag-Erling Smørgrav 	{ L"18",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  18, 2 },	{ 1,  24, 2 },	{ 1,  18, 2 }, },
84b9385720SDag-Erling Smørgrav 	{ L"19",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  19, 2 },	{ 1,  25, 2 },	{ 1,  19, 2 }, },
85b9385720SDag-Erling Smørgrav 	{ L"1A",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  26, 2 },	{ 1,   1, 1 }, },
86b9385720SDag-Erling Smørgrav 	{ L"1B",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  27, 2 },	{ 1,   1, 1 }, },
87b9385720SDag-Erling Smørgrav 	{ L"1C",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  28, 2 },	{ 1,   1, 1 }, },
88b9385720SDag-Erling Smørgrav 	{ L"1D",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  29, 2 },	{ 1,   1, 1 }, },
89b9385720SDag-Erling Smørgrav 	{ L"1E",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  30, 2 },	{ 1,   1, 1 }, },
90b9385720SDag-Erling Smørgrav 	{ L"1F",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  31, 2 },	{ 1,   1, 1 }, },
91b9385720SDag-Erling Smørgrav 	{ L"1X",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 }, },
92b9385720SDag-Erling Smørgrav 	{ L"1a",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  26, 2 },	{ 1,   1, 1 }, },
93b9385720SDag-Erling Smørgrav 	{ L"1b",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  27, 2 },	{ 1,   1, 1 }, },
94b9385720SDag-Erling Smørgrav 	{ L"1c",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  28, 2 },	{ 1,   1, 1 }, },
95b9385720SDag-Erling Smørgrav 	{ L"1d",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  29, 2 },	{ 1,   1, 1 }, },
96b9385720SDag-Erling Smørgrav 	{ L"1e",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  30, 2 },	{ 1,   1, 1 }, },
97b9385720SDag-Erling Smørgrav 	{ L"1f",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  31, 2 },	{ 1,   1, 1 }, },
98b9385720SDag-Erling Smørgrav 	{ L"1x",	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 }, },
99b9385720SDag-Erling Smørgrav 	// all digits with leading binary prefix
100b9385720SDag-Erling Smørgrav 	{ L"0b0",	{ 1,   0, 3 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 176, 3 },	{ 1,   0, 3 }, },
101b9385720SDag-Erling Smørgrav 	{ L"0b1",	{ 1,   1, 3 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 177, 3 },	{ 1,   1, 3 }, },
102b9385720SDag-Erling Smørgrav 	{ L"0b2",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 178, 3 },	{ 1,   0, 1 }, },
103b9385720SDag-Erling Smørgrav 	{ L"0b3",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 179, 3 },	{ 1,   0, 1 }, },
104b9385720SDag-Erling Smørgrav 	{ L"0b4",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 180, 3 },	{ 1,   0, 1 }, },
105b9385720SDag-Erling Smørgrav 	{ L"0b5",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 181, 3 },	{ 1,   0, 1 }, },
106b9385720SDag-Erling Smørgrav 	{ L"0b6",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 182, 3 },	{ 1,   0, 1 }, },
107b9385720SDag-Erling Smørgrav 	{ L"0b7",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 183, 3 },	{ 1,   0, 1 }, },
108b9385720SDag-Erling Smørgrav 	{ L"0b8",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 184, 3 },	{ 1,   0, 1 }, },
109b9385720SDag-Erling Smørgrav 	{ L"0b9",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 185, 3 },	{ 1,   0, 1 }, },
110b9385720SDag-Erling Smørgrav 	{ L"0bA",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 186, 3 },	{ 1,   0, 1 }, },
111b9385720SDag-Erling Smørgrav 	{ L"0bB",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 187, 3 },	{ 1,   0, 1 }, },
112b9385720SDag-Erling Smørgrav 	{ L"0bC",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 188, 3 },	{ 1,   0, 1 }, },
113b9385720SDag-Erling Smørgrav 	{ L"0bD",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 189, 3 },	{ 1,   0, 1 }, },
114b9385720SDag-Erling Smørgrav 	{ L"0bE",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 190, 3 },	{ 1,   0, 1 }, },
115b9385720SDag-Erling Smørgrav 	{ L"0bF",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 191, 3 },	{ 1,   0, 1 }, },
116b9385720SDag-Erling Smørgrav 	{ L"0bX",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 2 },	{ 1,   0, 1 }, },
117b9385720SDag-Erling Smørgrav 	{ L"0ba",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 186, 3 },	{ 1,   0, 1 }, },
118b9385720SDag-Erling Smørgrav 	{ L"0bb",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 187, 3 },	{ 1,   0, 1 }, },
119b9385720SDag-Erling Smørgrav 	{ L"0bc",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 188, 3 },	{ 1,   0, 1 }, },
120b9385720SDag-Erling Smørgrav 	{ L"0bd",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 189, 3 },	{ 1,   0, 1 }, },
121b9385720SDag-Erling Smørgrav 	{ L"0be",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 190, 3 },	{ 1,   0, 1 }, },
122b9385720SDag-Erling Smørgrav 	{ L"0bf",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 191, 3 },	{ 1,   0, 1 }, },
123b9385720SDag-Erling Smørgrav 	{ L"0bx",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 2 },	{ 1,   0, 1 }, },
124b9385720SDag-Erling Smørgrav 	// all digits with leading hexadecimal prefix
125b9385720SDag-Erling Smørgrav 	{ L"0x0",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 3 },	{ 1,   0, 3 }, },
126b9385720SDag-Erling Smørgrav 	{ L"0x1",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   1, 3 },	{ 1,   1, 3 }, },
127b9385720SDag-Erling Smørgrav 	{ L"0x2",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   2, 3 },	{ 1,   2, 3 }, },
128b9385720SDag-Erling Smørgrav 	{ L"0x3",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   3, 3 },	{ 1,   3, 3 }, },
129b9385720SDag-Erling Smørgrav 	{ L"0x4",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   4, 3 },	{ 1,   4, 3 }, },
130b9385720SDag-Erling Smørgrav 	{ L"0x5",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   5, 3 },	{ 1,   5, 3 }, },
131b9385720SDag-Erling Smørgrav 	{ L"0x6",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   6, 3 },	{ 1,   6, 3 }, },
132b9385720SDag-Erling Smørgrav 	{ L"0x7",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   7, 3 },	{ 1,   7, 3 }, },
133b9385720SDag-Erling Smørgrav 	{ L"0x8",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   8, 3 },	{ 1,   8, 3 }, },
134b9385720SDag-Erling Smørgrav 	{ L"0x9",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   9, 3 },	{ 1,   9, 3 }, },
135b9385720SDag-Erling Smørgrav 	{ L"0xA",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  10, 3 },	{ 1,  10, 3 }, },
136b9385720SDag-Erling Smørgrav 	{ L"0xB",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 3 },	{ 1,  11, 3 }, },
137b9385720SDag-Erling Smørgrav 	{ L"0xC",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  12, 3 },	{ 1,  12, 3 }, },
138b9385720SDag-Erling Smørgrav 	{ L"0xD",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  13, 3 },	{ 1,  13, 3 }, },
139b9385720SDag-Erling Smørgrav 	{ L"0xE",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  14, 3 },	{ 1,  14, 3 }, },
140b9385720SDag-Erling Smørgrav 	{ L"0xF",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  15, 3 },	{ 1,  15, 3 }, },
141b9385720SDag-Erling Smørgrav 	{ L"0xX",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
142b9385720SDag-Erling Smørgrav 	{ L"0xa",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  10, 3 },	{ 1,  10, 3 }, },
143b9385720SDag-Erling Smørgrav 	{ L"0xb",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 3 },	{ 1,  11, 3 }, },
144b9385720SDag-Erling Smørgrav 	{ L"0xc",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  12, 3 },	{ 1,  12, 3 }, },
145b9385720SDag-Erling Smørgrav 	{ L"0xd",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  13, 3 },	{ 1,  13, 3 }, },
146b9385720SDag-Erling Smørgrav 	{ L"0xe",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  14, 3 },	{ 1,  14, 3 }, },
147b9385720SDag-Erling Smørgrav 	{ L"0xf",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  15, 3 },	{ 1,  15, 3 }, },
148b9385720SDag-Erling Smørgrav 	{ L"0xX",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
149b9385720SDag-Erling Smørgrav 	// terminator
150b9385720SDag-Erling Smørgrav 	{ L"" }
151b9385720SDag-Erling Smørgrav };
152b9385720SDag-Erling Smørgrav 
153b9385720SDag-Erling Smørgrav #define SWSCANF_TEST(string, format, expret, expval, explen)		\
154b9385720SDag-Erling Smørgrav 	do {								\
155b9385720SDag-Erling Smørgrav 		int ret = 0, val = 0, len = 0;				\
15612b1c1e3SDag-Erling Smørgrav 		ret = swscanf(string, format L"%n", &val, &len);	\
157b9385720SDag-Erling Smørgrav 		ATF_CHECK_EQ(expret, ret);				\
158b9385720SDag-Erling Smørgrav 		if (expret && ret) {					\
159b9385720SDag-Erling Smørgrav 			ATF_CHECK_EQ(expval, val);			\
160b9385720SDag-Erling Smørgrav 			ATF_CHECK_EQ(explen, len);			\
161b9385720SDag-Erling Smørgrav 		}							\
162b9385720SDag-Erling Smørgrav 	} while (0)
163b9385720SDag-Erling Smørgrav 
164b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swscanf_b);
ATF_TC_BODY(swscanf_b,tc)165b9385720SDag-Erling Smørgrav ATF_TC_BODY(swscanf_b, tc)
166b9385720SDag-Erling Smørgrav {
167b9385720SDag-Erling Smørgrav 	const struct swscanf_test_case *stc;
168b9385720SDag-Erling Smørgrav 	wchar_t input[16];
169b9385720SDag-Erling Smørgrav 
170b9385720SDag-Erling Smørgrav 	for (stc = swscanf_test_cases; *stc->input; stc++) {
171b9385720SDag-Erling Smørgrav 		wcscpy(input + 1, stc->input);
172b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input + 1, L"%b", stc->b.ret, stc->b.val, stc->b.len);
173b9385720SDag-Erling Smørgrav 		input[0] = L'+';
174b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%b", stc->b.ret, stc->b.val, stc->b.len ? stc->b.len + 1 : 0);
175b9385720SDag-Erling Smørgrav 		input[0] = L'-';
176b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%b", stc->b.ret, -stc->b.val, stc->b.len ? stc->b.len + 1 : 0);
177b9385720SDag-Erling Smørgrav 	}
178b9385720SDag-Erling Smørgrav }
179b9385720SDag-Erling Smørgrav 
180b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swscanf_o);
ATF_TC_BODY(swscanf_o,tc)181b9385720SDag-Erling Smørgrav ATF_TC_BODY(swscanf_o, tc)
182b9385720SDag-Erling Smørgrav {
183b9385720SDag-Erling Smørgrav 	const struct swscanf_test_case *stc;
184b9385720SDag-Erling Smørgrav 	wchar_t input[16];
185b9385720SDag-Erling Smørgrav 
186b9385720SDag-Erling Smørgrav 	for (stc = swscanf_test_cases; *stc->input; stc++) {
187b9385720SDag-Erling Smørgrav 		wcscpy(input + 1, stc->input);
188b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input + 1, L"%o", stc->o.ret, stc->o.val, stc->o.len);
189b9385720SDag-Erling Smørgrav 		input[0] = L'+';
190b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%o", stc->o.ret, stc->o.val, stc->o.len ? stc->o.len + 1 : 0);
191b9385720SDag-Erling Smørgrav 		input[0] = L'-';
192b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%o", stc->o.ret, -stc->o.val, stc->o.len ? stc->o.len + 1 : 0);
193b9385720SDag-Erling Smørgrav 	}
194b9385720SDag-Erling Smørgrav }
195b9385720SDag-Erling Smørgrav 
196b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swscanf_d);
ATF_TC_BODY(swscanf_d,tc)197b9385720SDag-Erling Smørgrav ATF_TC_BODY(swscanf_d, tc)
198b9385720SDag-Erling Smørgrav {
199b9385720SDag-Erling Smørgrav 	const struct swscanf_test_case *stc;
200b9385720SDag-Erling Smørgrav 	wchar_t input[16];
201b9385720SDag-Erling Smørgrav 
202b9385720SDag-Erling Smørgrav 	for (stc = swscanf_test_cases; *stc->input; stc++) {
203b9385720SDag-Erling Smørgrav 		wcscpy(input + 1, stc->input);
204b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input + 1, L"%d", stc->d.ret, stc->d.val, stc->d.len);
205b9385720SDag-Erling Smørgrav 		input[0] = L'+';
206b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%d", stc->d.ret, stc->d.val, stc->d.len ? stc->d.len + 1 : 0);
207b9385720SDag-Erling Smørgrav 		input[0] = L'-';
208b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%d", stc->d.ret, -stc->d.val, stc->d.len ? stc->d.len + 1 : 0);
209b9385720SDag-Erling Smørgrav 	}
210b9385720SDag-Erling Smørgrav }
211b9385720SDag-Erling Smørgrav 
212b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swscanf_x);
ATF_TC_BODY(swscanf_x,tc)213b9385720SDag-Erling Smørgrav ATF_TC_BODY(swscanf_x, tc)
214b9385720SDag-Erling Smørgrav {
215b9385720SDag-Erling Smørgrav 	const struct swscanf_test_case *stc;
216b9385720SDag-Erling Smørgrav 	wchar_t input[16];
217b9385720SDag-Erling Smørgrav 
218b9385720SDag-Erling Smørgrav 	for (stc = swscanf_test_cases; *stc->input; stc++) {
219b9385720SDag-Erling Smørgrav 		wcscpy(input + 1, stc->input);
220b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input + 1, L"%x", stc->x.ret, stc->x.val, stc->x.len);
221b9385720SDag-Erling Smørgrav 		input[0] = L'+';
222b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%x", stc->x.ret, stc->x.val, stc->x.len ? stc->x.len + 1 : 0);
223b9385720SDag-Erling Smørgrav 		input[0] = L'-';
224b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%x", stc->x.ret, -stc->x.val, stc->x.len ? stc->x.len + 1 : 0);
225b9385720SDag-Erling Smørgrav 	}
226b9385720SDag-Erling Smørgrav }
227b9385720SDag-Erling Smørgrav 
228b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swscanf_i);
ATF_TC_BODY(swscanf_i,tc)229b9385720SDag-Erling Smørgrav ATF_TC_BODY(swscanf_i, tc)
230b9385720SDag-Erling Smørgrav {
231b9385720SDag-Erling Smørgrav 	const struct swscanf_test_case *stc;
232b9385720SDag-Erling Smørgrav 	wchar_t input[16];
233b9385720SDag-Erling Smørgrav 
234b9385720SDag-Erling Smørgrav 	for (stc = swscanf_test_cases; *stc->input; stc++) {
235b9385720SDag-Erling Smørgrav 		wcscpy(input + 1, stc->input);
236b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input + 1, L"%i", stc->i.ret, stc->i.val, stc->i.len);
237b9385720SDag-Erling Smørgrav 		input[0] = L'+';
238b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%i", stc->i.ret, stc->i.val, stc->i.len ? stc->i.len + 1 : 0);
239b9385720SDag-Erling Smørgrav 		input[0] = L'-';
240b9385720SDag-Erling Smørgrav 		SWSCANF_TEST(input, L"%i", stc->i.ret, -stc->i.val, stc->i.len ? stc->i.len + 1 : 0);
241b9385720SDag-Erling Smørgrav 	}
242b9385720SDag-Erling Smørgrav }
243b9385720SDag-Erling Smørgrav 
24412b1c1e3SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swscanf_wN);
ATF_TC_BODY(swscanf_wN,tc)24512b1c1e3SDag-Erling Smørgrav ATF_TC_BODY(swscanf_wN, tc)
24612b1c1e3SDag-Erling Smørgrav {
24712b1c1e3SDag-Erling Smørgrav 	const wchar_t x00[] = L"0x00";
24812b1c1e3SDag-Erling Smørgrav 	const wchar_t x7f[] = L"0x7fffffffffffffff";
24912b1c1e3SDag-Erling Smørgrav 	const wchar_t xff[] = L"0xffffffffffffffff";
25012b1c1e3SDag-Erling Smørgrav 
25112b1c1e3SDag-Erling Smørgrav #define SWSCANF_WN_TEST(N, imin, umax)					\
25212b1c1e3SDag-Erling Smørgrav 	do {								\
25312b1c1e3SDag-Erling Smørgrav 		int##N##_t i;						\
25412b1c1e3SDag-Erling Smørgrav 		uint##N##_t u;						\
25512b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, swscanf(x00, L"%w" L(#N) L"i", &i));	\
25612b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(0, i);					\
25712b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, swscanf(x7f, L"%w" L(#N) L"i", &i));	\
25812b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(imin, i);					\
25912b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, swscanf(x00, L"%w" L(#N) L"x", &u));	\
26012b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(0, u);					\
26112b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, swscanf(xff, L"%w" L(#N) L"x", &u));	\
26212b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(umax, u);					\
26312b1c1e3SDag-Erling Smørgrav 	} while (0)
26412b1c1e3SDag-Erling Smørgrav 	SWSCANF_WN_TEST(8, -1, UCHAR_MAX);
26512b1c1e3SDag-Erling Smørgrav 	SWSCANF_WN_TEST(16, -1, USHRT_MAX);
26612b1c1e3SDag-Erling Smørgrav 	SWSCANF_WN_TEST(32, -1, UINT_MAX);
26712b1c1e3SDag-Erling Smørgrav 	SWSCANF_WN_TEST(64, LLONG_MAX, ULLONG_MAX);
26812b1c1e3SDag-Erling Smørgrav #undef SWSCANF_WN_TEST
26912b1c1e3SDag-Erling Smørgrav 
27012b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, swscanf(x00, L"%wi", (int *)NULL));
27112b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, swscanf(x00, L"%w1i", (int *)NULL));
27212b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, swscanf(x00, L"%w128i", (int *)NULL));
27312b1c1e3SDag-Erling Smørgrav }
27412b1c1e3SDag-Erling Smørgrav 
27512b1c1e3SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swscanf_wfN);
ATF_TC_BODY(swscanf_wfN,tc)27612b1c1e3SDag-Erling Smørgrav ATF_TC_BODY(swscanf_wfN, tc)
27712b1c1e3SDag-Erling Smørgrav {
27812b1c1e3SDag-Erling Smørgrav 	const wchar_t x00[] = L"0x00";
27912b1c1e3SDag-Erling Smørgrav 	const wchar_t x7f[] = L"0x7fffffffffffffff";
28012b1c1e3SDag-Erling Smørgrav 	const wchar_t xff[] = L"0xffffffffffffffff";
28112b1c1e3SDag-Erling Smørgrav 
28212b1c1e3SDag-Erling Smørgrav #define SWSCANF_WFN_TEST(N, imin, umax)					\
28312b1c1e3SDag-Erling Smørgrav 	do {								\
28412b1c1e3SDag-Erling Smørgrav 		int_fast##N##_t i;					\
28512b1c1e3SDag-Erling Smørgrav 		uint_fast##N##_t u;					\
28612b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, swscanf(x00, L"%wf" L(#N) L"i", &i));	\
28712b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(0, i);					\
28812b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, swscanf(x7f, L"%wf" L(#N) L"i", &i));	\
28912b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(imin, i);					\
29012b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, swscanf(x00, L"%wf" L(#N) L"x", &u));	\
29112b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(0, u);					\
29212b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, swscanf(xff, L"%wf" L(#N) L"x", &u));	\
29312b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(umax, u);					\
29412b1c1e3SDag-Erling Smørgrav 	} while (0)
29512b1c1e3SDag-Erling Smørgrav 	SWSCANF_WFN_TEST(8, -1, UINT_MAX);
29612b1c1e3SDag-Erling Smørgrav 	SWSCANF_WFN_TEST(16, -1, UINT_MAX);
29712b1c1e3SDag-Erling Smørgrav 	SWSCANF_WFN_TEST(32, -1, UINT_MAX);
29812b1c1e3SDag-Erling Smørgrav 	SWSCANF_WFN_TEST(64, LLONG_MAX, ULLONG_MAX);
29912b1c1e3SDag-Erling Smørgrav #undef SWSCANF_WFN_TEST
30012b1c1e3SDag-Erling Smørgrav 
30112b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, swscanf(x00, L"%wfi", (int *)NULL));
30212b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, swscanf(x00, L"%wf1i", (int *)NULL));
30312b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, swscanf(x00, L"%wf128i", (int *)NULL));
30412b1c1e3SDag-Erling Smørgrav }
30512b1c1e3SDag-Erling Smørgrav 
306aca3bd16SDag-Erling Smørgrav /*
307aca3bd16SDag-Erling Smørgrav  * Test termination cases: non-numeric character, fixed width, EOF
308aca3bd16SDag-Erling Smørgrav  */
309aca3bd16SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swscanf_termination);
ATF_TC_BODY(swscanf_termination,tc)310aca3bd16SDag-Erling Smørgrav ATF_TC_BODY(swscanf_termination, tc)
311aca3bd16SDag-Erling Smørgrav {
312aca3bd16SDag-Erling Smørgrav 	int a = 0, b = 0, c = 0;
31312b1c1e3SDag-Erling Smørgrav 	wchar_t d = 0;
314aca3bd16SDag-Erling Smørgrav 
31512b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(4, swscanf(L"3.1415", L"%d%lc%2d%d", &a, &d, &b, &c));
316aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ(3, a);
317aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ(14, b);
318aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ(15, c);
319aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ(L'.', d);
320aca3bd16SDag-Erling Smørgrav }
321aca3bd16SDag-Erling Smørgrav 
ATF_TP_ADD_TCS(tp)322b9385720SDag-Erling Smørgrav ATF_TP_ADD_TCS(tp)
323b9385720SDag-Erling Smørgrav {
324b9385720SDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "en_US.UTF-8");
325b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swscanf_b);
326b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swscanf_o);
327b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swscanf_d);
328b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swscanf_x);
329b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swscanf_i);
33012b1c1e3SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swscanf_wN);
33112b1c1e3SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swscanf_wfN);
332aca3bd16SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swscanf_termination);
333b9385720SDag-Erling Smørgrav 	return (atf_no_error());
334b9385720SDag-Erling Smørgrav }
335