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