xref: /freebsd/lib/libc/tests/stdio/sscanf_test.c (revision 12b1c1e3fb446021a881d9815465137843fca50b)
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 
7*12b1c1e3SDag-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 
12b9385720SDag-Erling Smørgrav #include <atf-c.h>
13b9385720SDag-Erling Smørgrav 
14b9385720SDag-Erling Smørgrav static const struct sscanf_test_case {
15b9385720SDag-Erling Smørgrav 	char input[8];
16b9385720SDag-Erling Smørgrav 	struct {
17b9385720SDag-Erling Smørgrav 		int ret, val, len;
18b9385720SDag-Erling Smørgrav 	} b, o, d, x, i;
19b9385720SDag-Erling Smørgrav } sscanf_test_cases[] = {
20b9385720SDag-Erling Smørgrav //	input		binary		octal		decimal		hexadecimal	automatic
21b9385720SDag-Erling Smørgrav 	// all digits
22b9385720SDag-Erling Smørgrav 	{ "0",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
23b9385720SDag-Erling Smørgrav 	{ "1",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 }, },
24b9385720SDag-Erling Smørgrav 	{ "2",		{ 0,   0, 0 },	{ 1,   2, 1 },	{ 1,   2, 1 },	{ 1,   2, 1 },	{ 1,   2, 1 }, },
25b9385720SDag-Erling Smørgrav 	{ "3",		{ 0,   0, 0 },	{ 1,   3, 1 },	{ 1,   3, 1 },	{ 1,   3, 1 },	{ 1,   3, 1 }, },
26b9385720SDag-Erling Smørgrav 	{ "4",		{ 0,   0, 0 },	{ 1,   4, 1 },	{ 1,   4, 1 },	{ 1,   4, 1 },	{ 1,   4, 1 }, },
27b9385720SDag-Erling Smørgrav 	{ "5",		{ 0,   0, 0 },	{ 1,   5, 1 },	{ 1,   5, 1 },	{ 1,   5, 1 },	{ 1,   5, 1 }, },
28b9385720SDag-Erling Smørgrav 	{ "6",		{ 0,   0, 0 },	{ 1,   6, 1 },	{ 1,   6, 1 },	{ 1,   6, 1 },	{ 1,   6, 1 }, },
29b9385720SDag-Erling Smørgrav 	{ "7",		{ 0,   0, 0 },	{ 1,   7, 1 },	{ 1,   7, 1 },	{ 1,   7, 1 },	{ 1,   7, 1 }, },
30b9385720SDag-Erling Smørgrav 	{ "8",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,   8, 1 },	{ 1,   8, 1 },	{ 1,   8, 1 }, },
31b9385720SDag-Erling Smørgrav 	{ "9",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,   9, 1 },	{ 1,   9, 1 },	{ 1,   9, 1 }, },
32b9385720SDag-Erling Smørgrav 	{ "A",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  10, 1 },	{ 0,   0, 0 }, },
33b9385720SDag-Erling Smørgrav 	{ "B",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  11, 1 },	{ 0,   0, 0 }, },
34b9385720SDag-Erling Smørgrav 	{ "C",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  12, 1 },	{ 0,   0, 0 }, },
35b9385720SDag-Erling Smørgrav 	{ "D",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  13, 1 },	{ 0,   0, 0 }, },
36b9385720SDag-Erling Smørgrav 	{ "E",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  14, 1 },	{ 0,   0, 0 }, },
37b9385720SDag-Erling Smørgrav 	{ "F",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  15, 1 },	{ 0,   0, 0 }, },
38b9385720SDag-Erling Smørgrav 	{ "X",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 }, },
39b9385720SDag-Erling Smørgrav 	{ "a",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  10, 1 },	{ 0,   0, 0 }, },
40b9385720SDag-Erling Smørgrav 	{ "b",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  11, 1 },	{ 0,   0, 0 }, },
41b9385720SDag-Erling Smørgrav 	{ "c",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  12, 1 },	{ 0,   0, 0 }, },
42b9385720SDag-Erling Smørgrav 	{ "d",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  13, 1 },	{ 0,   0, 0 }, },
43b9385720SDag-Erling Smørgrav 	{ "e",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  14, 1 },	{ 0,   0, 0 }, },
44b9385720SDag-Erling Smørgrav 	{ "f",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 1,  15, 1 },	{ 0,   0, 0 }, },
45b9385720SDag-Erling Smørgrav 	{ "x",		{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 },	{ 0,   0, 0 }, },
46b9385720SDag-Erling Smørgrav 	// all digits with leading zero
47b9385720SDag-Erling Smørgrav 	{ "00",		{ 1,   0, 2 },	{ 1,   0, 2 },	{ 1,   0, 2 },	{ 1,   0, 2 },	{ 1,   0, 2 }, },
48b9385720SDag-Erling Smørgrav 	{ "01",		{ 1,   1, 2 },	{ 1,   1, 2 },	{ 1,   1, 2 },	{ 1,   1, 2 },	{ 1,   1, 2 }, },
49b9385720SDag-Erling Smørgrav 	{ "02",		{ 1,   0, 1 },	{ 1,   2, 2 },	{ 1,   2, 2 },	{ 1,   2, 2 },	{ 1,   2, 2 }, },
50b9385720SDag-Erling Smørgrav 	{ "03",		{ 1,   0, 1 },	{ 1,   3, 2 },	{ 1,   3, 2 },	{ 1,   3, 2 },	{ 1,   3, 2 }, },
51b9385720SDag-Erling Smørgrav 	{ "04",		{ 1,   0, 1 },	{ 1,   4, 2 },	{ 1,   4, 2 },	{ 1,   4, 2 },	{ 1,   4, 2 }, },
52b9385720SDag-Erling Smørgrav 	{ "05",		{ 1,   0, 1 },	{ 1,   5, 2 },	{ 1,   5, 2 },	{ 1,   5, 2 },	{ 1,   5, 2 }, },
53b9385720SDag-Erling Smørgrav 	{ "06",		{ 1,   0, 1 },	{ 1,   6, 2 },	{ 1,   6, 2 },	{ 1,   6, 2 },	{ 1,   6, 2 }, },
54b9385720SDag-Erling Smørgrav 	{ "07",		{ 1,   0, 1 },	{ 1,   7, 2 },	{ 1,   7, 2 },	{ 1,   7, 2 },	{ 1,   7, 2 }, },
55b9385720SDag-Erling Smørgrav 	{ "08",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   8, 2 },	{ 1,   8, 2 },	{ 1,   0, 1 }, },
56b9385720SDag-Erling Smørgrav 	{ "09",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   9, 2 },	{ 1,   9, 2 },	{ 1,   0, 1 }, },
57b9385720SDag-Erling Smørgrav 	{ "0A",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  10, 2 },	{ 1,   0, 1 }, },
58b9385720SDag-Erling Smørgrav 	{ "0B",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 2 },	{ 1,   0, 1 }, },
59b9385720SDag-Erling Smørgrav 	{ "0C",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  12, 2 },	{ 1,   0, 1 }, },
60b9385720SDag-Erling Smørgrav 	{ "0D",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  13, 2 },	{ 1,   0, 1 }, },
61b9385720SDag-Erling Smørgrav 	{ "0E",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  14, 2 },	{ 1,   0, 1 }, },
62b9385720SDag-Erling Smørgrav 	{ "0F",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  15, 2 },	{ 1,   0, 1 }, },
63b9385720SDag-Erling Smørgrav 	{ "0X",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
64b9385720SDag-Erling Smørgrav 	{ "0a",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  10, 2 },	{ 1,   0, 1 }, },
65b9385720SDag-Erling Smørgrav 	{ "0b",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 2 },	{ 1,   0, 1 }, },
66b9385720SDag-Erling Smørgrav 	{ "0c",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  12, 2 },	{ 1,   0, 1 }, },
67b9385720SDag-Erling Smørgrav 	{ "0d",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  13, 2 },	{ 1,   0, 1 }, },
68b9385720SDag-Erling Smørgrav 	{ "0e",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  14, 2 },	{ 1,   0, 1 }, },
69b9385720SDag-Erling Smørgrav 	{ "0f",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  15, 2 },	{ 1,   0, 1 }, },
70b9385720SDag-Erling Smørgrav 	{ "0x",		{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
71b9385720SDag-Erling Smørgrav 	// all digits with leading one
72b9385720SDag-Erling Smørgrav 	{ "10",		{ 1,   2, 2 },	{ 1,   8, 2 },	{ 1,  10, 2 },	{ 1,  16, 2 },	{ 1,  10, 2 }, },
73b9385720SDag-Erling Smørgrav 	{ "11",		{ 1,   3, 2 },	{ 1,   9, 2 },	{ 1,  11, 2 },	{ 1,  17, 2 },	{ 1,  11, 2 }, },
74b9385720SDag-Erling Smørgrav 	{ "12",		{ 1,   1, 1 },	{ 1,  10, 2 },	{ 1,  12, 2 },	{ 1,  18, 2 },	{ 1,  12, 2 }, },
75b9385720SDag-Erling Smørgrav 	{ "13",		{ 1,   1, 1 },	{ 1,  11, 2 },	{ 1,  13, 2 },	{ 1,  19, 2 },	{ 1,  13, 2 }, },
76b9385720SDag-Erling Smørgrav 	{ "14",		{ 1,   1, 1 },	{ 1,  12, 2 },	{ 1,  14, 2 },	{ 1,  20, 2 },	{ 1,  14, 2 }, },
77b9385720SDag-Erling Smørgrav 	{ "15",		{ 1,   1, 1 },	{ 1,  13, 2 },	{ 1,  15, 2 },	{ 1,  21, 2 },	{ 1,  15, 2 }, },
78b9385720SDag-Erling Smørgrav 	{ "16",		{ 1,   1, 1 },	{ 1,  14, 2 },	{ 1,  16, 2 },	{ 1,  22, 2 },	{ 1,  16, 2 }, },
79b9385720SDag-Erling Smørgrav 	{ "17",		{ 1,   1, 1 },	{ 1,  15, 2 },	{ 1,  17, 2 },	{ 1,  23, 2 },	{ 1,  17, 2 }, },
80b9385720SDag-Erling Smørgrav 	{ "18",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  18, 2 },	{ 1,  24, 2 },	{ 1,  18, 2 }, },
81b9385720SDag-Erling Smørgrav 	{ "19",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  19, 2 },	{ 1,  25, 2 },	{ 1,  19, 2 }, },
82b9385720SDag-Erling Smørgrav 	{ "1A",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  26, 2 },	{ 1,   1, 1 }, },
83b9385720SDag-Erling Smørgrav 	{ "1B",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  27, 2 },	{ 1,   1, 1 }, },
84b9385720SDag-Erling Smørgrav 	{ "1C",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  28, 2 },	{ 1,   1, 1 }, },
85b9385720SDag-Erling Smørgrav 	{ "1D",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  29, 2 },	{ 1,   1, 1 }, },
86b9385720SDag-Erling Smørgrav 	{ "1E",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  30, 2 },	{ 1,   1, 1 }, },
87b9385720SDag-Erling Smørgrav 	{ "1F",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  31, 2 },	{ 1,   1, 1 }, },
88b9385720SDag-Erling Smørgrav 	{ "1X",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 }, },
89b9385720SDag-Erling Smørgrav 	{ "1a",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  26, 2 },	{ 1,   1, 1 }, },
90b9385720SDag-Erling Smørgrav 	{ "1b",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  27, 2 },	{ 1,   1, 1 }, },
91b9385720SDag-Erling Smørgrav 	{ "1c",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  28, 2 },	{ 1,   1, 1 }, },
92b9385720SDag-Erling Smørgrav 	{ "1d",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  29, 2 },	{ 1,   1, 1 }, },
93b9385720SDag-Erling Smørgrav 	{ "1e",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  30, 2 },	{ 1,   1, 1 }, },
94b9385720SDag-Erling Smørgrav 	{ "1f",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,  31, 2 },	{ 1,   1, 1 }, },
95b9385720SDag-Erling Smørgrav 	{ "1x",		{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 },	{ 1,   1, 1 }, },
96b9385720SDag-Erling Smørgrav 	// all digits with leading binary prefix
97b9385720SDag-Erling Smørgrav 	{ "0b0",	{ 1,   0, 3 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 176, 3 },	{ 1,   0, 3 }, },
98b9385720SDag-Erling Smørgrav 	{ "0b1",	{ 1,   1, 3 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 177, 3 },	{ 1,   1, 3 }, },
99b9385720SDag-Erling Smørgrav 	{ "0b2",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 178, 3 },	{ 1,   0, 1 }, },
100b9385720SDag-Erling Smørgrav 	{ "0b3",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 179, 3 },	{ 1,   0, 1 }, },
101b9385720SDag-Erling Smørgrav 	{ "0b4",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 180, 3 },	{ 1,   0, 1 }, },
102b9385720SDag-Erling Smørgrav 	{ "0b5",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 181, 3 },	{ 1,   0, 1 }, },
103b9385720SDag-Erling Smørgrav 	{ "0b6",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 182, 3 },	{ 1,   0, 1 }, },
104b9385720SDag-Erling Smørgrav 	{ "0b7",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 183, 3 },	{ 1,   0, 1 }, },
105b9385720SDag-Erling Smørgrav 	{ "0b8",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 184, 3 },	{ 1,   0, 1 }, },
106b9385720SDag-Erling Smørgrav 	{ "0b9",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 185, 3 },	{ 1,   0, 1 }, },
107b9385720SDag-Erling Smørgrav 	{ "0bA",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 186, 3 },	{ 1,   0, 1 }, },
108b9385720SDag-Erling Smørgrav 	{ "0bB",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 187, 3 },	{ 1,   0, 1 }, },
109b9385720SDag-Erling Smørgrav 	{ "0bC",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 188, 3 },	{ 1,   0, 1 }, },
110b9385720SDag-Erling Smørgrav 	{ "0bD",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 189, 3 },	{ 1,   0, 1 }, },
111b9385720SDag-Erling Smørgrav 	{ "0bE",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 190, 3 },	{ 1,   0, 1 }, },
112b9385720SDag-Erling Smørgrav 	{ "0bF",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 191, 3 },	{ 1,   0, 1 }, },
113b9385720SDag-Erling Smørgrav 	{ "0bX",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 2 },	{ 1,   0, 1 }, },
114b9385720SDag-Erling Smørgrav 	{ "0ba",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 186, 3 },	{ 1,   0, 1 }, },
115b9385720SDag-Erling Smørgrav 	{ "0bb",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 187, 3 },	{ 1,   0, 1 }, },
116b9385720SDag-Erling Smørgrav 	{ "0bc",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 188, 3 },	{ 1,   0, 1 }, },
117b9385720SDag-Erling Smørgrav 	{ "0bd",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 189, 3 },	{ 1,   0, 1 }, },
118b9385720SDag-Erling Smørgrav 	{ "0be",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 190, 3 },	{ 1,   0, 1 }, },
119b9385720SDag-Erling Smørgrav 	{ "0bf",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1, 191, 3 },	{ 1,   0, 1 }, },
120b9385720SDag-Erling Smørgrav 	{ "0bx",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 2 },	{ 1,   0, 1 }, },
121b9385720SDag-Erling Smørgrav 	// all digits with leading hexadecimal prefix
122b9385720SDag-Erling Smørgrav 	{ "0x0",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 3 },	{ 1,   0, 3 }, },
123b9385720SDag-Erling Smørgrav 	{ "0x1",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   1, 3 },	{ 1,   1, 3 }, },
124b9385720SDag-Erling Smørgrav 	{ "0x2",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   2, 3 },	{ 1,   2, 3 }, },
125b9385720SDag-Erling Smørgrav 	{ "0x3",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   3, 3 },	{ 1,   3, 3 }, },
126b9385720SDag-Erling Smørgrav 	{ "0x4",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   4, 3 },	{ 1,   4, 3 }, },
127b9385720SDag-Erling Smørgrav 	{ "0x5",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   5, 3 },	{ 1,   5, 3 }, },
128b9385720SDag-Erling Smørgrav 	{ "0x6",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   6, 3 },	{ 1,   6, 3 }, },
129b9385720SDag-Erling Smørgrav 	{ "0x7",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   7, 3 },	{ 1,   7, 3 }, },
130b9385720SDag-Erling Smørgrav 	{ "0x8",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   8, 3 },	{ 1,   8, 3 }, },
131b9385720SDag-Erling Smørgrav 	{ "0x9",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   9, 3 },	{ 1,   9, 3 }, },
132b9385720SDag-Erling Smørgrav 	{ "0xA",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  10, 3 },	{ 1,  10, 3 }, },
133b9385720SDag-Erling Smørgrav 	{ "0xB",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 3 },	{ 1,  11, 3 }, },
134b9385720SDag-Erling Smørgrav 	{ "0xC",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  12, 3 },	{ 1,  12, 3 }, },
135b9385720SDag-Erling Smørgrav 	{ "0xD",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  13, 3 },	{ 1,  13, 3 }, },
136b9385720SDag-Erling Smørgrav 	{ "0xE",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  14, 3 },	{ 1,  14, 3 }, },
137b9385720SDag-Erling Smørgrav 	{ "0xF",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  15, 3 },	{ 1,  15, 3 }, },
138b9385720SDag-Erling Smørgrav 	{ "0xX",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
139b9385720SDag-Erling Smørgrav 	{ "0xa",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  10, 3 },	{ 1,  10, 3 }, },
140b9385720SDag-Erling Smørgrav 	{ "0xb",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  11, 3 },	{ 1,  11, 3 }, },
141b9385720SDag-Erling Smørgrav 	{ "0xc",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  12, 3 },	{ 1,  12, 3 }, },
142b9385720SDag-Erling Smørgrav 	{ "0xd",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  13, 3 },	{ 1,  13, 3 }, },
143b9385720SDag-Erling Smørgrav 	{ "0xe",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  14, 3 },	{ 1,  14, 3 }, },
144b9385720SDag-Erling Smørgrav 	{ "0xf",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,  15, 3 },	{ 1,  15, 3 }, },
145b9385720SDag-Erling Smørgrav 	{ "0xX",	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 },	{ 1,   0, 1 }, },
146b9385720SDag-Erling Smørgrav 	// terminator
147b9385720SDag-Erling Smørgrav 	{ "" }
148b9385720SDag-Erling Smørgrav };
149b9385720SDag-Erling Smørgrav 
150b9385720SDag-Erling Smørgrav #define SSCANF_TEST(string, format, expret, expval, explen)		\
151b9385720SDag-Erling Smørgrav 	do {								\
152b9385720SDag-Erling Smørgrav 		int ret = 0, val = 0, len = 0;				\
153b9385720SDag-Erling Smørgrav 		ret = sscanf(string, format "%n", &val, &len);		\
154b9385720SDag-Erling Smørgrav 		ATF_CHECK_EQ(expret, ret);				\
155b9385720SDag-Erling Smørgrav 		if (expret && ret) {					\
156b9385720SDag-Erling Smørgrav 			ATF_CHECK_EQ(expval, val);			\
157b9385720SDag-Erling Smørgrav 			ATF_CHECK_EQ(explen, len);			\
158b9385720SDag-Erling Smørgrav 		}							\
159b9385720SDag-Erling Smørgrav 	} while (0)
160b9385720SDag-Erling Smørgrav 
161b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(sscanf_b);
ATF_TC_BODY(sscanf_b,tc)162b9385720SDag-Erling Smørgrav ATF_TC_BODY(sscanf_b, tc)
163b9385720SDag-Erling Smørgrav {
164b9385720SDag-Erling Smørgrav 	const struct sscanf_test_case *stc;
165b9385720SDag-Erling Smørgrav 	char input[16];
166b9385720SDag-Erling Smørgrav 
167b9385720SDag-Erling Smørgrav 	for (stc = sscanf_test_cases; *stc->input; stc++) {
168b9385720SDag-Erling Smørgrav 		strcpy(input + 1, stc->input);
169b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input + 1, "%b", stc->b.ret, stc->b.val, stc->b.len);
170b9385720SDag-Erling Smørgrav 		input[0] = '+';
171b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%b", stc->b.ret, stc->b.val, stc->b.len ? stc->b.len + 1 : 0);
172b9385720SDag-Erling Smørgrav 		input[0] = '-';
173b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%b", stc->b.ret, -stc->b.val, stc->b.len ? stc->b.len + 1 : 0);
174b9385720SDag-Erling Smørgrav 	}
175b9385720SDag-Erling Smørgrav }
176b9385720SDag-Erling Smørgrav 
177b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(sscanf_o);
ATF_TC_BODY(sscanf_o,tc)178b9385720SDag-Erling Smørgrav ATF_TC_BODY(sscanf_o, tc)
179b9385720SDag-Erling Smørgrav {
180b9385720SDag-Erling Smørgrav 	const struct sscanf_test_case *stc;
181b9385720SDag-Erling Smørgrav 	char input[16];
182b9385720SDag-Erling Smørgrav 
183b9385720SDag-Erling Smørgrav 	for (stc = sscanf_test_cases; *stc->input; stc++) {
184b9385720SDag-Erling Smørgrav 		strcpy(input + 1, stc->input);
185b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input + 1, "%o", stc->o.ret, stc->o.val, stc->o.len);
186b9385720SDag-Erling Smørgrav 		input[0] = '+';
187b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%o", stc->o.ret, stc->o.val, stc->o.len ? stc->o.len + 1 : 0);
188b9385720SDag-Erling Smørgrav 		input[0] = '-';
189b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%o", stc->o.ret, -stc->o.val, stc->o.len ? stc->o.len + 1 : 0);
190b9385720SDag-Erling Smørgrav 	}
191b9385720SDag-Erling Smørgrav }
192b9385720SDag-Erling Smørgrav 
193b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(sscanf_d);
ATF_TC_BODY(sscanf_d,tc)194b9385720SDag-Erling Smørgrav ATF_TC_BODY(sscanf_d, tc)
195b9385720SDag-Erling Smørgrav {
196b9385720SDag-Erling Smørgrav 	const struct sscanf_test_case *stc;
197b9385720SDag-Erling Smørgrav 	char input[16];
198b9385720SDag-Erling Smørgrav 
199b9385720SDag-Erling Smørgrav 	for (stc = sscanf_test_cases; *stc->input; stc++) {
200b9385720SDag-Erling Smørgrav 		strcpy(input + 1, stc->input);
201b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input + 1, "%d", stc->d.ret, stc->d.val, stc->d.len);
202b9385720SDag-Erling Smørgrav 		input[0] = '+';
203b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%d", stc->d.ret, stc->d.val, stc->d.len ? stc->d.len + 1 : 0);
204b9385720SDag-Erling Smørgrav 		input[0] = '-';
205b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%d", stc->d.ret, -stc->d.val, stc->d.len ? stc->d.len + 1 : 0);
206b9385720SDag-Erling Smørgrav 	}
207b9385720SDag-Erling Smørgrav }
208b9385720SDag-Erling Smørgrav 
209b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(sscanf_x);
ATF_TC_BODY(sscanf_x,tc)210b9385720SDag-Erling Smørgrav ATF_TC_BODY(sscanf_x, tc)
211b9385720SDag-Erling Smørgrav {
212b9385720SDag-Erling Smørgrav 	const struct sscanf_test_case *stc;
213b9385720SDag-Erling Smørgrav 	char input[16];
214b9385720SDag-Erling Smørgrav 
215b9385720SDag-Erling Smørgrav 	for (stc = sscanf_test_cases; *stc->input; stc++) {
216b9385720SDag-Erling Smørgrav 		strcpy(input + 1, stc->input);
217b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input + 1, "%x", stc->x.ret, stc->x.val, stc->x.len);
218b9385720SDag-Erling Smørgrav 		input[0] = '+';
219b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%x", stc->x.ret, stc->x.val, stc->x.len ? stc->x.len + 1 : 0);
220b9385720SDag-Erling Smørgrav 		input[0] = '-';
221b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%x", stc->x.ret, -stc->x.val, stc->x.len ? stc->x.len + 1 : 0);
222b9385720SDag-Erling Smørgrav 	}
223b9385720SDag-Erling Smørgrav }
224b9385720SDag-Erling Smørgrav 
225b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(sscanf_i);
ATF_TC_BODY(sscanf_i,tc)226b9385720SDag-Erling Smørgrav ATF_TC_BODY(sscanf_i, tc)
227b9385720SDag-Erling Smørgrav {
228b9385720SDag-Erling Smørgrav 	const struct sscanf_test_case *stc;
229b9385720SDag-Erling Smørgrav 	char input[16];
230b9385720SDag-Erling Smørgrav 
231b9385720SDag-Erling Smørgrav 	for (stc = sscanf_test_cases; *stc->input; stc++) {
232b9385720SDag-Erling Smørgrav 		strcpy(input + 1, stc->input);
233b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input + 1, "%i", stc->i.ret, stc->i.val, stc->i.len);
234b9385720SDag-Erling Smørgrav 		input[0] = '+';
235b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%i", stc->i.ret, stc->i.val, stc->i.len ? stc->i.len + 1 : 0);
236b9385720SDag-Erling Smørgrav 		input[0] = '-';
237b9385720SDag-Erling Smørgrav 		SSCANF_TEST(input, "%i", stc->i.ret, -stc->i.val, stc->i.len ? stc->i.len + 1 : 0);
238b9385720SDag-Erling Smørgrav 	}
239b9385720SDag-Erling Smørgrav }
240b9385720SDag-Erling Smørgrav 
241*12b1c1e3SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(sscanf_wN);
ATF_TC_BODY(sscanf_wN,tc)242*12b1c1e3SDag-Erling Smørgrav ATF_TC_BODY(sscanf_wN, tc)
243*12b1c1e3SDag-Erling Smørgrav {
244*12b1c1e3SDag-Erling Smørgrav 	const char x00[] = "0x00";
245*12b1c1e3SDag-Erling Smørgrav 	const char x7f[] = "0x7fffffffffffffff";
246*12b1c1e3SDag-Erling Smørgrav 	const char xff[] = "0xffffffffffffffff";
247*12b1c1e3SDag-Erling Smørgrav 
248*12b1c1e3SDag-Erling Smørgrav #define SSCANF_WN_TEST(N, imin, umax)					\
249*12b1c1e3SDag-Erling Smørgrav 	do {								\
250*12b1c1e3SDag-Erling Smørgrav 		int##N##_t i;						\
251*12b1c1e3SDag-Erling Smørgrav 		uint##N##_t u;						\
252*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, sscanf(x00, "%w" #N "i", &i));		\
253*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(0, i);					\
254*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, sscanf(x7f, "%w" #N "i", &i));		\
255*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(imin, i);					\
256*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, sscanf(x00, "%w" #N "x", &u));		\
257*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(0, u);					\
258*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, sscanf(xff, "%w" #N "x", &u));		\
259*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(umax, u);					\
260*12b1c1e3SDag-Erling Smørgrav 	} while (0)
261*12b1c1e3SDag-Erling Smørgrav 	SSCANF_WN_TEST(8, -1, UCHAR_MAX);
262*12b1c1e3SDag-Erling Smørgrav 	SSCANF_WN_TEST(16, -1, USHRT_MAX);
263*12b1c1e3SDag-Erling Smørgrav 	SSCANF_WN_TEST(32, -1, UINT_MAX);
264*12b1c1e3SDag-Erling Smørgrav 	SSCANF_WN_TEST(64, LLONG_MAX, ULLONG_MAX);
265*12b1c1e3SDag-Erling Smørgrav #undef SSCANF_WN_TEST
266*12b1c1e3SDag-Erling Smørgrav 
267*12b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, sscanf(x00, "%wi", (int *)NULL));
268*12b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, sscanf(x00, "%w1i", (int *)NULL));
269*12b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, sscanf(x00, "%w128i", (int *)NULL));
270*12b1c1e3SDag-Erling Smørgrav }
271*12b1c1e3SDag-Erling Smørgrav 
272*12b1c1e3SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(sscanf_wfN);
ATF_TC_BODY(sscanf_wfN,tc)273*12b1c1e3SDag-Erling Smørgrav ATF_TC_BODY(sscanf_wfN, tc)
274*12b1c1e3SDag-Erling Smørgrav {
275*12b1c1e3SDag-Erling Smørgrav 	const char x00[] = "0x00";
276*12b1c1e3SDag-Erling Smørgrav 	const char x7f[] = "0x7fffffffffffffff";
277*12b1c1e3SDag-Erling Smørgrav 	const char xff[] = "0xffffffffffffffff";
278*12b1c1e3SDag-Erling Smørgrav 
279*12b1c1e3SDag-Erling Smørgrav #define SSCANF_WFN_TEST(N, imin, umax)					\
280*12b1c1e3SDag-Erling Smørgrav 	do {								\
281*12b1c1e3SDag-Erling Smørgrav 		int_fast##N##_t i;					\
282*12b1c1e3SDag-Erling Smørgrav 		uint_fast##N##_t u;					\
283*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, sscanf(x00, "%wf" #N "i", &i));		\
284*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(0, i);					\
285*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, sscanf(x7f, "%wf" #N "i", &i));		\
286*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(imin, i);					\
287*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, sscanf(x00, "%wf" #N "x", &u));		\
288*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(0, u);					\
289*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(1, sscanf(xff, "%wf" #N "x", &u));		\
290*12b1c1e3SDag-Erling Smørgrav 		ATF_CHECK_EQ(umax, u);					\
291*12b1c1e3SDag-Erling Smørgrav 	} while (0)
292*12b1c1e3SDag-Erling Smørgrav 	SSCANF_WFN_TEST(8, -1, UINT_MAX);
293*12b1c1e3SDag-Erling Smørgrav 	SSCANF_WFN_TEST(16, -1, UINT_MAX);
294*12b1c1e3SDag-Erling Smørgrav 	SSCANF_WFN_TEST(32, -1, UINT_MAX);
295*12b1c1e3SDag-Erling Smørgrav 	SSCANF_WFN_TEST(64, LLONG_MAX, ULLONG_MAX);
296*12b1c1e3SDag-Erling Smørgrav #undef SSCANF_WFN_TEST
297*12b1c1e3SDag-Erling Smørgrav 
298*12b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, sscanf(x00, "%wfi", (int *)NULL));
299*12b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, sscanf(x00, "%wf1i", (int *)NULL));
300*12b1c1e3SDag-Erling Smørgrav 	ATF_CHECK_EQ(0, sscanf(x00, "%wf128i", (int *)NULL));
301*12b1c1e3SDag-Erling Smørgrav }
302*12b1c1e3SDag-Erling Smørgrav 
303aca3bd16SDag-Erling Smørgrav /*
304aca3bd16SDag-Erling Smørgrav  * Test termination cases: non-numeric character, fixed width, EOF
305aca3bd16SDag-Erling Smørgrav  */
306aca3bd16SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(sscanf_termination);
ATF_TC_BODY(sscanf_termination,tc)307aca3bd16SDag-Erling Smørgrav ATF_TC_BODY(sscanf_termination, tc)
308aca3bd16SDag-Erling Smørgrav {
309aca3bd16SDag-Erling Smørgrav 	int a = 0, b = 0, c = 0;
310aca3bd16SDag-Erling Smørgrav 	char d = 0;
311aca3bd16SDag-Erling Smørgrav 
312aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ(4, sscanf("3.1415", "%d%c%2d%d", &a, &d, &b, &c));
313aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ(3, a);
314aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ(14, b);
315aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ(15, c);
316aca3bd16SDag-Erling Smørgrav 	ATF_CHECK_EQ('.', d);
317aca3bd16SDag-Erling Smørgrav }
318aca3bd16SDag-Erling Smørgrav 
ATF_TP_ADD_TCS(tp)319b9385720SDag-Erling Smørgrav ATF_TP_ADD_TCS(tp)
320b9385720SDag-Erling Smørgrav {
321b9385720SDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "en_US.UTF-8");
322b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, sscanf_b);
323b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, sscanf_o);
324b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, sscanf_d);
325b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, sscanf_x);
326b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, sscanf_i);
327*12b1c1e3SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, sscanf_wN);
328*12b1c1e3SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, sscanf_wfN);
329aca3bd16SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, sscanf_termination);
330b9385720SDag-Erling Smørgrav 	return (atf_no_error());
331b9385720SDag-Erling Smørgrav }
332