1 /* Test of POSIX compatible vsprintf() and sprintf() functions.
2 Copyright (C) 2007-2020 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 /* Written by Bruno Haible <bruno@clisp.org>, 2007. */
19 #include "minus-zero.h"
23 /* The SGI MIPS floating-point format does not distinguish 0.0 and -0.0. */
27 static double plus_zero
= 0.0;
28 double minus_zero
= minus_zerod
;
29 return memcmp (&plus_zero
, &minus_zero
, sizeof (double)) != 0;
32 /* Representation of an 80-bit 'long double' as an initializer for a sequence
33 of 'unsigned int' words. */
34 #ifdef WORDS_BIGENDIAN
35 # define LDBL80_WORDS(exponent,manthi,mantlo) \
36 { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
37 ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \
38 (unsigned int) (mantlo) << 16 \
41 # define LDBL80_WORDS(exponent,manthi,mantlo) \
42 { mantlo, manthi, exponent }
46 strmatch (const char *pattern
, const char *string
)
48 if (strlen (pattern
) != strlen (string
))
50 for (; *pattern
!= '\0'; pattern
++, string
++)
51 if (*pattern
!= '*' && *string
!= *pattern
)
56 /* Test whether string[start_index..end_index-1] is a valid textual
57 representation of NaN. */
59 strisnan (const char *string
, size_t start_index
, size_t end_index
, int uppercase
)
61 if (start_index
< end_index
)
63 if (string
[start_index
] == '-')
65 if (start_index
+ 3 <= end_index
66 && memcmp (string
+ start_index
, uppercase
? "NAN" : "nan", 3) == 0)
69 if (start_index
== end_index
70 || (string
[start_index
] == '(' && string
[end_index
- 1] == ')'))
78 test_function (int (*my_sprintf
) (char *, const char *, ...))
83 /* Test return value convention. */
88 memcpy (buf
, "DEADBEEF", 8);
89 retval
= my_sprintf (buf
, "%d", 12345);
91 ASSERT (memcmp (buf
, "12345\0EF", 8) == 0);
94 /* Test support of size specifiers as in C99. */
98 my_sprintf (result
, "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
99 ASSERT (strcmp (result
, "12345671 33") == 0);
100 ASSERT (retval
== strlen (result
));
105 my_sprintf (result
, "%zu %d", (size_t) 12345672, 33, 44, 55);
106 ASSERT (strcmp (result
, "12345672 33") == 0);
107 ASSERT (retval
== strlen (result
));
112 my_sprintf (result
, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
113 ASSERT (strcmp (result
, "12345673 33") == 0);
114 ASSERT (retval
== strlen (result
));
119 my_sprintf (result
, "%Lg %d", (long double) 1.5, 33, 44, 55);
120 ASSERT (strcmp (result
, "1.5 33") == 0);
121 ASSERT (retval
== strlen (result
));
124 /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
125 output of floating-point numbers. */
127 { /* A positive number. */
129 my_sprintf (result
, "%a %d", 3.1416015625, 33, 44, 55);
130 ASSERT (strcmp (result
, "0x1.922p+1 33") == 0
131 || strcmp (result
, "0x3.244p+0 33") == 0
132 || strcmp (result
, "0x6.488p-1 33") == 0
133 || strcmp (result
, "0xc.91p-2 33") == 0);
134 ASSERT (retval
== strlen (result
));
137 { /* A negative number. */
139 my_sprintf (result
, "%A %d", -3.1416015625, 33, 44, 55);
140 ASSERT (strcmp (result
, "-0X1.922P+1 33") == 0
141 || strcmp (result
, "-0X3.244P+0 33") == 0
142 || strcmp (result
, "-0X6.488P-1 33") == 0
143 || strcmp (result
, "-0XC.91P-2 33") == 0);
144 ASSERT (retval
== strlen (result
));
147 { /* Positive zero. */
149 my_sprintf (result
, "%a %d", 0.0, 33, 44, 55);
150 ASSERT (strcmp (result
, "0x0p+0 33") == 0);
151 ASSERT (retval
== strlen (result
));
154 { /* Negative zero. */
156 my_sprintf (result
, "%a %d", minus_zerod
, 33, 44, 55);
157 if (have_minus_zero ())
158 ASSERT (strcmp (result
, "-0x0p+0 33") == 0);
159 ASSERT (retval
== strlen (result
));
162 { /* Positive infinity. */
164 my_sprintf (result
, "%a %d", Infinityd (), 33, 44, 55);
165 ASSERT (strcmp (result
, "inf 33") == 0);
166 ASSERT (retval
== strlen (result
));
169 { /* Negative infinity. */
171 my_sprintf (result
, "%a %d", - Infinityd (), 33, 44, 55);
172 ASSERT (strcmp (result
, "-inf 33") == 0);
173 ASSERT (retval
== strlen (result
));
178 my_sprintf (result
, "%a %d", NaNd (), 33, 44, 55);
179 ASSERT (strlen (result
) >= 3 + 3
180 && strisnan (result
, 0, strlen (result
) - 3, 0)
181 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
182 ASSERT (retval
== strlen (result
));
185 { /* Rounding near the decimal point. */
187 my_sprintf (result
, "%.0a %d", 1.5, 33, 44, 55);
188 ASSERT (strcmp (result
, "0x2p+0 33") == 0
189 || strcmp (result
, "0x3p-1 33") == 0
190 || strcmp (result
, "0x6p-2 33") == 0
191 || strcmp (result
, "0xcp-3 33") == 0);
192 ASSERT (retval
== strlen (result
));
195 { /* Rounding with precision 0. */
197 my_sprintf (result
, "%.0a %d", 1.51, 33, 44, 55);
198 ASSERT (strcmp (result
, "0x2p+0 33") == 0
199 || strcmp (result
, "0x3p-1 33") == 0
200 || strcmp (result
, "0x6p-2 33") == 0
201 || strcmp (result
, "0xcp-3 33") == 0);
202 ASSERT (retval
== strlen (result
));
205 { /* Rounding with precision 1. */
207 my_sprintf (result
, "%.1a %d", 1.51, 33, 44, 55);
208 ASSERT (strcmp (result
, "0x1.8p+0 33") == 0
209 || strcmp (result
, "0x3.0p-1 33") == 0
210 || strcmp (result
, "0x6.1p-2 33") == 0
211 || strcmp (result
, "0xc.1p-3 33") == 0);
212 ASSERT (retval
== strlen (result
));
215 { /* Rounding with precision 2. */
217 my_sprintf (result
, "%.2a %d", 1.51, 33, 44, 55);
218 ASSERT (strcmp (result
, "0x1.83p+0 33") == 0
219 || strcmp (result
, "0x3.05p-1 33") == 0
220 || strcmp (result
, "0x6.0ap-2 33") == 0
221 || strcmp (result
, "0xc.14p-3 33") == 0);
222 ASSERT (retval
== strlen (result
));
225 { /* Rounding with precision 3. */
227 my_sprintf (result
, "%.3a %d", 1.51, 33, 44, 55);
228 ASSERT (strcmp (result
, "0x1.829p+0 33") == 0
229 || strcmp (result
, "0x3.052p-1 33") == 0
230 || strcmp (result
, "0x6.0a4p-2 33") == 0
231 || strcmp (result
, "0xc.148p-3 33") == 0);
232 ASSERT (retval
== strlen (result
));
235 { /* Rounding can turn a ...FFF into a ...000. */
237 my_sprintf (result
, "%.3a %d", 1.49999, 33, 44, 55);
238 ASSERT (strcmp (result
, "0x1.800p+0 33") == 0
239 || strcmp (result
, "0x3.000p-1 33") == 0
240 || strcmp (result
, "0x6.000p-2 33") == 0
241 || strcmp (result
, "0xc.000p-3 33") == 0);
242 ASSERT (retval
== strlen (result
));
245 { /* Rounding can turn a ...FFF into a ...000.
246 This shows a Mac OS X 10.3.9 (Darwin 7.9) bug. */
248 my_sprintf (result
, "%.1a %d", 1.999, 33, 44, 55);
249 ASSERT (strcmp (result
, "0x1.0p+1 33") == 0
250 || strcmp (result
, "0x2.0p+0 33") == 0
251 || strcmp (result
, "0x4.0p-1 33") == 0
252 || strcmp (result
, "0x8.0p-2 33") == 0);
253 ASSERT (retval
== strlen (result
));
258 my_sprintf (result
, "%10a %d", 1.75, 33, 44, 55);
259 ASSERT (strcmp (result
, " 0x1.cp+0 33") == 0
260 || strcmp (result
, " 0x3.8p-1 33") == 0
261 || strcmp (result
, " 0x7p-2 33") == 0
262 || strcmp (result
, " 0xep-3 33") == 0);
263 ASSERT (retval
== strlen (result
));
266 { /* Small precision. */
268 my_sprintf (result
, "%.10a %d", 1.75, 33, 44, 55);
269 ASSERT (strcmp (result
, "0x1.c000000000p+0 33") == 0
270 || strcmp (result
, "0x3.8000000000p-1 33") == 0
271 || strcmp (result
, "0x7.0000000000p-2 33") == 0
272 || strcmp (result
, "0xe.0000000000p-3 33") == 0);
273 ASSERT (retval
== strlen (result
));
276 { /* Large precision. */
278 my_sprintf (result
, "%.50a %d", 1.75, 33, 44, 55);
279 ASSERT (strcmp (result
, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
280 || strcmp (result
, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
281 || strcmp (result
, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
282 || strcmp (result
, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
283 ASSERT (retval
== strlen (result
));
288 my_sprintf (result
, "%-10a %d", 1.75, 33, 44, 55);
289 ASSERT (strcmp (result
, "0x1.cp+0 33") == 0
290 || strcmp (result
, "0x3.8p-1 33") == 0
291 || strcmp (result
, "0x7p-2 33") == 0
292 || strcmp (result
, "0xep-3 33") == 0);
293 ASSERT (retval
== strlen (result
));
296 { /* FLAG_SHOWSIGN. */
298 my_sprintf (result
, "%+a %d", 1.75, 33, 44, 55);
299 ASSERT (strcmp (result
, "+0x1.cp+0 33") == 0
300 || strcmp (result
, "+0x3.8p-1 33") == 0
301 || strcmp (result
, "+0x7p-2 33") == 0
302 || strcmp (result
, "+0xep-3 33") == 0);
303 ASSERT (retval
== strlen (result
));
308 my_sprintf (result
, "% a %d", 1.75, 33, 44, 55);
309 ASSERT (strcmp (result
, " 0x1.cp+0 33") == 0
310 || strcmp (result
, " 0x3.8p-1 33") == 0
311 || strcmp (result
, " 0x7p-2 33") == 0
312 || strcmp (result
, " 0xep-3 33") == 0);
313 ASSERT (retval
== strlen (result
));
318 my_sprintf (result
, "%#a %d", 1.75, 33, 44, 55);
319 ASSERT (strcmp (result
, "0x1.cp+0 33") == 0
320 || strcmp (result
, "0x3.8p-1 33") == 0
321 || strcmp (result
, "0x7.p-2 33") == 0
322 || strcmp (result
, "0xe.p-3 33") == 0);
323 ASSERT (retval
== strlen (result
));
328 my_sprintf (result
, "%#a %d", 1.0, 33, 44, 55);
329 ASSERT (strcmp (result
, "0x1.p+0 33") == 0
330 || strcmp (result
, "0x2.p-1 33") == 0
331 || strcmp (result
, "0x4.p-2 33") == 0
332 || strcmp (result
, "0x8.p-3 33") == 0);
333 ASSERT (retval
== strlen (result
));
336 { /* FLAG_ZERO with finite number. */
338 my_sprintf (result
, "%010a %d", 1.75, 33, 44, 55);
339 ASSERT (strcmp (result
, "0x001.cp+0 33") == 0
340 || strcmp (result
, "0x003.8p-1 33") == 0
341 || strcmp (result
, "0x00007p-2 33") == 0
342 || strcmp (result
, "0x0000ep-3 33") == 0);
343 ASSERT (retval
== strlen (result
));
346 { /* FLAG_ZERO with infinite number. */
348 my_sprintf (result
, "%010a %d", Infinityd (), 33, 44, 55);
349 /* "0000000inf 33" is not a valid result; see
350 <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
351 ASSERT (strcmp (result
, " inf 33") == 0);
352 ASSERT (retval
== strlen (result
));
355 { /* FLAG_ZERO with NaN. */
357 my_sprintf (result
, "%050a %d", NaNd (), 33, 44, 55);
358 /* "0000000nan 33" is not a valid result; see
359 <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
360 ASSERT (strlen (result
) == 50 + 3
361 && strisnan (result
, strspn (result
, " "), strlen (result
) - 3, 0)
362 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
363 ASSERT (retval
== strlen (result
));
366 { /* A positive number. */
368 my_sprintf (result
, "%La %d", 3.1416015625L, 33, 44, 55);
369 ASSERT (strcmp (result
, "0x1.922p+1 33") == 0
370 || strcmp (result
, "0x3.244p+0 33") == 0
371 || strcmp (result
, "0x6.488p-1 33") == 0
372 || strcmp (result
, "0xc.91p-2 33") == 0);
373 ASSERT (retval
== strlen (result
));
376 { /* A negative number. */
378 my_sprintf (result
, "%LA %d", -3.1416015625L, 33, 44, 55);
379 ASSERT (strcmp (result
, "-0X1.922P+1 33") == 0
380 || strcmp (result
, "-0X3.244P+0 33") == 0
381 || strcmp (result
, "-0X6.488P-1 33") == 0
382 || strcmp (result
, "-0XC.91P-2 33") == 0);
383 ASSERT (retval
== strlen (result
));
386 { /* Positive zero. */
388 my_sprintf (result
, "%La %d", 0.0L, 33, 44, 55);
389 ASSERT (strcmp (result
, "0x0p+0 33") == 0);
390 ASSERT (retval
== strlen (result
));
393 { /* Negative zero. */
395 my_sprintf (result
, "%La %d", minus_zerol
, 33, 44, 55);
396 if (have_minus_zero ())
397 ASSERT (strcmp (result
, "-0x0p+0 33") == 0);
398 ASSERT (retval
== strlen (result
));
401 { /* Positive infinity. */
403 my_sprintf (result
, "%La %d", Infinityl (), 33, 44, 55);
404 ASSERT (strcmp (result
, "inf 33") == 0);
405 ASSERT (retval
== strlen (result
));
408 { /* Negative infinity. */
410 my_sprintf (result
, "%La %d", - Infinityl (), 33, 44, 55);
411 ASSERT (strcmp (result
, "-inf 33") == 0);
412 ASSERT (retval
== strlen (result
));
417 my_sprintf (result
, "%La %d", NaNl (), 33, 44, 55);
418 ASSERT (strlen (result
) >= 3 + 3
419 && strisnan (result
, 0, strlen (result
) - 3, 0)
420 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
421 ASSERT (retval
== strlen (result
));
423 #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
425 static union { unsigned int word
[4]; long double value
; } x
=
426 { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
428 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
429 ASSERT (strlen (result
) >= 3 + 3
430 && strisnan (result
, 0, strlen (result
) - 3, 0)
431 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
432 ASSERT (retval
== strlen (result
));
435 /* Signalling NaN. */
436 static union { unsigned int word
[4]; long double value
; } x
=
437 { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
439 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
440 ASSERT (strlen (result
) >= 3 + 3
441 && strisnan (result
, 0, strlen (result
) - 3, 0)
442 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
443 ASSERT (retval
== strlen (result
));
445 /* sprintf should print something for noncanonical values. */
447 static union { unsigned int word
[4]; long double value
; } x
=
448 { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
450 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
451 ASSERT (retval
== strlen (result
));
452 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
454 { /* Pseudo-Infinity. */
455 static union { unsigned int word
[4]; long double value
; } x
=
456 { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
458 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
459 ASSERT (retval
== strlen (result
));
460 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
463 static union { unsigned int word
[4]; long double value
; } x
=
464 { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
466 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
467 ASSERT (retval
== strlen (result
));
468 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
470 { /* Unnormalized number. */
471 static union { unsigned int word
[4]; long double value
; } x
=
472 { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
474 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
475 ASSERT (retval
== strlen (result
));
476 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
478 { /* Pseudo-Denormal. */
479 static union { unsigned int word
[4]; long double value
; } x
=
480 { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
482 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
483 ASSERT (retval
== strlen (result
));
484 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
488 { /* Rounding near the decimal point. */
490 my_sprintf (result
, "%.0La %d", 1.5L, 33, 44, 55);
491 ASSERT (strcmp (result
, "0x2p+0 33") == 0
492 || strcmp (result
, "0x3p-1 33") == 0
493 || strcmp (result
, "0x6p-2 33") == 0
494 || strcmp (result
, "0xcp-3 33") == 0);
495 ASSERT (retval
== strlen (result
));
498 { /* Rounding with precision 0. */
500 my_sprintf (result
, "%.0La %d", 1.51L, 33, 44, 55);
501 ASSERT (strcmp (result
, "0x2p+0 33") == 0
502 || strcmp (result
, "0x3p-1 33") == 0
503 || strcmp (result
, "0x6p-2 33") == 0
504 || strcmp (result
, "0xcp-3 33") == 0);
505 ASSERT (retval
== strlen (result
));
508 { /* Rounding with precision 1. */
510 my_sprintf (result
, "%.1La %d", 1.51L, 33, 44, 55);
511 ASSERT (strcmp (result
, "0x1.8p+0 33") == 0
512 || strcmp (result
, "0x3.0p-1 33") == 0
513 || strcmp (result
, "0x6.1p-2 33") == 0
514 || strcmp (result
, "0xc.1p-3 33") == 0);
515 ASSERT (retval
== strlen (result
));
518 { /* Rounding with precision 2. */
520 my_sprintf (result
, "%.2La %d", 1.51L, 33, 44, 55);
521 ASSERT (strcmp (result
, "0x1.83p+0 33") == 0
522 || strcmp (result
, "0x3.05p-1 33") == 0
523 || strcmp (result
, "0x6.0ap-2 33") == 0
524 || strcmp (result
, "0xc.14p-3 33") == 0);
525 ASSERT (retval
== strlen (result
));
528 { /* Rounding with precision 3. */
530 my_sprintf (result
, "%.3La %d", 1.51L, 33, 44, 55);
531 ASSERT (strcmp (result
, "0x1.829p+0 33") == 0
532 || strcmp (result
, "0x3.052p-1 33") == 0
533 || strcmp (result
, "0x6.0a4p-2 33") == 0
534 || strcmp (result
, "0xc.148p-3 33") == 0);
535 ASSERT (retval
== strlen (result
));
538 { /* Rounding can turn a ...FFF into a ...000. */
540 my_sprintf (result
, "%.3La %d", 1.49999L, 33, 44, 55);
541 ASSERT (strcmp (result
, "0x1.800p+0 33") == 0
542 || strcmp (result
, "0x3.000p-1 33") == 0
543 || strcmp (result
, "0x6.000p-2 33") == 0
544 || strcmp (result
, "0xc.000p-3 33") == 0);
545 ASSERT (retval
== strlen (result
));
548 { /* Rounding can turn a ...FFF into a ...000.
549 This shows a Mac OS X 10.3.9 (Darwin 7.9) bug and a
550 glibc 2.4 bug <https://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
552 my_sprintf (result
, "%.1La %d", 1.999L, 33, 44, 55);
553 ASSERT (strcmp (result
, "0x1.0p+1 33") == 0
554 || strcmp (result
, "0x2.0p+0 33") == 0
555 || strcmp (result
, "0x4.0p-1 33") == 0
556 || strcmp (result
, "0x8.0p-2 33") == 0);
557 ASSERT (retval
== strlen (result
));
562 my_sprintf (result
, "%10La %d", 1.75L, 33, 44, 55);
563 ASSERT (strcmp (result
, " 0x1.cp+0 33") == 0
564 || strcmp (result
, " 0x3.8p-1 33") == 0
565 || strcmp (result
, " 0x7p-2 33") == 0
566 || strcmp (result
, " 0xep-3 33") == 0);
567 ASSERT (retval
== strlen (result
));
570 { /* Small precision. */
572 my_sprintf (result
, "%.10La %d", 1.75L, 33, 44, 55);
573 ASSERT (strcmp (result
, "0x1.c000000000p+0 33") == 0
574 || strcmp (result
, "0x3.8000000000p-1 33") == 0
575 || strcmp (result
, "0x7.0000000000p-2 33") == 0
576 || strcmp (result
, "0xe.0000000000p-3 33") == 0);
577 ASSERT (retval
== strlen (result
));
580 { /* Large precision. */
582 my_sprintf (result
, "%.50La %d", 1.75L, 33, 44, 55);
583 ASSERT (strcmp (result
, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
584 || strcmp (result
, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
585 || strcmp (result
, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
586 || strcmp (result
, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
587 ASSERT (retval
== strlen (result
));
592 my_sprintf (result
, "%-10La %d", 1.75L, 33, 44, 55);
593 ASSERT (strcmp (result
, "0x1.cp+0 33") == 0
594 || strcmp (result
, "0x3.8p-1 33") == 0
595 || strcmp (result
, "0x7p-2 33") == 0
596 || strcmp (result
, "0xep-3 33") == 0);
597 ASSERT (retval
== strlen (result
));
600 { /* FLAG_SHOWSIGN. */
602 my_sprintf (result
, "%+La %d", 1.75L, 33, 44, 55);
603 ASSERT (strcmp (result
, "+0x1.cp+0 33") == 0
604 || strcmp (result
, "+0x3.8p-1 33") == 0
605 || strcmp (result
, "+0x7p-2 33") == 0
606 || strcmp (result
, "+0xep-3 33") == 0);
607 ASSERT (retval
== strlen (result
));
612 my_sprintf (result
, "% La %d", 1.75L, 33, 44, 55);
613 ASSERT (strcmp (result
, " 0x1.cp+0 33") == 0
614 || strcmp (result
, " 0x3.8p-1 33") == 0
615 || strcmp (result
, " 0x7p-2 33") == 0
616 || strcmp (result
, " 0xep-3 33") == 0);
617 ASSERT (retval
== strlen (result
));
622 my_sprintf (result
, "%#La %d", 1.75L, 33, 44, 55);
623 ASSERT (strcmp (result
, "0x1.cp+0 33") == 0
624 || strcmp (result
, "0x3.8p-1 33") == 0
625 || strcmp (result
, "0x7.p-2 33") == 0
626 || strcmp (result
, "0xe.p-3 33") == 0);
627 ASSERT (retval
== strlen (result
));
632 my_sprintf (result
, "%#La %d", 1.0L, 33, 44, 55);
633 ASSERT (strcmp (result
, "0x1.p+0 33") == 0
634 || strcmp (result
, "0x2.p-1 33") == 0
635 || strcmp (result
, "0x4.p-2 33") == 0
636 || strcmp (result
, "0x8.p-3 33") == 0);
637 ASSERT (retval
== strlen (result
));
640 { /* FLAG_ZERO with finite number. */
642 my_sprintf (result
, "%010La %d", 1.75L, 33, 44, 55);
643 ASSERT (strcmp (result
, "0x001.cp+0 33") == 0
644 || strcmp (result
, "0x003.8p-1 33") == 0
645 || strcmp (result
, "0x00007p-2 33") == 0
646 || strcmp (result
, "0x0000ep-3 33") == 0);
647 ASSERT (retval
== strlen (result
));
650 { /* FLAG_ZERO with infinite number. */
652 my_sprintf (result
, "%010La %d", Infinityl (), 33, 44, 55);
653 /* "0000000inf 33" is not a valid result; see
654 <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
655 ASSERT (strcmp (result
, " inf 33") == 0);
656 ASSERT (retval
== strlen (result
));
659 { /* FLAG_ZERO with NaN. */
661 my_sprintf (result
, "%050La %d", NaNl (), 33, 44, 55);
662 /* "0000000nan 33" is not a valid result; see
663 <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
664 ASSERT (strlen (result
) == 50 + 3
665 && strisnan (result
, strspn (result
, " "), strlen (result
) - 3, 0)
666 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
667 ASSERT (retval
== strlen (result
));
670 /* Test the support of the %f format directive. */
672 { /* A positive number. */
674 my_sprintf (result
, "%f %d", 12.75, 33, 44, 55);
675 ASSERT (strcmp (result
, "12.750000 33") == 0);
676 ASSERT (retval
== strlen (result
));
679 { /* A larger positive number. */
681 my_sprintf (result
, "%f %d", 1234567.0, 33, 44, 55);
682 ASSERT (strcmp (result
, "1234567.000000 33") == 0);
683 ASSERT (retval
== strlen (result
));
686 { /* Small and large positive numbers. */
687 static struct { double value
; const char *string
; } data
[] =
689 { 1.234321234321234e-37, "0.000000" },
690 { 1.234321234321234e-36, "0.000000" },
691 { 1.234321234321234e-35, "0.000000" },
692 { 1.234321234321234e-34, "0.000000" },
693 { 1.234321234321234e-33, "0.000000" },
694 { 1.234321234321234e-32, "0.000000" },
695 { 1.234321234321234e-31, "0.000000" },
696 { 1.234321234321234e-30, "0.000000" },
697 { 1.234321234321234e-29, "0.000000" },
698 { 1.234321234321234e-28, "0.000000" },
699 { 1.234321234321234e-27, "0.000000" },
700 { 1.234321234321234e-26, "0.000000" },
701 { 1.234321234321234e-25, "0.000000" },
702 { 1.234321234321234e-24, "0.000000" },
703 { 1.234321234321234e-23, "0.000000" },
704 { 1.234321234321234e-22, "0.000000" },
705 { 1.234321234321234e-21, "0.000000" },
706 { 1.234321234321234e-20, "0.000000" },
707 { 1.234321234321234e-19, "0.000000" },
708 { 1.234321234321234e-18, "0.000000" },
709 { 1.234321234321234e-17, "0.000000" },
710 { 1.234321234321234e-16, "0.000000" },
711 { 1.234321234321234e-15, "0.000000" },
712 { 1.234321234321234e-14, "0.000000" },
713 { 1.234321234321234e-13, "0.000000" },
714 { 1.234321234321234e-12, "0.000000" },
715 { 1.234321234321234e-11, "0.000000" },
716 { 1.234321234321234e-10, "0.000000" },
717 { 1.234321234321234e-9, "0.000000" },
718 { 1.234321234321234e-8, "0.000000" },
719 { 1.234321234321234e-7, "0.000000" },
720 { 1.234321234321234e-6, "0.000001" },
721 { 1.234321234321234e-5, "0.000012" },
722 { 1.234321234321234e-4, "0.000123" },
723 { 1.234321234321234e-3, "0.001234" },
724 { 1.234321234321234e-2, "0.012343" },
725 { 1.234321234321234e-1, "0.123432" },
726 { 1.234321234321234, "1.234321" },
727 { 1.234321234321234e1
, "12.343212" },
728 { 1.234321234321234e2
, "123.432123" },
729 { 1.234321234321234e3
, "1234.321234" },
730 { 1.234321234321234e4
, "12343.212343" },
731 { 1.234321234321234e5
, "123432.123432" },
732 { 1.234321234321234e6
, "1234321.234321" },
733 { 1.234321234321234e7
, "12343212.343212" },
734 { 1.234321234321234e8
, "123432123.432123" },
735 { 1.234321234321234e9
, "1234321234.321234" },
736 { 1.234321234321234e10
, "12343212343.2123**" },
737 { 1.234321234321234e11
, "123432123432.123***" },
738 { 1.234321234321234e12
, "1234321234321.23****" },
739 { 1.234321234321234e13
, "12343212343212.3*****" },
740 { 1.234321234321234e14
, "123432123432123.******" },
741 { 1.234321234321234e15
, "1234321234321234.000000" },
742 { 1.234321234321234e16
, "123432123432123**.000000" },
743 { 1.234321234321234e17
, "123432123432123***.000000" },
744 { 1.234321234321234e18
, "123432123432123****.000000" },
745 { 1.234321234321234e19
, "123432123432123*****.000000" },
746 { 1.234321234321234e20
, "123432123432123******.000000" },
747 { 1.234321234321234e21
, "123432123432123*******.000000" },
748 { 1.234321234321234e22
, "123432123432123********.000000" },
749 { 1.234321234321234e23
, "123432123432123*********.000000" },
750 { 1.234321234321234e24
, "123432123432123**********.000000" },
751 { 1.234321234321234e25
, "123432123432123***********.000000" },
752 { 1.234321234321234e26
, "123432123432123************.000000" },
753 { 1.234321234321234e27
, "123432123432123*************.000000" },
754 { 1.234321234321234e28
, "123432123432123**************.000000" },
755 { 1.234321234321234e29
, "123432123432123***************.000000" },
756 { 1.234321234321234e30
, "123432123432123****************.000000" },
757 { 1.234321234321234e31
, "123432123432123*****************.000000" },
758 { 1.234321234321234e32
, "123432123432123******************.000000" },
759 { 1.234321234321234e33
, "123432123432123*******************.000000" },
760 { 1.234321234321234e34
, "123432123432123********************.000000" },
761 { 1.234321234321234e35
, "123432123432123*********************.000000" },
762 { 1.234321234321234e36
, "123432123432123**********************.000000" }
765 for (k
= 0; k
< SIZEOF (data
); k
++)
768 my_sprintf (result
, "%f", data
[k
].value
);
769 ASSERT (strmatch (data
[k
].string
, result
));
770 ASSERT (retval
== strlen (result
));
774 { /* A negative number. */
776 my_sprintf (result
, "%f %d", -0.03125, 33, 44, 55);
777 ASSERT (strcmp (result
, "-0.031250 33") == 0);
778 ASSERT (retval
== strlen (result
));
781 { /* Positive zero. */
783 my_sprintf (result
, "%f %d", 0.0, 33, 44, 55);
784 ASSERT (strcmp (result
, "0.000000 33") == 0);
785 ASSERT (retval
== strlen (result
));
788 { /* Negative zero. */
790 my_sprintf (result
, "%f %d", minus_zerod
, 33, 44, 55);
791 if (have_minus_zero ())
792 ASSERT (strcmp (result
, "-0.000000 33") == 0);
793 ASSERT (retval
== strlen (result
));
796 { /* Positive infinity. */
798 my_sprintf (result
, "%f %d", Infinityd (), 33, 44, 55);
799 ASSERT (strcmp (result
, "inf 33") == 0
800 || strcmp (result
, "infinity 33") == 0);
801 ASSERT (retval
== strlen (result
));
804 { /* Negative infinity. */
806 my_sprintf (result
, "%f %d", - Infinityd (), 33, 44, 55);
807 ASSERT (strcmp (result
, "-inf 33") == 0
808 || strcmp (result
, "-infinity 33") == 0);
809 ASSERT (retval
== strlen (result
));
814 my_sprintf (result
, "%f %d", NaNd (), 33, 44, 55);
815 ASSERT (strlen (result
) >= 3 + 3
816 && strisnan (result
, 0, strlen (result
) - 3, 0)
817 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
818 ASSERT (retval
== strlen (result
));
823 my_sprintf (result
, "%10f %d", 1.75, 33, 44, 55);
824 ASSERT (strcmp (result
, " 1.750000 33") == 0);
825 ASSERT (retval
== strlen (result
));
830 my_sprintf (result
, "%-10f %d", 1.75, 33, 44, 55);
831 ASSERT (strcmp (result
, "1.750000 33") == 0);
832 ASSERT (retval
== strlen (result
));
835 { /* FLAG_SHOWSIGN. */
837 my_sprintf (result
, "%+f %d", 1.75, 33, 44, 55);
838 ASSERT (strcmp (result
, "+1.750000 33") == 0);
839 ASSERT (retval
== strlen (result
));
844 my_sprintf (result
, "% f %d", 1.75, 33, 44, 55);
845 ASSERT (strcmp (result
, " 1.750000 33") == 0);
846 ASSERT (retval
== strlen (result
));
851 my_sprintf (result
, "%#f %d", 1.75, 33, 44, 55);
852 ASSERT (strcmp (result
, "1.750000 33") == 0);
853 ASSERT (retval
== strlen (result
));
858 my_sprintf (result
, "%#.f %d", 1.75, 33, 44, 55);
859 ASSERT (strcmp (result
, "2. 33") == 0);
860 ASSERT (retval
== strlen (result
));
863 { /* FLAG_ZERO with finite number. */
865 my_sprintf (result
, "%015f %d", 1234.0, 33, 44, 55);
866 ASSERT (strcmp (result
, "00001234.000000 33") == 0);
867 ASSERT (retval
== strlen (result
));
870 { /* FLAG_ZERO with infinite number. */
872 my_sprintf (result
, "%015f %d", - Infinityd (), 33, 44, 55);
873 ASSERT (strcmp (result
, " -inf 33") == 0
874 || strcmp (result
, " -infinity 33") == 0);
875 ASSERT (retval
== strlen (result
));
878 { /* FLAG_ZERO with NaN. */
880 my_sprintf (result
, "%050f %d", NaNd (), 33, 44, 55);
881 ASSERT (strlen (result
) == 50 + 3
882 && strisnan (result
, strspn (result
, " "), strlen (result
) - 3, 0)
883 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
884 ASSERT (retval
== strlen (result
));
889 my_sprintf (result
, "%.f %d", 1234.0, 33, 44, 55);
890 ASSERT (strcmp (result
, "1234 33") == 0);
891 ASSERT (retval
== strlen (result
));
894 { /* Precision with no rounding. */
896 my_sprintf (result
, "%.2f %d", 999.951, 33, 44, 55);
897 ASSERT (strcmp (result
, "999.95 33") == 0);
898 ASSERT (retval
== strlen (result
));
901 { /* Precision with rounding. */
903 my_sprintf (result
, "%.2f %d", 999.996, 33, 44, 55);
904 ASSERT (strcmp (result
, "1000.00 33") == 0);
905 ASSERT (retval
== strlen (result
));
908 { /* A positive number. */
910 my_sprintf (result
, "%Lf %d", 12.75L, 33, 44, 55);
911 ASSERT (strcmp (result
, "12.750000 33") == 0);
912 ASSERT (retval
== strlen (result
));
915 { /* A larger positive number. */
917 my_sprintf (result
, "%Lf %d", 1234567.0L, 33, 44, 55);
918 ASSERT (strcmp (result
, "1234567.000000 33") == 0);
919 ASSERT (retval
== strlen (result
));
922 { /* Small and large positive numbers. */
923 static struct { long double value
; const char *string
; } data
[] =
925 { 1.234321234321234e-37L, "0.000000" },
926 { 1.234321234321234e-36L, "0.000000" },
927 { 1.234321234321234e-35L, "0.000000" },
928 { 1.234321234321234e-34L, "0.000000" },
929 { 1.234321234321234e-33L, "0.000000" },
930 { 1.234321234321234e-32L, "0.000000" },
931 { 1.234321234321234e-31L, "0.000000" },
932 { 1.234321234321234e-30L, "0.000000" },
933 { 1.234321234321234e-29L, "0.000000" },
934 { 1.234321234321234e-28L, "0.000000" },
935 { 1.234321234321234e-27L, "0.000000" },
936 { 1.234321234321234e-26L, "0.000000" },
937 { 1.234321234321234e-25L, "0.000000" },
938 { 1.234321234321234e-24L, "0.000000" },
939 { 1.234321234321234e-23L, "0.000000" },
940 { 1.234321234321234e-22L, "0.000000" },
941 { 1.234321234321234e-21L, "0.000000" },
942 { 1.234321234321234e-20L, "0.000000" },
943 { 1.234321234321234e-19L, "0.000000" },
944 { 1.234321234321234e-18L, "0.000000" },
945 { 1.234321234321234e-17L, "0.000000" },
946 { 1.234321234321234e-16L, "0.000000" },
947 { 1.234321234321234e-15L, "0.000000" },
948 { 1.234321234321234e-14L, "0.000000" },
949 { 1.234321234321234e-13L, "0.000000" },
950 { 1.234321234321234e-12L, "0.000000" },
951 { 1.234321234321234e-11L, "0.000000" },
952 { 1.234321234321234e-10L, "0.000000" },
953 { 1.234321234321234e-9L, "0.000000" },
954 { 1.234321234321234e-8L, "0.000000" },
955 { 1.234321234321234e-7L, "0.000000" },
956 { 1.234321234321234e-6L, "0.000001" },
957 { 1.234321234321234e-5L, "0.000012" },
958 { 1.234321234321234e-4L, "0.000123" },
959 { 1.234321234321234e-3L, "0.001234" },
960 { 1.234321234321234e-2L, "0.012343" },
961 { 1.234321234321234e-1L, "0.123432" },
962 { 1.234321234321234L, "1.234321" },
963 { 1.234321234321234e1L
, "12.343212" },
964 { 1.234321234321234e2L
, "123.432123" },
965 { 1.234321234321234e3L
, "1234.321234" },
966 { 1.234321234321234e4L
, "12343.212343" },
967 { 1.234321234321234e5L
, "123432.123432" },
968 { 1.234321234321234e6L
, "1234321.234321" },
969 { 1.234321234321234e7L
, "12343212.343212" },
970 { 1.234321234321234e8L
, "123432123.432123" },
971 { 1.234321234321234e9L
, "1234321234.321234" },
972 { 1.234321234321234e10L
, "12343212343.2123**" },
973 { 1.234321234321234e11L
, "123432123432.123***" },
974 { 1.234321234321234e12L
, "1234321234321.23****" },
975 { 1.234321234321234e13L
, "12343212343212.3*****" },
976 { 1.234321234321234e14L
, "123432123432123.******" },
977 { 1.234321234321234e15L
, "1234321234321234.000000" },
978 { 1.234321234321234e16L
, "123432123432123**.000000" },
979 { 1.234321234321234e17L
, "123432123432123***.000000" },
980 { 1.234321234321234e18L
, "123432123432123****.000000" },
981 { 1.234321234321234e19L
, "123432123432123*****.000000" },
982 { 1.234321234321234e20L
, "123432123432123******.000000" },
983 { 1.234321234321234e21L
, "123432123432123*******.000000" },
984 { 1.234321234321234e22L
, "123432123432123********.000000" },
985 { 1.234321234321234e23L
, "123432123432123*********.000000" },
986 { 1.234321234321234e24L
, "123432123432123**********.000000" },
987 { 1.234321234321234e25L
, "123432123432123***********.000000" },
988 { 1.234321234321234e26L
, "123432123432123************.000000" },
989 { 1.234321234321234e27L
, "123432123432123*************.000000" },
990 { 1.234321234321234e28L
, "123432123432123**************.000000" },
991 { 1.234321234321234e29L
, "123432123432123***************.000000" },
992 { 1.234321234321234e30L
, "123432123432123****************.000000" },
993 { 1.234321234321234e31L
, "123432123432123*****************.000000" },
994 { 1.234321234321234e32L
, "123432123432123******************.000000" },
995 { 1.234321234321234e33L
, "123432123432123*******************.000000" },
996 { 1.234321234321234e34L
, "123432123432123********************.000000" },
997 { 1.234321234321234e35L
, "123432123432123*********************.000000" },
998 { 1.234321234321234e36L
, "123432123432123**********************.000000" }
1001 for (k
= 0; k
< SIZEOF (data
); k
++)
1004 my_sprintf (result
, "%Lf", data
[k
].value
);
1005 ASSERT (strmatch (data
[k
].string
, result
));
1006 ASSERT (retval
== strlen (result
));
1010 { /* A negative number. */
1012 my_sprintf (result
, "%Lf %d", -0.03125L, 33, 44, 55);
1013 ASSERT (strcmp (result
, "-0.031250 33") == 0);
1014 ASSERT (retval
== strlen (result
));
1017 { /* Positive zero. */
1019 my_sprintf (result
, "%Lf %d", 0.0L, 33, 44, 55);
1020 ASSERT (strcmp (result
, "0.000000 33") == 0);
1021 ASSERT (retval
== strlen (result
));
1024 { /* Negative zero. */
1026 my_sprintf (result
, "%Lf %d", minus_zerol
, 33, 44, 55);
1027 if (have_minus_zero ())
1028 ASSERT (strcmp (result
, "-0.000000 33") == 0);
1029 ASSERT (retval
== strlen (result
));
1032 { /* Positive infinity. */
1034 my_sprintf (result
, "%Lf %d", Infinityl (), 33, 44, 55);
1035 ASSERT (strcmp (result
, "inf 33") == 0
1036 || strcmp (result
, "infinity 33") == 0);
1037 ASSERT (retval
== strlen (result
));
1040 { /* Negative infinity. */
1042 my_sprintf (result
, "%Lf %d", - Infinityl (), 33, 44, 55);
1043 ASSERT (strcmp (result
, "-inf 33") == 0
1044 || strcmp (result
, "-infinity 33") == 0);
1045 ASSERT (retval
== strlen (result
));
1050 my_sprintf (result
, "%Lf %d", NaNl (), 33, 44, 55);
1051 ASSERT (strlen (result
) >= 3 + 3
1052 && strisnan (result
, 0, strlen (result
) - 3, 0)
1053 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1054 ASSERT (retval
== strlen (result
));
1056 #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
1058 static union { unsigned int word
[4]; long double value
; } x
=
1059 { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
1061 my_sprintf (result
, "%Lf %d", x
.value
, 33, 44, 55);
1062 ASSERT (strlen (result
) >= 3 + 3
1063 && strisnan (result
, 0, strlen (result
) - 3, 0)
1064 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1065 ASSERT (retval
== strlen (result
));
1068 /* Signalling NaN. */
1069 static union { unsigned int word
[4]; long double value
; } x
=
1070 { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
1072 my_sprintf (result
, "%Lf %d", x
.value
, 33, 44, 55);
1073 ASSERT (strlen (result
) >= 3 + 3
1074 && strisnan (result
, 0, strlen (result
) - 3, 0)
1075 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1076 ASSERT (retval
== strlen (result
));
1078 /* sprintf should print something for noncanonical values. */
1080 static union { unsigned int word
[4]; long double value
; } x
=
1081 { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
1083 my_sprintf (result
, "%Lf %d", x
.value
, 33, 44, 55);
1084 ASSERT (retval
== strlen (result
));
1085 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1087 { /* Pseudo-Infinity. */
1088 static union { unsigned int word
[4]; long double value
; } x
=
1089 { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
1091 my_sprintf (result
, "%Lf %d", x
.value
, 33, 44, 55);
1092 ASSERT (retval
== strlen (result
));
1093 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1095 { /* Pseudo-Zero. */
1096 static union { unsigned int word
[4]; long double value
; } x
=
1097 { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
1099 my_sprintf (result
, "%Lf %d", x
.value
, 33, 44, 55);
1100 ASSERT (retval
== strlen (result
));
1101 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1103 { /* Unnormalized number. */
1104 static union { unsigned int word
[4]; long double value
; } x
=
1105 { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
1107 my_sprintf (result
, "%Lf %d", x
.value
, 33, 44, 55);
1108 ASSERT (retval
== strlen (result
));
1109 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1111 { /* Pseudo-Denormal. */
1112 static union { unsigned int word
[4]; long double value
; } x
=
1113 { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
1115 my_sprintf (result
, "%Lf %d", x
.value
, 33, 44, 55);
1116 ASSERT (retval
== strlen (result
));
1117 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1123 my_sprintf (result
, "%10Lf %d", 1.75L, 33, 44, 55);
1124 ASSERT (strcmp (result
, " 1.750000 33") == 0);
1125 ASSERT (retval
== strlen (result
));
1130 my_sprintf (result
, "%-10Lf %d", 1.75L, 33, 44, 55);
1131 ASSERT (strcmp (result
, "1.750000 33") == 0);
1132 ASSERT (retval
== strlen (result
));
1135 { /* FLAG_SHOWSIGN. */
1137 my_sprintf (result
, "%+Lf %d", 1.75L, 33, 44, 55);
1138 ASSERT (strcmp (result
, "+1.750000 33") == 0);
1139 ASSERT (retval
== strlen (result
));
1144 my_sprintf (result
, "% Lf %d", 1.75L, 33, 44, 55);
1145 ASSERT (strcmp (result
, " 1.750000 33") == 0);
1146 ASSERT (retval
== strlen (result
));
1151 my_sprintf (result
, "%#Lf %d", 1.75L, 33, 44, 55);
1152 ASSERT (strcmp (result
, "1.750000 33") == 0);
1153 ASSERT (retval
== strlen (result
));
1158 my_sprintf (result
, "%#.Lf %d", 1.75L, 33, 44, 55);
1159 ASSERT (strcmp (result
, "2. 33") == 0);
1160 ASSERT (retval
== strlen (result
));
1163 { /* FLAG_ZERO with finite number. */
1165 my_sprintf (result
, "%015Lf %d", 1234.0L, 33, 44, 55);
1166 ASSERT (strcmp (result
, "00001234.000000 33") == 0);
1167 ASSERT (retval
== strlen (result
));
1170 { /* FLAG_ZERO with infinite number. */
1172 my_sprintf (result
, "%015Lf %d", - Infinityl (), 33, 44, 55);
1173 ASSERT (strcmp (result
, " -inf 33") == 0
1174 || strcmp (result
, " -infinity 33") == 0);
1175 ASSERT (retval
== strlen (result
));
1178 { /* FLAG_ZERO with NaN. */
1180 my_sprintf (result
, "%050Lf %d", NaNl (), 33, 44, 55);
1181 ASSERT (strlen (result
) == 50 + 3
1182 && strisnan (result
, strspn (result
, " "), strlen (result
) - 3, 0)
1183 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1184 ASSERT (retval
== strlen (result
));
1189 my_sprintf (result
, "%.Lf %d", 1234.0L, 33, 44, 55);
1190 ASSERT (strcmp (result
, "1234 33") == 0);
1191 ASSERT (retval
== strlen (result
));
1194 { /* Precision with no rounding. */
1196 my_sprintf (result
, "%.2Lf %d", 999.951L, 33, 44, 55);
1197 ASSERT (strcmp (result
, "999.95 33") == 0);
1198 ASSERT (retval
== strlen (result
));
1201 { /* Precision with rounding. */
1203 my_sprintf (result
, "%.2Lf %d", 999.996L, 33, 44, 55);
1204 ASSERT (strcmp (result
, "1000.00 33") == 0);
1205 ASSERT (retval
== strlen (result
));
1208 /* Test the support of the %F format directive. */
1210 { /* A positive number. */
1212 my_sprintf (result
, "%F %d", 12.75, 33, 44, 55);
1213 ASSERT (strcmp (result
, "12.750000 33") == 0);
1214 ASSERT (retval
== strlen (result
));
1217 { /* A larger positive number. */
1219 my_sprintf (result
, "%F %d", 1234567.0, 33, 44, 55);
1220 ASSERT (strcmp (result
, "1234567.000000 33") == 0);
1221 ASSERT (retval
== strlen (result
));
1224 { /* A negative number. */
1226 my_sprintf (result
, "%F %d", -0.03125, 33, 44, 55);
1227 ASSERT (strcmp (result
, "-0.031250 33") == 0);
1228 ASSERT (retval
== strlen (result
));
1231 { /* Positive zero. */
1233 my_sprintf (result
, "%F %d", 0.0, 33, 44, 55);
1234 ASSERT (strcmp (result
, "0.000000 33") == 0);
1235 ASSERT (retval
== strlen (result
));
1238 { /* Negative zero. */
1240 my_sprintf (result
, "%F %d", minus_zerod
, 33, 44, 55);
1241 if (have_minus_zero ())
1242 ASSERT (strcmp (result
, "-0.000000 33") == 0);
1243 ASSERT (retval
== strlen (result
));
1246 { /* Positive infinity. */
1248 my_sprintf (result
, "%F %d", Infinityd (), 33, 44, 55);
1249 ASSERT (strcmp (result
, "INF 33") == 0
1250 || strcmp (result
, "INFINITY 33") == 0);
1251 ASSERT (retval
== strlen (result
));
1254 { /* Negative infinity. */
1256 my_sprintf (result
, "%F %d", - Infinityd (), 33, 44, 55);
1257 ASSERT (strcmp (result
, "-INF 33") == 0
1258 || strcmp (result
, "-INFINITY 33") == 0);
1259 ASSERT (retval
== strlen (result
));
1264 my_sprintf (result
, "%F %d", NaNd (), 33, 44, 55);
1265 ASSERT (strlen (result
) >= 3 + 3
1266 && strisnan (result
, 0, strlen (result
) - 3, 1)
1267 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1268 ASSERT (retval
== strlen (result
));
1273 my_sprintf (result
, "%015F %d", 1234.0, 33, 44, 55);
1274 ASSERT (strcmp (result
, "00001234.000000 33") == 0);
1275 ASSERT (retval
== strlen (result
));
1278 { /* FLAG_ZERO with infinite number. */
1280 my_sprintf (result
, "%015F %d", - Infinityd (), 33, 44, 55);
1281 ASSERT (strcmp (result
, " -INF 33") == 0
1282 || strcmp (result
, " -INFINITY 33") == 0);
1283 ASSERT (retval
== strlen (result
));
1288 my_sprintf (result
, "%.F %d", 1234.0, 33, 44, 55);
1289 ASSERT (strcmp (result
, "1234 33") == 0);
1290 ASSERT (retval
== strlen (result
));
1293 { /* Precision with no rounding. */
1295 my_sprintf (result
, "%.2F %d", 999.951, 33, 44, 55);
1296 ASSERT (strcmp (result
, "999.95 33") == 0);
1297 ASSERT (retval
== strlen (result
));
1300 { /* Precision with rounding. */
1302 my_sprintf (result
, "%.2F %d", 999.996, 33, 44, 55);
1303 ASSERT (strcmp (result
, "1000.00 33") == 0);
1304 ASSERT (retval
== strlen (result
));
1307 { /* A positive number. */
1309 my_sprintf (result
, "%LF %d", 12.75L, 33, 44, 55);
1310 ASSERT (strcmp (result
, "12.750000 33") == 0);
1311 ASSERT (retval
== strlen (result
));
1314 { /* A larger positive number. */
1316 my_sprintf (result
, "%LF %d", 1234567.0L, 33, 44, 55);
1317 ASSERT (strcmp (result
, "1234567.000000 33") == 0);
1318 ASSERT (retval
== strlen (result
));
1321 { /* A negative number. */
1323 my_sprintf (result
, "%LF %d", -0.03125L, 33, 44, 55);
1324 ASSERT (strcmp (result
, "-0.031250 33") == 0);
1325 ASSERT (retval
== strlen (result
));
1328 { /* Positive zero. */
1330 my_sprintf (result
, "%LF %d", 0.0L, 33, 44, 55);
1331 ASSERT (strcmp (result
, "0.000000 33") == 0);
1332 ASSERT (retval
== strlen (result
));
1335 { /* Negative zero. */
1337 my_sprintf (result
, "%LF %d", minus_zerol
, 33, 44, 55);
1338 if (have_minus_zero ())
1339 ASSERT (strcmp (result
, "-0.000000 33") == 0);
1340 ASSERT (retval
== strlen (result
));
1343 { /* Positive infinity. */
1345 my_sprintf (result
, "%LF %d", Infinityl (), 33, 44, 55);
1346 ASSERT (strcmp (result
, "INF 33") == 0
1347 || strcmp (result
, "INFINITY 33") == 0);
1348 ASSERT (retval
== strlen (result
));
1351 { /* Negative infinity. */
1353 my_sprintf (result
, "%LF %d", - Infinityl (), 33, 44, 55);
1354 ASSERT (strcmp (result
, "-INF 33") == 0
1355 || strcmp (result
, "-INFINITY 33") == 0);
1356 ASSERT (retval
== strlen (result
));
1361 my_sprintf (result
, "%LF %d", NaNl (), 33, 44, 55);
1362 ASSERT (strlen (result
) >= 3 + 3
1363 && strisnan (result
, 0, strlen (result
) - 3, 1)
1364 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1365 ASSERT (retval
== strlen (result
));
1370 my_sprintf (result
, "%015LF %d", 1234.0L, 33, 44, 55);
1371 ASSERT (strcmp (result
, "00001234.000000 33") == 0);
1372 ASSERT (retval
== strlen (result
));
1375 { /* FLAG_ZERO with infinite number. */
1377 my_sprintf (result
, "%015LF %d", - Infinityl (), 33, 44, 55);
1378 ASSERT (strcmp (result
, " -INF 33") == 0
1379 || strcmp (result
, " -INFINITY 33") == 0);
1380 ASSERT (retval
== strlen (result
));
1385 my_sprintf (result
, "%.LF %d", 1234.0L, 33, 44, 55);
1386 ASSERT (strcmp (result
, "1234 33") == 0);
1387 ASSERT (retval
== strlen (result
));
1390 { /* Precision with no rounding. */
1392 my_sprintf (result
, "%.2LF %d", 999.951L, 33, 44, 55);
1393 ASSERT (strcmp (result
, "999.95 33") == 0);
1394 ASSERT (retval
== strlen (result
));
1397 { /* Precision with rounding. */
1399 my_sprintf (result
, "%.2LF %d", 999.996L, 33, 44, 55);
1400 ASSERT (strcmp (result
, "1000.00 33") == 0);
1401 ASSERT (retval
== strlen (result
));
1404 /* Test the support of the %e format directive. */
1406 { /* A positive number. */
1408 my_sprintf (result
, "%e %d", 12.75, 33, 44, 55);
1409 ASSERT (strcmp (result
, "1.275000e+01 33") == 0
1410 || strcmp (result
, "1.275000e+001 33") == 0);
1411 ASSERT (retval
== strlen (result
));
1414 { /* A larger positive number. */
1416 my_sprintf (result
, "%e %d", 1234567.0, 33, 44, 55);
1417 ASSERT (strcmp (result
, "1.234567e+06 33") == 0
1418 || strcmp (result
, "1.234567e+006 33") == 0);
1419 ASSERT (retval
== strlen (result
));
1422 { /* Small and large positive numbers. */
1423 static struct { double value
; const char *string
; } data
[] =
1425 { 1.234321234321234e-37, "1.234321e-37" },
1426 { 1.234321234321234e-36, "1.234321e-36" },
1427 { 1.234321234321234e-35, "1.234321e-35" },
1428 { 1.234321234321234e-34, "1.234321e-34" },
1429 { 1.234321234321234e-33, "1.234321e-33" },
1430 { 1.234321234321234e-32, "1.234321e-32" },
1431 { 1.234321234321234e-31, "1.234321e-31" },
1432 { 1.234321234321234e-30, "1.234321e-30" },
1433 { 1.234321234321234e-29, "1.234321e-29" },
1434 { 1.234321234321234e-28, "1.234321e-28" },
1435 { 1.234321234321234e-27, "1.234321e-27" },
1436 { 1.234321234321234e-26, "1.234321e-26" },
1437 { 1.234321234321234e-25, "1.234321e-25" },
1438 { 1.234321234321234e-24, "1.234321e-24" },
1439 { 1.234321234321234e-23, "1.234321e-23" },
1440 { 1.234321234321234e-22, "1.234321e-22" },
1441 { 1.234321234321234e-21, "1.234321e-21" },
1442 { 1.234321234321234e-20, "1.234321e-20" },
1443 { 1.234321234321234e-19, "1.234321e-19" },
1444 { 1.234321234321234e-18, "1.234321e-18" },
1445 { 1.234321234321234e-17, "1.234321e-17" },
1446 { 1.234321234321234e-16, "1.234321e-16" },
1447 { 1.234321234321234e-15, "1.234321e-15" },
1448 { 1.234321234321234e-14, "1.234321e-14" },
1449 { 1.234321234321234e-13, "1.234321e-13" },
1450 { 1.234321234321234e-12, "1.234321e-12" },
1451 { 1.234321234321234e-11, "1.234321e-11" },
1452 { 1.234321234321234e-10, "1.234321e-10" },
1453 { 1.234321234321234e-9, "1.234321e-09" },
1454 { 1.234321234321234e-8, "1.234321e-08" },
1455 { 1.234321234321234e-7, "1.234321e-07" },
1456 { 1.234321234321234e-6, "1.234321e-06" },
1457 { 1.234321234321234e-5, "1.234321e-05" },
1458 { 1.234321234321234e-4, "1.234321e-04" },
1459 { 1.234321234321234e-3, "1.234321e-03" },
1460 { 1.234321234321234e-2, "1.234321e-02" },
1461 { 1.234321234321234e-1, "1.234321e-01" },
1462 { 1.234321234321234, "1.234321e+00" },
1463 { 1.234321234321234e1
, "1.234321e+01" },
1464 { 1.234321234321234e2
, "1.234321e+02" },
1465 { 1.234321234321234e3
, "1.234321e+03" },
1466 { 1.234321234321234e4
, "1.234321e+04" },
1467 { 1.234321234321234e5
, "1.234321e+05" },
1468 { 1.234321234321234e6
, "1.234321e+06" },
1469 { 1.234321234321234e7
, "1.234321e+07" },
1470 { 1.234321234321234e8
, "1.234321e+08" },
1471 { 1.234321234321234e9
, "1.234321e+09" },
1472 { 1.234321234321234e10
, "1.234321e+10" },
1473 { 1.234321234321234e11
, "1.234321e+11" },
1474 { 1.234321234321234e12
, "1.234321e+12" },
1475 { 1.234321234321234e13
, "1.234321e+13" },
1476 { 1.234321234321234e14
, "1.234321e+14" },
1477 { 1.234321234321234e15
, "1.234321e+15" },
1478 { 1.234321234321234e16
, "1.234321e+16" },
1479 { 1.234321234321234e17
, "1.234321e+17" },
1480 { 1.234321234321234e18
, "1.234321e+18" },
1481 { 1.234321234321234e19
, "1.234321e+19" },
1482 { 1.234321234321234e20
, "1.234321e+20" },
1483 { 1.234321234321234e21
, "1.234321e+21" },
1484 { 1.234321234321234e22
, "1.234321e+22" },
1485 { 1.234321234321234e23
, "1.234321e+23" },
1486 { 1.234321234321234e24
, "1.234321e+24" },
1487 { 1.234321234321234e25
, "1.234321e+25" },
1488 { 1.234321234321234e26
, "1.234321e+26" },
1489 { 1.234321234321234e27
, "1.234321e+27" },
1490 { 1.234321234321234e28
, "1.234321e+28" },
1491 { 1.234321234321234e29
, "1.234321e+29" },
1492 { 1.234321234321234e30
, "1.234321e+30" },
1493 { 1.234321234321234e31
, "1.234321e+31" },
1494 { 1.234321234321234e32
, "1.234321e+32" },
1495 { 1.234321234321234e33
, "1.234321e+33" },
1496 { 1.234321234321234e34
, "1.234321e+34" },
1497 { 1.234321234321234e35
, "1.234321e+35" },
1498 { 1.234321234321234e36
, "1.234321e+36" }
1501 for (k
= 0; k
< SIZEOF (data
); k
++)
1504 my_sprintf (result
, "%e", data
[k
].value
);
1505 const char *expected
= data
[k
].string
;
1506 ASSERT (strcmp (result
, expected
) == 0
1507 /* Some implementations produce exponents with 3 digits. */
1508 || (strlen (result
) == strlen (expected
) + 1
1509 && memcmp (result
, expected
, strlen (expected
) - 2) == 0
1510 && result
[strlen (expected
) - 2] == '0'
1511 && strcmp (result
+ strlen (expected
) - 1,
1512 expected
+ strlen (expected
) - 2)
1514 ASSERT (retval
== strlen (result
));
1518 { /* A negative number. */
1520 my_sprintf (result
, "%e %d", -0.03125, 33, 44, 55);
1521 ASSERT (strcmp (result
, "-3.125000e-02 33") == 0
1522 || strcmp (result
, "-3.125000e-002 33") == 0);
1523 ASSERT (retval
== strlen (result
));
1526 { /* Positive zero. */
1528 my_sprintf (result
, "%e %d", 0.0, 33, 44, 55);
1529 ASSERT (strcmp (result
, "0.000000e+00 33") == 0
1530 || strcmp (result
, "0.000000e+000 33") == 0);
1531 ASSERT (retval
== strlen (result
));
1534 { /* Negative zero. */
1536 my_sprintf (result
, "%e %d", minus_zerod
, 33, 44, 55);
1537 if (have_minus_zero ())
1538 ASSERT (strcmp (result
, "-0.000000e+00 33") == 0
1539 || strcmp (result
, "-0.000000e+000 33") == 0);
1540 ASSERT (retval
== strlen (result
));
1543 { /* Positive infinity. */
1545 my_sprintf (result
, "%e %d", Infinityd (), 33, 44, 55);
1546 ASSERT (strcmp (result
, "inf 33") == 0
1547 || strcmp (result
, "infinity 33") == 0);
1548 ASSERT (retval
== strlen (result
));
1551 { /* Negative infinity. */
1553 my_sprintf (result
, "%e %d", - Infinityd (), 33, 44, 55);
1554 ASSERT (strcmp (result
, "-inf 33") == 0
1555 || strcmp (result
, "-infinity 33") == 0);
1556 ASSERT (retval
== strlen (result
));
1561 my_sprintf (result
, "%e %d", NaNd (), 33, 44, 55);
1562 ASSERT (strlen (result
) >= 3 + 3
1563 && strisnan (result
, 0, strlen (result
) - 3, 0)
1564 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1565 ASSERT (retval
== strlen (result
));
1570 my_sprintf (result
, "%15e %d", 1.75, 33, 44, 55);
1571 ASSERT (strcmp (result
, " 1.750000e+00 33") == 0
1572 || strcmp (result
, " 1.750000e+000 33") == 0);
1573 ASSERT (retval
== strlen (result
));
1578 my_sprintf (result
, "%-15e %d", 1.75, 33, 44, 55);
1579 ASSERT (strcmp (result
, "1.750000e+00 33") == 0
1580 || strcmp (result
, "1.750000e+000 33") == 0);
1581 ASSERT (retval
== strlen (result
));
1584 { /* FLAG_SHOWSIGN. */
1586 my_sprintf (result
, "%+e %d", 1.75, 33, 44, 55);
1587 ASSERT (strcmp (result
, "+1.750000e+00 33") == 0
1588 || strcmp (result
, "+1.750000e+000 33") == 0);
1589 ASSERT (retval
== strlen (result
));
1594 my_sprintf (result
, "% e %d", 1.75, 33, 44, 55);
1595 ASSERT (strcmp (result
, " 1.750000e+00 33") == 0
1596 || strcmp (result
, " 1.750000e+000 33") == 0);
1597 ASSERT (retval
== strlen (result
));
1602 my_sprintf (result
, "%#e %d", 1.75, 33, 44, 55);
1603 ASSERT (strcmp (result
, "1.750000e+00 33") == 0
1604 || strcmp (result
, "1.750000e+000 33") == 0);
1605 ASSERT (retval
== strlen (result
));
1610 my_sprintf (result
, "%#.e %d", 1.75, 33, 44, 55);
1611 ASSERT (strcmp (result
, "2.e+00 33") == 0
1612 || strcmp (result
, "2.e+000 33") == 0);
1613 ASSERT (retval
== strlen (result
));
1618 my_sprintf (result
, "%#.e %d", 9.75, 33, 44, 55);
1619 ASSERT (strcmp (result
, "1.e+01 33") == 0
1620 || strcmp (result
, "1.e+001 33") == 0);
1621 ASSERT (retval
== strlen (result
));
1624 { /* FLAG_ZERO with finite number. */
1626 my_sprintf (result
, "%015e %d", 1234.0, 33, 44, 55);
1627 ASSERT (strcmp (result
, "0001.234000e+03 33") == 0
1628 || strcmp (result
, "001.234000e+003 33") == 0);
1629 ASSERT (retval
== strlen (result
));
1632 { /* FLAG_ZERO with infinite number. */
1634 my_sprintf (result
, "%015e %d", - Infinityd (), 33, 44, 55);
1635 ASSERT (strcmp (result
, " -inf 33") == 0
1636 || strcmp (result
, " -infinity 33") == 0);
1637 ASSERT (retval
== strlen (result
));
1640 { /* FLAG_ZERO with NaN. */
1642 my_sprintf (result
, "%050e %d", NaNd (), 33, 44, 55);
1643 ASSERT (strlen (result
) == 50 + 3
1644 && strisnan (result
, strspn (result
, " "), strlen (result
) - 3, 0)
1645 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1646 ASSERT (retval
== strlen (result
));
1651 my_sprintf (result
, "%.e %d", 1234.0, 33, 44, 55);
1652 ASSERT (strcmp (result
, "1e+03 33") == 0
1653 || strcmp (result
, "1e+003 33") == 0);
1654 ASSERT (retval
== strlen (result
));
1657 { /* Precision with no rounding. */
1659 my_sprintf (result
, "%.4e %d", 999.951, 33, 44, 55);
1660 ASSERT (strcmp (result
, "9.9995e+02 33") == 0
1661 || strcmp (result
, "9.9995e+002 33") == 0);
1662 ASSERT (retval
== strlen (result
));
1665 { /* Precision with rounding. */
1667 my_sprintf (result
, "%.4e %d", 999.996, 33, 44, 55);
1668 ASSERT (strcmp (result
, "1.0000e+03 33") == 0
1669 || strcmp (result
, "1.0000e+003 33") == 0);
1670 ASSERT (retval
== strlen (result
));
1673 { /* A positive number. */
1675 my_sprintf (result
, "%Le %d", 12.75L, 33, 44, 55);
1676 ASSERT (strcmp (result
, "1.275000e+01 33") == 0
1677 || strcmp (result
, "1.275000e+001 33") == 0);
1678 ASSERT (retval
== strlen (result
));
1681 { /* A larger positive number. */
1683 my_sprintf (result
, "%Le %d", 1234567.0L, 33, 44, 55);
1684 ASSERT (strcmp (result
, "1.234567e+06 33") == 0
1685 || strcmp (result
, "1.234567e+006 33") == 0);
1686 ASSERT (retval
== strlen (result
));
1689 { /* Small and large positive numbers. */
1690 static struct { long double value
; const char *string
; } data
[] =
1692 { 1.234321234321234e-37L, "1.234321e-37" },
1693 { 1.234321234321234e-36L, "1.234321e-36" },
1694 { 1.234321234321234e-35L, "1.234321e-35" },
1695 { 1.234321234321234e-34L, "1.234321e-34" },
1696 { 1.234321234321234e-33L, "1.234321e-33" },
1697 { 1.234321234321234e-32L, "1.234321e-32" },
1698 { 1.234321234321234e-31L, "1.234321e-31" },
1699 { 1.234321234321234e-30L, "1.234321e-30" },
1700 { 1.234321234321234e-29L, "1.234321e-29" },
1701 { 1.234321234321234e-28L, "1.234321e-28" },
1702 { 1.234321234321234e-27L, "1.234321e-27" },
1703 { 1.234321234321234e-26L, "1.234321e-26" },
1704 { 1.234321234321234e-25L, "1.234321e-25" },
1705 { 1.234321234321234e-24L, "1.234321e-24" },
1706 { 1.234321234321234e-23L, "1.234321e-23" },
1707 { 1.234321234321234e-22L, "1.234321e-22" },
1708 { 1.234321234321234e-21L, "1.234321e-21" },
1709 { 1.234321234321234e-20L, "1.234321e-20" },
1710 { 1.234321234321234e-19L, "1.234321e-19" },
1711 { 1.234321234321234e-18L, "1.234321e-18" },
1712 { 1.234321234321234e-17L, "1.234321e-17" },
1713 { 1.234321234321234e-16L, "1.234321e-16" },
1714 { 1.234321234321234e-15L, "1.234321e-15" },
1715 { 1.234321234321234e-14L, "1.234321e-14" },
1716 { 1.234321234321234e-13L, "1.234321e-13" },
1717 { 1.234321234321234e-12L, "1.234321e-12" },
1718 { 1.234321234321234e-11L, "1.234321e-11" },
1719 { 1.234321234321234e-10L, "1.234321e-10" },
1720 { 1.234321234321234e-9L, "1.234321e-09" },
1721 { 1.234321234321234e-8L, "1.234321e-08" },
1722 { 1.234321234321234e-7L, "1.234321e-07" },
1723 { 1.234321234321234e-6L, "1.234321e-06" },
1724 { 1.234321234321234e-5L, "1.234321e-05" },
1725 { 1.234321234321234e-4L, "1.234321e-04" },
1726 { 1.234321234321234e-3L, "1.234321e-03" },
1727 { 1.234321234321234e-2L, "1.234321e-02" },
1728 { 1.234321234321234e-1L, "1.234321e-01" },
1729 { 1.234321234321234L, "1.234321e+00" },
1730 { 1.234321234321234e1L
, "1.234321e+01" },
1731 { 1.234321234321234e2L
, "1.234321e+02" },
1732 { 1.234321234321234e3L
, "1.234321e+03" },
1733 { 1.234321234321234e4L
, "1.234321e+04" },
1734 { 1.234321234321234e5L
, "1.234321e+05" },
1735 { 1.234321234321234e6L
, "1.234321e+06" },
1736 { 1.234321234321234e7L
, "1.234321e+07" },
1737 { 1.234321234321234e8L
, "1.234321e+08" },
1738 { 1.234321234321234e9L
, "1.234321e+09" },
1739 { 1.234321234321234e10L
, "1.234321e+10" },
1740 { 1.234321234321234e11L
, "1.234321e+11" },
1741 { 1.234321234321234e12L
, "1.234321e+12" },
1742 { 1.234321234321234e13L
, "1.234321e+13" },
1743 { 1.234321234321234e14L
, "1.234321e+14" },
1744 { 1.234321234321234e15L
, "1.234321e+15" },
1745 { 1.234321234321234e16L
, "1.234321e+16" },
1746 { 1.234321234321234e17L
, "1.234321e+17" },
1747 { 1.234321234321234e18L
, "1.234321e+18" },
1748 { 1.234321234321234e19L
, "1.234321e+19" },
1749 { 1.234321234321234e20L
, "1.234321e+20" },
1750 { 1.234321234321234e21L
, "1.234321e+21" },
1751 { 1.234321234321234e22L
, "1.234321e+22" },
1752 { 1.234321234321234e23L
, "1.234321e+23" },
1753 { 1.234321234321234e24L
, "1.234321e+24" },
1754 { 1.234321234321234e25L
, "1.234321e+25" },
1755 { 1.234321234321234e26L
, "1.234321e+26" },
1756 { 1.234321234321234e27L
, "1.234321e+27" },
1757 { 1.234321234321234e28L
, "1.234321e+28" },
1758 { 1.234321234321234e29L
, "1.234321e+29" },
1759 { 1.234321234321234e30L
, "1.234321e+30" },
1760 { 1.234321234321234e31L
, "1.234321e+31" },
1761 { 1.234321234321234e32L
, "1.234321e+32" },
1762 { 1.234321234321234e33L
, "1.234321e+33" },
1763 { 1.234321234321234e34L
, "1.234321e+34" },
1764 { 1.234321234321234e35L
, "1.234321e+35" },
1765 { 1.234321234321234e36L
, "1.234321e+36" }
1768 for (k
= 0; k
< SIZEOF (data
); k
++)
1771 my_sprintf (result
, "%Le", data
[k
].value
);
1772 const char *expected
= data
[k
].string
;
1773 ASSERT (strcmp (result
, expected
) == 0
1774 /* Some implementations produce exponents with 3 digits. */
1775 || (strlen (result
) == strlen (expected
) + 1
1776 && memcmp (result
, expected
, strlen (expected
) - 2) == 0
1777 && result
[strlen (expected
) - 2] == '0'
1778 && strcmp (result
+ strlen (expected
) - 1,
1779 expected
+ strlen (expected
) - 2)
1781 ASSERT (retval
== strlen (result
));
1785 { /* A negative number. */
1787 my_sprintf (result
, "%Le %d", -0.03125L, 33, 44, 55);
1788 ASSERT (strcmp (result
, "-3.125000e-02 33") == 0
1789 || strcmp (result
, "-3.125000e-002 33") == 0);
1790 ASSERT (retval
== strlen (result
));
1793 { /* Positive zero. */
1795 my_sprintf (result
, "%Le %d", 0.0L, 33, 44, 55);
1796 ASSERT (strcmp (result
, "0.000000e+00 33") == 0
1797 || strcmp (result
, "0.000000e+000 33") == 0);
1798 ASSERT (retval
== strlen (result
));
1801 { /* Negative zero. */
1803 my_sprintf (result
, "%Le %d", minus_zerol
, 33, 44, 55);
1804 if (have_minus_zero ())
1805 ASSERT (strcmp (result
, "-0.000000e+00 33") == 0
1806 || strcmp (result
, "-0.000000e+000 33") == 0);
1807 ASSERT (retval
== strlen (result
));
1810 { /* Positive infinity. */
1812 my_sprintf (result
, "%Le %d", Infinityl (), 33, 44, 55);
1813 ASSERT (strcmp (result
, "inf 33") == 0
1814 || strcmp (result
, "infinity 33") == 0);
1815 ASSERT (retval
== strlen (result
));
1818 { /* Negative infinity. */
1820 my_sprintf (result
, "%Le %d", - Infinityl (), 33, 44, 55);
1821 ASSERT (strcmp (result
, "-inf 33") == 0
1822 || strcmp (result
, "-infinity 33") == 0);
1823 ASSERT (retval
== strlen (result
));
1828 my_sprintf (result
, "%Le %d", NaNl (), 33, 44, 55);
1829 ASSERT (strlen (result
) >= 3 + 3
1830 && strisnan (result
, 0, strlen (result
) - 3, 0)
1831 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1832 ASSERT (retval
== strlen (result
));
1834 #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
1836 static union { unsigned int word
[4]; long double value
; } x
=
1837 { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
1839 my_sprintf (result
, "%Le %d", x
.value
, 33, 44, 55);
1840 ASSERT (strlen (result
) >= 3 + 3
1841 && strisnan (result
, 0, strlen (result
) - 3, 0)
1842 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1843 ASSERT (retval
== strlen (result
));
1846 /* Signalling NaN. */
1847 static union { unsigned int word
[4]; long double value
; } x
=
1848 { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
1850 my_sprintf (result
, "%Le %d", x
.value
, 33, 44, 55);
1851 ASSERT (strlen (result
) >= 3 + 3
1852 && strisnan (result
, 0, strlen (result
) - 3, 0)
1853 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1854 ASSERT (retval
== strlen (result
));
1856 /* sprintf should print something for noncanonical values. */
1858 static union { unsigned int word
[4]; long double value
; } x
=
1859 { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
1861 my_sprintf (result
, "%Le %d", x
.value
, 33, 44, 55);
1862 ASSERT (retval
== strlen (result
));
1863 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1865 { /* Pseudo-Infinity. */
1866 static union { unsigned int word
[4]; long double value
; } x
=
1867 { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
1869 my_sprintf (result
, "%Le %d", x
.value
, 33, 44, 55);
1870 ASSERT (retval
== strlen (result
));
1871 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1873 { /* Pseudo-Zero. */
1874 static union { unsigned int word
[4]; long double value
; } x
=
1875 { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
1877 my_sprintf (result
, "%Le %d", x
.value
, 33, 44, 55);
1878 ASSERT (retval
== strlen (result
));
1879 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1881 { /* Unnormalized number. */
1882 static union { unsigned int word
[4]; long double value
; } x
=
1883 { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
1885 my_sprintf (result
, "%Le %d", x
.value
, 33, 44, 55);
1886 ASSERT (retval
== strlen (result
));
1887 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1889 { /* Pseudo-Denormal. */
1890 static union { unsigned int word
[4]; long double value
; } x
=
1891 { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
1893 my_sprintf (result
, "%Le %d", x
.value
, 33, 44, 55);
1894 ASSERT (retval
== strlen (result
));
1895 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
1901 my_sprintf (result
, "%15Le %d", 1.75L, 33, 44, 55);
1902 ASSERT (strcmp (result
, " 1.750000e+00 33") == 0
1903 || strcmp (result
, " 1.750000e+000 33") == 0);
1904 ASSERT (retval
== strlen (result
));
1909 my_sprintf (result
, "%-15Le %d", 1.75L, 33, 44, 55);
1910 ASSERT (strcmp (result
, "1.750000e+00 33") == 0
1911 || strcmp (result
, "1.750000e+000 33") == 0);
1912 ASSERT (retval
== strlen (result
));
1915 { /* FLAG_SHOWSIGN. */
1917 my_sprintf (result
, "%+Le %d", 1.75L, 33, 44, 55);
1918 ASSERT (strcmp (result
, "+1.750000e+00 33") == 0
1919 || strcmp (result
, "+1.750000e+000 33") == 0);
1920 ASSERT (retval
== strlen (result
));
1925 my_sprintf (result
, "% Le %d", 1.75L, 33, 44, 55);
1926 ASSERT (strcmp (result
, " 1.750000e+00 33") == 0
1927 || strcmp (result
, " 1.750000e+000 33") == 0);
1928 ASSERT (retval
== strlen (result
));
1933 my_sprintf (result
, "%#Le %d", 1.75L, 33, 44, 55);
1934 ASSERT (strcmp (result
, "1.750000e+00 33") == 0
1935 || strcmp (result
, "1.750000e+000 33") == 0);
1936 ASSERT (retval
== strlen (result
));
1941 my_sprintf (result
, "%#.Le %d", 1.75L, 33, 44, 55);
1942 ASSERT (strcmp (result
, "2.e+00 33") == 0
1943 || strcmp (result
, "2.e+000 33") == 0);
1944 ASSERT (retval
== strlen (result
));
1949 my_sprintf (result
, "%#.Le %d", 9.75L, 33, 44, 55);
1950 ASSERT (strcmp (result
, "1.e+01 33") == 0
1951 || strcmp (result
, "1.e+001 33") == 0);
1952 ASSERT (retval
== strlen (result
));
1955 { /* FLAG_ZERO with finite number. */
1957 my_sprintf (result
, "%015Le %d", 1234.0L, 33, 44, 55);
1958 ASSERT (strcmp (result
, "0001.234000e+03 33") == 0
1959 || strcmp (result
, "001.234000e+003 33") == 0);
1960 ASSERT (retval
== strlen (result
));
1963 { /* FLAG_ZERO with infinite number. */
1965 my_sprintf (result
, "%015Le %d", - Infinityl (), 33, 44, 55);
1966 ASSERT (strcmp (result
, " -inf 33") == 0
1967 || strcmp (result
, " -infinity 33") == 0);
1968 ASSERT (retval
== strlen (result
));
1971 { /* FLAG_ZERO with NaN. */
1973 my_sprintf (result
, "%050Le %d", NaNl (), 33, 44, 55);
1974 ASSERT (strlen (result
) == 50 + 3
1975 && strisnan (result
, strspn (result
, " "), strlen (result
) - 3, 0)
1976 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
1977 ASSERT (retval
== strlen (result
));
1982 my_sprintf (result
, "%.Le %d", 1234.0L, 33, 44, 55);
1983 ASSERT (strcmp (result
, "1e+03 33") == 0
1984 || strcmp (result
, "1e+003 33") == 0);
1985 ASSERT (retval
== strlen (result
));
1988 { /* Precision with no rounding. */
1990 my_sprintf (result
, "%.4Le %d", 999.951L, 33, 44, 55);
1991 ASSERT (strcmp (result
, "9.9995e+02 33") == 0
1992 || strcmp (result
, "9.9995e+002 33") == 0);
1993 ASSERT (retval
== strlen (result
));
1996 { /* Precision with rounding. */
1998 my_sprintf (result
, "%.4Le %d", 999.996L, 33, 44, 55);
1999 ASSERT (strcmp (result
, "1.0000e+03 33") == 0
2000 || strcmp (result
, "1.0000e+003 33") == 0);
2001 ASSERT (retval
== strlen (result
));
2004 /* Test the support of the %g format directive. */
2006 { /* A positive number. */
2008 my_sprintf (result
, "%g %d", 12.75, 33, 44, 55);
2009 ASSERT (strcmp (result
, "12.75 33") == 0);
2010 ASSERT (retval
== strlen (result
));
2013 { /* A larger positive number. */
2015 my_sprintf (result
, "%g %d", 1234567.0, 33, 44, 55);
2016 ASSERT (strcmp (result
, "1.23457e+06 33") == 0
2017 || strcmp (result
, "1.23457e+006 33") == 0);
2018 ASSERT (retval
== strlen (result
));
2021 { /* Small and large positive numbers. */
2022 static struct { double value
; const char *string
; } data
[] =
2024 { 1.234321234321234e-37, "1.23432e-37" },
2025 { 1.234321234321234e-36, "1.23432e-36" },
2026 { 1.234321234321234e-35, "1.23432e-35" },
2027 { 1.234321234321234e-34, "1.23432e-34" },
2028 { 1.234321234321234e-33, "1.23432e-33" },
2029 { 1.234321234321234e-32, "1.23432e-32" },
2030 { 1.234321234321234e-31, "1.23432e-31" },
2031 { 1.234321234321234e-30, "1.23432e-30" },
2032 { 1.234321234321234e-29, "1.23432e-29" },
2033 { 1.234321234321234e-28, "1.23432e-28" },
2034 { 1.234321234321234e-27, "1.23432e-27" },
2035 { 1.234321234321234e-26, "1.23432e-26" },
2036 { 1.234321234321234e-25, "1.23432e-25" },
2037 { 1.234321234321234e-24, "1.23432e-24" },
2038 { 1.234321234321234e-23, "1.23432e-23" },
2039 { 1.234321234321234e-22, "1.23432e-22" },
2040 { 1.234321234321234e-21, "1.23432e-21" },
2041 { 1.234321234321234e-20, "1.23432e-20" },
2042 { 1.234321234321234e-19, "1.23432e-19" },
2043 { 1.234321234321234e-18, "1.23432e-18" },
2044 { 1.234321234321234e-17, "1.23432e-17" },
2045 { 1.234321234321234e-16, "1.23432e-16" },
2046 { 1.234321234321234e-15, "1.23432e-15" },
2047 { 1.234321234321234e-14, "1.23432e-14" },
2048 { 1.234321234321234e-13, "1.23432e-13" },
2049 { 1.234321234321234e-12, "1.23432e-12" },
2050 { 1.234321234321234e-11, "1.23432e-11" },
2051 { 1.234321234321234e-10, "1.23432e-10" },
2052 { 1.234321234321234e-9, "1.23432e-09" },
2053 { 1.234321234321234e-8, "1.23432e-08" },
2054 { 1.234321234321234e-7, "1.23432e-07" },
2055 { 1.234321234321234e-6, "1.23432e-06" },
2056 { 1.234321234321234e-5, "1.23432e-05" },
2057 { 1.234321234321234e-4, "0.000123432" },
2058 { 1.234321234321234e-3, "0.00123432" },
2059 { 1.234321234321234e-2, "0.0123432" },
2060 { 1.234321234321234e-1, "0.123432" },
2061 { 1.234321234321234, "1.23432" },
2062 { 1.234321234321234e1
, "12.3432" },
2063 { 1.234321234321234e2
, "123.432" },
2064 { 1.234321234321234e3
, "1234.32" },
2065 { 1.234321234321234e4
, "12343.2" },
2066 { 1.234321234321234e5
, "123432" },
2067 { 1.234321234321234e6
, "1.23432e+06" },
2068 { 1.234321234321234e7
, "1.23432e+07" },
2069 { 1.234321234321234e8
, "1.23432e+08" },
2070 { 1.234321234321234e9
, "1.23432e+09" },
2071 { 1.234321234321234e10
, "1.23432e+10" },
2072 { 1.234321234321234e11
, "1.23432e+11" },
2073 { 1.234321234321234e12
, "1.23432e+12" },
2074 { 1.234321234321234e13
, "1.23432e+13" },
2075 { 1.234321234321234e14
, "1.23432e+14" },
2076 { 1.234321234321234e15
, "1.23432e+15" },
2077 { 1.234321234321234e16
, "1.23432e+16" },
2078 { 1.234321234321234e17
, "1.23432e+17" },
2079 { 1.234321234321234e18
, "1.23432e+18" },
2080 { 1.234321234321234e19
, "1.23432e+19" },
2081 { 1.234321234321234e20
, "1.23432e+20" },
2082 { 1.234321234321234e21
, "1.23432e+21" },
2083 { 1.234321234321234e22
, "1.23432e+22" },
2084 { 1.234321234321234e23
, "1.23432e+23" },
2085 { 1.234321234321234e24
, "1.23432e+24" },
2086 { 1.234321234321234e25
, "1.23432e+25" },
2087 { 1.234321234321234e26
, "1.23432e+26" },
2088 { 1.234321234321234e27
, "1.23432e+27" },
2089 { 1.234321234321234e28
, "1.23432e+28" },
2090 { 1.234321234321234e29
, "1.23432e+29" },
2091 { 1.234321234321234e30
, "1.23432e+30" },
2092 { 1.234321234321234e31
, "1.23432e+31" },
2093 { 1.234321234321234e32
, "1.23432e+32" },
2094 { 1.234321234321234e33
, "1.23432e+33" },
2095 { 1.234321234321234e34
, "1.23432e+34" },
2096 { 1.234321234321234e35
, "1.23432e+35" },
2097 { 1.234321234321234e36
, "1.23432e+36" }
2100 for (k
= 0; k
< SIZEOF (data
); k
++)
2103 my_sprintf (result
, "%g", data
[k
].value
);
2104 const char *expected
= data
[k
].string
;
2105 ASSERT (strcmp (result
, expected
) == 0
2106 /* Some implementations produce exponents with 3 digits. */
2107 || (expected
[strlen (expected
) - 4] == 'e'
2108 && strlen (result
) == strlen (expected
) + 1
2109 && memcmp (result
, expected
, strlen (expected
) - 2) == 0
2110 && result
[strlen (expected
) - 2] == '0'
2111 && strcmp (result
+ strlen (expected
) - 1,
2112 expected
+ strlen (expected
) - 2)
2114 ASSERT (retval
== strlen (result
));
2118 { /* A negative number. */
2120 my_sprintf (result
, "%g %d", -0.03125, 33, 44, 55);
2121 ASSERT (strcmp (result
, "-0.03125 33") == 0);
2122 ASSERT (retval
== strlen (result
));
2125 { /* Positive zero. */
2127 my_sprintf (result
, "%g %d", 0.0, 33, 44, 55);
2128 ASSERT (strcmp (result
, "0 33") == 0);
2129 ASSERT (retval
== strlen (result
));
2132 { /* Negative zero. */
2134 my_sprintf (result
, "%g %d", minus_zerod
, 33, 44, 55);
2135 if (have_minus_zero ())
2136 ASSERT (strcmp (result
, "-0 33") == 0);
2137 ASSERT (retval
== strlen (result
));
2140 { /* Positive infinity. */
2142 my_sprintf (result
, "%g %d", Infinityd (), 33, 44, 55);
2143 ASSERT (strcmp (result
, "inf 33") == 0
2144 || strcmp (result
, "infinity 33") == 0);
2145 ASSERT (retval
== strlen (result
));
2148 { /* Negative infinity. */
2150 my_sprintf (result
, "%g %d", - Infinityd (), 33, 44, 55);
2151 ASSERT (strcmp (result
, "-inf 33") == 0
2152 || strcmp (result
, "-infinity 33") == 0);
2153 ASSERT (retval
== strlen (result
));
2158 my_sprintf (result
, "%g %d", NaNd (), 33, 44, 55);
2159 ASSERT (strlen (result
) >= 3 + 3
2160 && strisnan (result
, 0, strlen (result
) - 3, 0)
2161 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
2162 ASSERT (retval
== strlen (result
));
2167 my_sprintf (result
, "%10g %d", 1.75, 33, 44, 55);
2168 ASSERT (strcmp (result
, " 1.75 33") == 0);
2169 ASSERT (retval
== strlen (result
));
2174 my_sprintf (result
, "%-10g %d", 1.75, 33, 44, 55);
2175 ASSERT (strcmp (result
, "1.75 33") == 0);
2176 ASSERT (retval
== strlen (result
));
2179 { /* FLAG_SHOWSIGN. */
2181 my_sprintf (result
, "%+g %d", 1.75, 33, 44, 55);
2182 ASSERT (strcmp (result
, "+1.75 33") == 0);
2183 ASSERT (retval
== strlen (result
));
2188 my_sprintf (result
, "% g %d", 1.75, 33, 44, 55);
2189 ASSERT (strcmp (result
, " 1.75 33") == 0);
2190 ASSERT (retval
== strlen (result
));
2195 my_sprintf (result
, "%#g %d", 1.75, 33, 44, 55);
2196 ASSERT (strcmp (result
, "1.75000 33") == 0);
2197 ASSERT (retval
== strlen (result
));
2202 my_sprintf (result
, "%#.g %d", 1.75, 33, 44, 55);
2203 ASSERT (strcmp (result
, "2. 33") == 0);
2204 ASSERT (retval
== strlen (result
));
2209 my_sprintf (result
, "%#.g %d", 9.75, 33, 44, 55);
2210 ASSERT (strcmp (result
, "1.e+01 33") == 0
2211 || strcmp (result
, "1.e+001 33") == 0);
2212 ASSERT (retval
== strlen (result
));
2215 { /* FLAG_ZERO with finite number. */
2217 my_sprintf (result
, "%010g %d", 1234.0, 33, 44, 55);
2218 ASSERT (strcmp (result
, "0000001234 33") == 0);
2219 ASSERT (retval
== strlen (result
));
2222 { /* FLAG_ZERO with infinite number. */
2224 my_sprintf (result
, "%015g %d", - Infinityd (), 33, 44, 55);
2225 ASSERT (strcmp (result
, " -inf 33") == 0
2226 || strcmp (result
, " -infinity 33") == 0);
2227 ASSERT (retval
== strlen (result
));
2230 { /* FLAG_ZERO with NaN. */
2232 my_sprintf (result
, "%050g %d", NaNd (), 33, 44, 55);
2233 ASSERT (strlen (result
) == 50 + 3
2234 && strisnan (result
, strspn (result
, " "), strlen (result
) - 3, 0)
2235 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
2236 ASSERT (retval
== strlen (result
));
2241 my_sprintf (result
, "%.g %d", 1234.0, 33, 44, 55);
2242 ASSERT (strcmp (result
, "1e+03 33") == 0
2243 || strcmp (result
, "1e+003 33") == 0);
2244 ASSERT (retval
== strlen (result
));
2247 { /* Precision with no rounding. */
2249 my_sprintf (result
, "%.5g %d", 999.951, 33, 44, 55);
2250 ASSERT (strcmp (result
, "999.95 33") == 0);
2251 ASSERT (retval
== strlen (result
));
2254 { /* Precision with rounding. */
2256 my_sprintf (result
, "%.5g %d", 999.996, 33, 44, 55);
2257 ASSERT (strcmp (result
, "1000 33") == 0);
2258 ASSERT (retval
== strlen (result
));
2261 { /* A positive number. */
2263 my_sprintf (result
, "%Lg %d", 12.75L, 33, 44, 55);
2264 ASSERT (strcmp (result
, "12.75 33") == 0);
2265 ASSERT (retval
== strlen (result
));
2268 { /* A larger positive number. */
2270 my_sprintf (result
, "%Lg %d", 1234567.0L, 33, 44, 55);
2271 ASSERT (strcmp (result
, "1.23457e+06 33") == 0
2272 || strcmp (result
, "1.23457e+006 33") == 0);
2273 ASSERT (retval
== strlen (result
));
2276 { /* Small and large positive numbers. */
2277 static struct { long double value
; const char *string
; } data
[] =
2279 { 1.234321234321234e-37L, "1.23432e-37" },
2280 { 1.234321234321234e-36L, "1.23432e-36" },
2281 { 1.234321234321234e-35L, "1.23432e-35" },
2282 { 1.234321234321234e-34L, "1.23432e-34" },
2283 { 1.234321234321234e-33L, "1.23432e-33" },
2284 { 1.234321234321234e-32L, "1.23432e-32" },
2285 { 1.234321234321234e-31L, "1.23432e-31" },
2286 { 1.234321234321234e-30L, "1.23432e-30" },
2287 { 1.234321234321234e-29L, "1.23432e-29" },
2288 { 1.234321234321234e-28L, "1.23432e-28" },
2289 { 1.234321234321234e-27L, "1.23432e-27" },
2290 { 1.234321234321234e-26L, "1.23432e-26" },
2291 { 1.234321234321234e-25L, "1.23432e-25" },
2292 { 1.234321234321234e-24L, "1.23432e-24" },
2293 { 1.234321234321234e-23L, "1.23432e-23" },
2294 { 1.234321234321234e-22L, "1.23432e-22" },
2295 { 1.234321234321234e-21L, "1.23432e-21" },
2296 { 1.234321234321234e-20L, "1.23432e-20" },
2297 { 1.234321234321234e-19L, "1.23432e-19" },
2298 { 1.234321234321234e-18L, "1.23432e-18" },
2299 { 1.234321234321234e-17L, "1.23432e-17" },
2300 { 1.234321234321234e-16L, "1.23432e-16" },
2301 { 1.234321234321234e-15L, "1.23432e-15" },
2302 { 1.234321234321234e-14L, "1.23432e-14" },
2303 { 1.234321234321234e-13L, "1.23432e-13" },
2304 { 1.234321234321234e-12L, "1.23432e-12" },
2305 { 1.234321234321234e-11L, "1.23432e-11" },
2306 { 1.234321234321234e-10L, "1.23432e-10" },
2307 { 1.234321234321234e-9L, "1.23432e-09" },
2308 { 1.234321234321234e-8L, "1.23432e-08" },
2309 { 1.234321234321234e-7L, "1.23432e-07" },
2310 { 1.234321234321234e-6L, "1.23432e-06" },
2311 { 1.234321234321234e-5L, "1.23432e-05" },
2312 { 1.234321234321234e-4L, "0.000123432" },
2313 { 1.234321234321234e-3L, "0.00123432" },
2314 { 1.234321234321234e-2L, "0.0123432" },
2315 { 1.234321234321234e-1L, "0.123432" },
2316 { 1.234321234321234L, "1.23432" },
2317 { 1.234321234321234e1L
, "12.3432" },
2318 { 1.234321234321234e2L
, "123.432" },
2319 { 1.234321234321234e3L
, "1234.32" },
2320 { 1.234321234321234e4L
, "12343.2" },
2321 { 1.234321234321234e5L
, "123432" },
2322 { 1.234321234321234e6L
, "1.23432e+06" },
2323 { 1.234321234321234e7L
, "1.23432e+07" },
2324 { 1.234321234321234e8L
, "1.23432e+08" },
2325 { 1.234321234321234e9L
, "1.23432e+09" },
2326 { 1.234321234321234e10L
, "1.23432e+10" },
2327 { 1.234321234321234e11L
, "1.23432e+11" },
2328 { 1.234321234321234e12L
, "1.23432e+12" },
2329 { 1.234321234321234e13L
, "1.23432e+13" },
2330 { 1.234321234321234e14L
, "1.23432e+14" },
2331 { 1.234321234321234e15L
, "1.23432e+15" },
2332 { 1.234321234321234e16L
, "1.23432e+16" },
2333 { 1.234321234321234e17L
, "1.23432e+17" },
2334 { 1.234321234321234e18L
, "1.23432e+18" },
2335 { 1.234321234321234e19L
, "1.23432e+19" },
2336 { 1.234321234321234e20L
, "1.23432e+20" },
2337 { 1.234321234321234e21L
, "1.23432e+21" },
2338 { 1.234321234321234e22L
, "1.23432e+22" },
2339 { 1.234321234321234e23L
, "1.23432e+23" },
2340 { 1.234321234321234e24L
, "1.23432e+24" },
2341 { 1.234321234321234e25L
, "1.23432e+25" },
2342 { 1.234321234321234e26L
, "1.23432e+26" },
2343 { 1.234321234321234e27L
, "1.23432e+27" },
2344 { 1.234321234321234e28L
, "1.23432e+28" },
2345 { 1.234321234321234e29L
, "1.23432e+29" },
2346 { 1.234321234321234e30L
, "1.23432e+30" },
2347 { 1.234321234321234e31L
, "1.23432e+31" },
2348 { 1.234321234321234e32L
, "1.23432e+32" },
2349 { 1.234321234321234e33L
, "1.23432e+33" },
2350 { 1.234321234321234e34L
, "1.23432e+34" },
2351 { 1.234321234321234e35L
, "1.23432e+35" },
2352 { 1.234321234321234e36L
, "1.23432e+36" }
2355 for (k
= 0; k
< SIZEOF (data
); k
++)
2358 my_sprintf (result
, "%Lg", data
[k
].value
);
2359 const char *expected
= data
[k
].string
;
2360 ASSERT (strcmp (result
, expected
) == 0
2361 /* Some implementations produce exponents with 3 digits. */
2362 || (expected
[strlen (expected
) - 4] == 'e'
2363 && strlen (result
) == strlen (expected
) + 1
2364 && memcmp (result
, expected
, strlen (expected
) - 2) == 0
2365 && result
[strlen (expected
) - 2] == '0'
2366 && strcmp (result
+ strlen (expected
) - 1,
2367 expected
+ strlen (expected
) - 2)
2369 ASSERT (retval
== strlen (result
));
2373 { /* A negative number. */
2375 my_sprintf (result
, "%Lg %d", -0.03125L, 33, 44, 55);
2376 ASSERT (strcmp (result
, "-0.03125 33") == 0);
2377 ASSERT (retval
== strlen (result
));
2380 { /* Positive zero. */
2382 my_sprintf (result
, "%Lg %d", 0.0L, 33, 44, 55);
2383 ASSERT (strcmp (result
, "0 33") == 0);
2384 ASSERT (retval
== strlen (result
));
2387 { /* Negative zero. */
2389 my_sprintf (result
, "%Lg %d", minus_zerol
, 33, 44, 55);
2390 if (have_minus_zero ())
2391 ASSERT (strcmp (result
, "-0 33") == 0);
2392 ASSERT (retval
== strlen (result
));
2395 { /* Positive infinity. */
2397 my_sprintf (result
, "%Lg %d", Infinityl (), 33, 44, 55);
2398 ASSERT (strcmp (result
, "inf 33") == 0
2399 || strcmp (result
, "infinity 33") == 0);
2400 ASSERT (retval
== strlen (result
));
2403 { /* Negative infinity. */
2405 my_sprintf (result
, "%Lg %d", - Infinityl (), 33, 44, 55);
2406 ASSERT (strcmp (result
, "-inf 33") == 0
2407 || strcmp (result
, "-infinity 33") == 0);
2408 ASSERT (retval
== strlen (result
));
2413 my_sprintf (result
, "%Lg %d", NaNl (), 33, 44, 55);
2414 ASSERT (strlen (result
) >= 3 + 3
2415 && strisnan (result
, 0, strlen (result
) - 3, 0)
2416 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
2417 ASSERT (retval
== strlen (result
));
2419 #if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
2421 static union { unsigned int word
[4]; long double value
; } x
=
2422 { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
2424 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
2425 ASSERT (strlen (result
) >= 3 + 3
2426 && strisnan (result
, 0, strlen (result
) - 3, 0)
2427 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
2428 ASSERT (retval
== strlen (result
));
2431 /* Signalling NaN. */
2432 static union { unsigned int word
[4]; long double value
; } x
=
2433 { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
2435 my_sprintf (result
, "%La %d", x
.value
, 33, 44, 55);
2436 ASSERT (strlen (result
) >= 3 + 3
2437 && strisnan (result
, 0, strlen (result
) - 3, 0)
2438 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
2439 ASSERT (retval
== strlen (result
));
2441 /* sprintf should print something for noncanonical values. */
2443 static union { unsigned int word
[4]; long double value
; } x
=
2444 { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
2446 my_sprintf (result
, "%Lg %d", x
.value
, 33, 44, 55);
2447 ASSERT (retval
== strlen (result
));
2448 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
2450 { /* Pseudo-Infinity. */
2451 static union { unsigned int word
[4]; long double value
; } x
=
2452 { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
2454 my_sprintf (result
, "%Lg %d", x
.value
, 33, 44, 55);
2455 ASSERT (retval
== strlen (result
));
2456 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
2458 { /* Pseudo-Zero. */
2459 static union { unsigned int word
[4]; long double value
; } x
=
2460 { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
2462 my_sprintf (result
, "%Lg %d", x
.value
, 33, 44, 55);
2463 ASSERT (retval
== strlen (result
));
2464 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
2466 { /* Unnormalized number. */
2467 static union { unsigned int word
[4]; long double value
; } x
=
2468 { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
2470 my_sprintf (result
, "%Lg %d", x
.value
, 33, 44, 55);
2471 ASSERT (retval
== strlen (result
));
2472 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
2474 { /* Pseudo-Denormal. */
2475 static union { unsigned int word
[4]; long double value
; } x
=
2476 { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
2478 my_sprintf (result
, "%Lg %d", x
.value
, 33, 44, 55);
2479 ASSERT (retval
== strlen (result
));
2480 ASSERT (3 < retval
&& strcmp (result
+ retval
- 3, " 33") == 0);
2486 my_sprintf (result
, "%10Lg %d", 1.75L, 33, 44, 55);
2487 ASSERT (strcmp (result
, " 1.75 33") == 0);
2488 ASSERT (retval
== strlen (result
));
2493 my_sprintf (result
, "%-10Lg %d", 1.75L, 33, 44, 55);
2494 ASSERT (strcmp (result
, "1.75 33") == 0);
2495 ASSERT (retval
== strlen (result
));
2498 { /* FLAG_SHOWSIGN. */
2500 my_sprintf (result
, "%+Lg %d", 1.75L, 33, 44, 55);
2501 ASSERT (strcmp (result
, "+1.75 33") == 0);
2502 ASSERT (retval
== strlen (result
));
2507 my_sprintf (result
, "% Lg %d", 1.75L, 33, 44, 55);
2508 ASSERT (strcmp (result
, " 1.75 33") == 0);
2509 ASSERT (retval
== strlen (result
));
2514 my_sprintf (result
, "%#Lg %d", 1.75L, 33, 44, 55);
2515 ASSERT (strcmp (result
, "1.75000 33") == 0);
2516 ASSERT (retval
== strlen (result
));
2521 my_sprintf (result
, "%#.Lg %d", 1.75L, 33, 44, 55);
2522 ASSERT (strcmp (result
, "2. 33") == 0);
2523 ASSERT (retval
== strlen (result
));
2528 my_sprintf (result
, "%#.Lg %d", 9.75L, 33, 44, 55);
2529 ASSERT (strcmp (result
, "1.e+01 33") == 0
2530 || strcmp (result
, "1.e+001 33") == 0);
2531 ASSERT (retval
== strlen (result
));
2534 { /* FLAG_ZERO with finite number. */
2536 my_sprintf (result
, "%010Lg %d", 1234.0L, 33, 44, 55);
2537 ASSERT (strcmp (result
, "0000001234 33") == 0);
2538 ASSERT (retval
== strlen (result
));
2541 { /* FLAG_ZERO with infinite number. */
2543 my_sprintf (result
, "%015Lg %d", - Infinityl (), 33, 44, 55);
2544 ASSERT (strcmp (result
, " -inf 33") == 0
2545 || strcmp (result
, " -infinity 33") == 0);
2546 ASSERT (retval
== strlen (result
));
2549 { /* FLAG_ZERO with NaN. */
2551 my_sprintf (result
, "%050Lg %d", NaNl (), 33, 44, 55);
2552 ASSERT (strlen (result
) == 50 + 3
2553 && strisnan (result
, strspn (result
, " "), strlen (result
) - 3, 0)
2554 && strcmp (result
+ strlen (result
) - 3, " 33") == 0);
2555 ASSERT (retval
== strlen (result
));
2560 my_sprintf (result
, "%.Lg %d", 1234.0L, 33, 44, 55);
2561 ASSERT (strcmp (result
, "1e+03 33") == 0
2562 || strcmp (result
, "1e+003 33") == 0);
2563 ASSERT (retval
== strlen (result
));
2566 { /* Precision with no rounding. */
2568 my_sprintf (result
, "%.5Lg %d", 999.951L, 33, 44, 55);
2569 ASSERT (strcmp (result
, "999.95 33") == 0);
2570 ASSERT (retval
== strlen (result
));
2573 { /* Precision with rounding. */
2575 my_sprintf (result
, "%.5Lg %d", 999.996L, 33, 44, 55);
2576 ASSERT (strcmp (result
, "1000 33") == 0);
2577 ASSERT (retval
== strlen (result
));
2580 /* Test the support of the %n format directive. */
2585 my_sprintf (result
, "%d %n", 123, &count
, 33, 44, 55);
2586 ASSERT (strcmp (result
, "123 ") == 0);
2587 ASSERT (retval
== strlen (result
));
2588 ASSERT (count
== 4);
2591 /* Test the support of the POSIX/XSI format strings with positions. */
2595 my_sprintf (result
, "%2$d %1$d", 33, 55);
2596 ASSERT (strcmp (result
, "55 33") == 0);
2597 ASSERT (retval
== strlen (result
));
2600 /* Test the support of the grouping flag. */
2604 my_sprintf (result
, "%'d %d", 1234567, 99);
2605 ASSERT (result
[strlen (result
) - 1] == '9');
2606 ASSERT (retval
== strlen (result
));
2609 /* Test the support of the left-adjust flag. */
2613 my_sprintf (result
, "a%*sc", -3, "b");
2614 ASSERT (strcmp (result
, "ab c") == 0);
2615 ASSERT (retval
== strlen (result
));
2620 my_sprintf (result
, "a%-*sc", 3, "b");
2621 ASSERT (strcmp (result
, "ab c") == 0);
2622 ASSERT (retval
== strlen (result
));
2627 my_sprintf (result
, "a%-*sc", -3, "b");
2628 ASSERT (strcmp (result
, "ab c") == 0);
2629 ASSERT (retval
== strlen (result
));
2632 /* Test the support of large precision. */
2636 my_sprintf (result
, "%.4000d %d", 1234567, 99);
2638 for (i
= 0; i
< 4000 - 7; i
++)
2639 ASSERT (result
[i
] == '0');
2640 ASSERT (strcmp (result
+ 4000 - 7, "1234567 99") == 0);
2641 ASSERT (retval
== strlen (result
));
2646 my_sprintf (result
, "%.*d %d", 4000, 1234567, 99);
2648 for (i
= 0; i
< 4000 - 7; i
++)
2649 ASSERT (result
[i
] == '0');
2650 ASSERT (strcmp (result
+ 4000 - 7, "1234567 99") == 0);
2651 ASSERT (retval
== strlen (result
));
2656 my_sprintf (result
, "%.4000d %d", -1234567, 99);
2658 ASSERT (result
[0] == '-');
2659 for (i
= 0; i
< 4000 - 7; i
++)
2660 ASSERT (result
[1 + i
] == '0');
2661 ASSERT (strcmp (result
+ 1 + 4000 - 7, "1234567 99") == 0);
2662 ASSERT (retval
== strlen (result
));
2667 my_sprintf (result
, "%.4000u %d", 1234567, 99);
2669 for (i
= 0; i
< 4000 - 7; i
++)
2670 ASSERT (result
[i
] == '0');
2671 ASSERT (strcmp (result
+ 4000 - 7, "1234567 99") == 0);
2672 ASSERT (retval
== strlen (result
));
2677 my_sprintf (result
, "%.4000o %d", 1234567, 99);
2679 for (i
= 0; i
< 4000 - 7; i
++)
2680 ASSERT (result
[i
] == '0');
2681 ASSERT (strcmp (result
+ 4000 - 7, "4553207 99") == 0);
2682 ASSERT (retval
== strlen (result
));
2687 my_sprintf (result
, "%.4000x %d", 1234567, 99);
2689 for (i
= 0; i
< 4000 - 6; i
++)
2690 ASSERT (result
[i
] == '0');
2691 ASSERT (strcmp (result
+ 4000 - 6, "12d687 99") == 0);
2692 ASSERT (retval
== strlen (result
));
2697 my_sprintf (result
, "%#.4000x %d", 1234567, 99);
2699 ASSERT (result
[0] == '0');
2700 ASSERT (result
[1] == 'x');
2701 for (i
= 0; i
< 4000 - 6; i
++)
2702 ASSERT (result
[2 + i
] == '0');
2703 ASSERT (strcmp (result
+ 2 + 4000 - 6, "12d687 99") == 0);
2704 ASSERT (retval
== strlen (result
));
2709 my_sprintf (result
, "%.4000f %d", 1.0, 99);
2711 ASSERT (result
[0] == '1');
2712 ASSERT (result
[1] == '.');
2713 for (i
= 0; i
< 4000; i
++)
2714 ASSERT (result
[2 + i
] == '0');
2715 ASSERT (strcmp (result
+ 2 + 4000, " 99") == 0);
2716 ASSERT (retval
== strlen (result
));
2721 my_sprintf (result
, "%.511f %d", 1.0, 99);
2723 ASSERT (result
[0] == '1');
2724 ASSERT (result
[1] == '.');
2725 for (i
= 0; i
< 511; i
++)
2726 ASSERT (result
[2 + i
] == '0');
2727 ASSERT (strcmp (result
+ 2 + 511, " 99") == 0);
2728 ASSERT (retval
== strlen (result
));
2736 for (i
= 0; i
< sizeof (input
) - 1; i
++)
2737 input
[i
] = 'a' + ((1000000 / (i
+ 1)) % 26);
2739 retval
= my_sprintf (result
, "%.4000s %d", input
, 99);
2740 ASSERT (memcmp (result
, input
, 4000) == 0);
2741 ASSERT (strcmp (result
+ 4000, " 99") == 0);
2742 ASSERT (retval
== strlen (result
));
2745 /* Test the support of the %s format directive. */
2747 /* To verify that these tests succeed, it is necessary to run them under
2748 a tool that checks against invalid memory accesses, such as ElectricFence
2749 or "valgrind --tool=memcheck". */
2753 for (i
= 1; i
<= 8; i
++)
2758 block
= (char *) malloc (i
);
2759 memcpy (block
, "abcdefgh", i
);
2760 retval
= my_sprintf (result
, "%.*s", (int) i
, block
);
2761 ASSERT (memcmp (result
, block
, i
) == 0);
2762 ASSERT (result
[i
] == '\0');
2763 ASSERT (retval
== strlen (result
));
2771 for (i
= 1; i
<= 8; i
++)
2777 block
= (wchar_t *) malloc (i
* sizeof (wchar_t));
2778 for (j
= 0; j
< i
; j
++)
2779 block
[j
] = "abcdefgh"[j
];
2780 retval
= my_sprintf (result
, "%.*ls", (int) i
, block
);
2781 ASSERT (memcmp (result
, "abcdefgh", i
) == 0);
2782 ASSERT (result
[i
] == '\0');
2783 ASSERT (retval
== strlen (result
));