]>
Commit | Line | Data |
---|---|---|
6c46718f UD |
1 | #include <float.h> |
2 | #include <math.h> | |
196980f5 | 3 | #include <stdio.h> |
6c46718f UD |
4 | #include <string.h> |
5 | #include <wchar.h> | |
1c4053db | 6 | #include <libc-internal.h> |
196980f5 | 7 | |
1a511d31 | 8 | static int |
11336c16 | 9 | t1 (void) |
196980f5 RM |
10 | { |
11 | int n = -1; | |
12 | sscanf ("abc ", "abc %n", &n); | |
13 | printf ("t1: count=%d\n", n); | |
05be689b RM |
14 | |
15 | return n != 5; | |
196980f5 RM |
16 | } |
17 | ||
1a511d31 | 18 | static int |
11336c16 | 19 | t2 (void) |
196980f5 | 20 | { |
05be689b | 21 | int result = 0; |
196980f5 RM |
22 | int n; |
23 | long N; | |
24 | int retval; | |
05be689b | 25 | #define SCAN(INPUT, FORMAT, VAR, EXP_RES, EXP_VAL) \ |
196980f5 | 26 | VAR = -1; \ |
77d10f94 | 27 | retval = sscanf (INPUT, FORMAT, &VAR); \ |
196980f5 | 28 | printf ("sscanf (\"%s\", \"%s\", &x) => %d, x = %ld\n", \ |
27658f20 | 29 | INPUT, FORMAT, retval, (long int) VAR); \ |
05be689b RM |
30 | result |= retval != EXP_RES || VAR != EXP_VAL |
31 | ||
1c4053db RM |
32 | /* This function is testing corner cases of the scanf format string, |
33 | so they do not all conform to -Wformat's expectations. */ | |
34 | DIAG_PUSH_NEEDS_COMMENT; | |
35 | DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat"); | |
36 | DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wformat-extra-args"); | |
37 | ||
05be689b | 38 | SCAN ("12345", "%ld", N, 1, 12345); |
27658f20 UD |
39 | SCAN ("12345", "%llllld", N, 0, -1); |
40 | SCAN ("12345", "%LLLLLd", N, 0, -1); | |
8d57beea | 41 | SCAN ("test ", "%*s%n", n, 0, 4); |
27658f20 UD |
42 | SCAN ("test ", "%2*s%n", n, 0, -1); |
43 | SCAN ("12 ", "%l2d", n, 0, -1); | |
05be689b RM |
44 | SCAN ("12 ", "%2ld", N, 1, 12); |
45 | ||
27658f20 UD |
46 | n = -1; |
47 | N = -1; | |
48 | retval = sscanf ("1 1", "%d %Z", &n, &N); | |
49 | printf ("sscanf (\"1 1\", \"%%d %%Z\", &n, &N) => %d, n = %d, N = %ld\n", \ | |
50 | retval, n, N); \ | |
51 | result |= retval != 1 || n != 1 || N != -1; | |
52 | ||
1c4053db RM |
53 | DIAG_POP_NEEDS_COMMENT; |
54 | ||
05be689b | 55 | return result; |
196980f5 RM |
56 | } |
57 | ||
4fdfe821 AS |
58 | static int |
59 | t3 (void) | |
60 | { | |
61 | char buf[80]; | |
62 | wchar_t wbuf[80]; | |
63 | int result = 0; | |
64 | int retval; | |
65 | ||
66 | retval = sprintf (buf, "%p", (char *) NULL); | |
67 | result |= retval != 5 || strcmp (buf, "(nil)") != 0; | |
68 | ||
69 | retval = swprintf (wbuf, sizeof (wbuf) / sizeof (wbuf[0]), | |
70 | L"%p", (char *) NULL); | |
71 | result |= retval != 5 || wcscmp (wbuf, L"(nil)") != 0; | |
72 | ||
73 | return result; | |
74 | } | |
75 | ||
67e971f1 | 76 | volatile double qnanval; |
67e971f1 | 77 | volatile long double lqnanval; |
ee091edf TS |
78 | /* A sNaN is only guaranteed to be representable in variables with static (or |
79 | thread-local) storage duration. */ | |
207d1e2a TS |
80 | static volatile double snanval = __builtin_nans (""); |
81 | static volatile double msnanval = -__builtin_nans (""); | |
82 | static volatile long double lsnanval = __builtin_nansl (""); | |
83 | static volatile long double lmsnanval = -__builtin_nansl (""); | |
ee091edf | 84 | volatile double infval; |
003c9895 | 85 | volatile long double linfval; |
38cbcf0a | 86 | |
11f685f5 | 87 | |
1a511d31 | 88 | static int |
6c46718f UD |
89 | F (void) |
90 | { | |
003c9895 UD |
91 | char buf[80]; |
92 | wchar_t wbuf[40]; | |
a8b792d6 | 93 | int result = 0; |
6c46718f | 94 | |
67e971f1 | 95 | qnanval = NAN; |
38cbcf0a | 96 | |
003c9895 | 97 | snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G", |
67e971f1 TS |
98 | qnanval, qnanval, qnanval, qnanval, |
99 | qnanval, qnanval, qnanval, qnanval); | |
a8b792d6 | 100 | result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0; |
003c9895 UD |
101 | printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf); |
102 | ||
103 | snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G", | |
67e971f1 TS |
104 | -qnanval, -qnanval, -qnanval, -qnanval, |
105 | -qnanval, -qnanval, -qnanval, -qnanval); | |
a8b792d6 | 106 | result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0; |
003c9895 UD |
107 | printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n", |
108 | buf); | |
109 | ||
ee091edf TS |
110 | snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G", |
111 | snanval, snanval, snanval, snanval, | |
112 | snanval, snanval, snanval, snanval); | |
113 | result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0; | |
114 | printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf); | |
115 | ||
116 | snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G", | |
117 | msnanval, msnanval, msnanval, msnanval, | |
118 | msnanval, msnanval, msnanval, msnanval); | |
119 | result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0; | |
120 | printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n", | |
121 | buf); | |
122 | ||
003c9895 UD |
123 | infval = DBL_MAX * DBL_MAX; |
124 | ||
125 | snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G", | |
126 | infval, infval, infval, infval, infval, infval, infval, infval); | |
127 | result |= strcmp (buf, "inf INF inf INF inf INF inf INF") != 0; | |
128 | printf ("expected \"inf INF inf INF inf INF inf INF\", got \"%s\"\n", buf); | |
129 | ||
130 | snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G", | |
131 | -infval, -infval, -infval, -infval, | |
132 | -infval, -infval, -infval, -infval); | |
133 | result |= strcmp (buf, "-inf -INF -inf -INF -inf -INF -inf -INF") != 0; | |
134 | printf ("expected \"-inf -INF -inf -INF -inf -INF -inf -INF\", got \"%s\"\n", | |
135 | buf); | |
136 | ||
137 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G", | |
67e971f1 TS |
138 | qnanval, qnanval, qnanval, qnanval, |
139 | qnanval, qnanval, qnanval, qnanval); | |
003c9895 UD |
140 | result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0; |
141 | printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf); | |
142 | ||
143 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G", | |
67e971f1 TS |
144 | -qnanval, -qnanval, -qnanval, -qnanval, |
145 | -qnanval, -qnanval, -qnanval, -qnanval); | |
003c9895 UD |
146 | result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0; |
147 | printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n", | |
148 | wbuf); | |
149 | ||
ee091edf TS |
150 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G", |
151 | snanval, snanval, snanval, snanval, | |
152 | snanval, snanval, snanval, snanval); | |
153 | result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0; | |
154 | printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf); | |
155 | ||
156 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G", | |
157 | msnanval, msnanval, msnanval, msnanval, | |
158 | msnanval, msnanval, msnanval, msnanval); | |
159 | result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0; | |
160 | printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n", | |
161 | wbuf); | |
162 | ||
003c9895 UD |
163 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G", |
164 | infval, infval, infval, infval, infval, infval, infval, infval); | |
165 | result |= wcscmp (wbuf, L"inf INF inf INF inf INF inf INF") != 0; | |
166 | printf ("expected L\"inf INF inf INF inf INF inf INF\", got L\"%S\"\n", wbuf); | |
167 | ||
168 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G", | |
169 | -infval, -infval, -infval, -infval, | |
170 | -infval, -infval, -infval, -infval); | |
171 | result |= wcscmp (wbuf, L"-inf -INF -inf -INF -inf -INF -inf -INF") != 0; | |
172 | printf ("expected L\"-inf -INF -inf -INF -inf -INF -inf -INF\", got L\"%S\"\n", | |
173 | wbuf); | |
174 | ||
67e971f1 | 175 | lqnanval = NAN; |
003c9895 UD |
176 | |
177 | snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG", | |
67e971f1 TS |
178 | lqnanval, lqnanval, lqnanval, lqnanval, |
179 | lqnanval, lqnanval, lqnanval, lqnanval); | |
a8b792d6 | 180 | result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0; |
003c9895 UD |
181 | printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf); |
182 | ||
183 | snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG", | |
67e971f1 TS |
184 | -lqnanval, -lqnanval, -lqnanval, -lqnanval, |
185 | -lqnanval, -lqnanval, -lqnanval, -lqnanval); | |
a8b792d6 | 186 | result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0; |
003c9895 UD |
187 | printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n", |
188 | buf); | |
189 | ||
ee091edf TS |
190 | snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG", |
191 | lsnanval, lsnanval, lsnanval, lsnanval, | |
192 | lsnanval, lsnanval, lsnanval, lsnanval); | |
193 | result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0; | |
194 | printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf); | |
195 | ||
196 | snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG", | |
197 | lmsnanval, lmsnanval, lmsnanval, lmsnanval, | |
198 | lmsnanval, lmsnanval, lmsnanval, lmsnanval); | |
199 | result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0; | |
200 | printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n", | |
201 | buf); | |
202 | ||
003c9895 UD |
203 | linfval = LDBL_MAX * LDBL_MAX; |
204 | ||
205 | snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG", | |
206 | linfval, linfval, linfval, linfval, | |
207 | linfval, linfval, linfval, linfval); | |
208 | result |= strcmp (buf, "inf INF inf INF inf INF inf INF") != 0; | |
209 | printf ("expected \"inf INF inf INF inf INF inf INF\", got \"%s\"\n", buf); | |
210 | ||
211 | snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG", | |
212 | -linfval, -linfval, -linfval, -linfval, | |
213 | -linfval, -linfval, -linfval, -linfval); | |
214 | result |= strcmp (buf, "-inf -INF -inf -INF -inf -INF -inf -INF") != 0; | |
215 | printf ("expected \"-inf -INF -inf -INF -inf -INF -inf -INF\", got \"%s\"\n", | |
216 | buf); | |
217 | ||
218 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), | |
219 | L"%La %LA %Le %LE %Lf %LF %Lg %LG", | |
67e971f1 TS |
220 | lqnanval, lqnanval, lqnanval, lqnanval, |
221 | lqnanval, lqnanval, lqnanval, lqnanval); | |
003c9895 UD |
222 | result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0; |
223 | printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf); | |
224 | ||
225 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), | |
226 | L"%La %LA %Le %LE %Lf %LF %Lg %LG", | |
67e971f1 TS |
227 | -lqnanval, -lqnanval, -lqnanval, -lqnanval, |
228 | -lqnanval, -lqnanval, -lqnanval, -lqnanval); | |
003c9895 | 229 | result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0; |
ee091edf TS |
230 | printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n", |
231 | wbuf); | |
232 | ||
233 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), | |
234 | L"%La %LA %Le %LE %Lf %LF %Lg %LG", | |
235 | lsnanval, lsnanval, lsnanval, lsnanval, | |
236 | lsnanval, lsnanval, lsnanval, lsnanval); | |
237 | result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0; | |
238 | printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf); | |
239 | ||
240 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), | |
241 | L"%La %LA %Le %LE %Lf %LF %Lg %LG", | |
242 | lmsnanval, lmsnanval, lmsnanval, lmsnanval, | |
243 | lmsnanval, lmsnanval, lmsnanval, lmsnanval); | |
244 | result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0; | |
003c9895 UD |
245 | printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n", |
246 | wbuf); | |
247 | ||
248 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), | |
249 | L"%La %LA %Le %LE %Lf %LF %Lg %LG", | |
250 | linfval, linfval, linfval, linfval, | |
251 | linfval, linfval, linfval, linfval); | |
252 | result |= wcscmp (wbuf, L"inf INF inf INF inf INF inf INF") != 0; | |
253 | printf ("expected L\"inf INF inf INF inf INF inf INF\", got L\"%S\"\n", wbuf); | |
254 | ||
255 | swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), | |
256 | L"%La %LA %Le %LE %Lf %LF %Lg %LG", | |
257 | -linfval, -linfval, -linfval, -linfval, | |
258 | -linfval, -linfval, -linfval, -linfval); | |
259 | result |= wcscmp (wbuf, L"-inf -INF -inf -INF -inf -INF -inf -INF") != 0; | |
260 | printf ("expected L\"-inf -INF -inf -INF -inf -INF -inf -INF\", got L\"%S\"\n", | |
261 | wbuf); | |
6c46718f UD |
262 | |
263 | return result; | |
264 | } | |
265 | ||
196980f5 | 266 | int |
11336c16 | 267 | main (int argc, char *argv[]) |
196980f5 | 268 | { |
05be689b RM |
269 | int result = 0; |
270 | ||
271 | result |= t1 (); | |
272 | result |= t2 (); | |
4fdfe821 | 273 | result |= t3 (); |
6c46718f | 274 | result |= F (); |
05be689b RM |
275 | |
276 | result |= fflush (stdout) == EOF; | |
196980f5 | 277 | |
05be689b | 278 | return result; |
196980f5 | 279 | } |