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