1 /* Test of POSIX compatible vasnprintf() and asnprintf() functions.
2 Copyright (C) 2007 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 2, or (at your option)
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, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18 /* Written by Bruno Haible <bruno@clisp.org>, 2007. */
24 #include "vasnprintf.h"
33 #define ASSERT(expr) \
38 fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
44 /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0. */
49 static double zero = 0.0;
53 # define NaN() (0.0 / 0.0)
57 test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
62 /* Test return value convention. */
64 for (size = 0; size <= 8; size++)
67 char *result = my_asnprintf (NULL, &length, "%d", 12345);
68 ASSERT (result != NULL);
69 ASSERT (strcmp (result, "12345") == 0);
74 for (size = 0; size <= 8; size++)
79 memcpy (buf, "DEADBEEF", 8);
81 result = my_asnprintf (buf, &length, "%d", 12345);
82 ASSERT (result != NULL);
83 ASSERT (strcmp (result, "12345") == 0);
86 ASSERT (result != buf);
87 ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
92 /* Test support of size specifiers as in C99. */
97 my_asnprintf (NULL, &length, "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
98 ASSERT (result != NULL);
99 ASSERT (strcmp (result, "12345671 33") == 0);
100 ASSERT (length == strlen (result));
107 my_asnprintf (NULL, &length, "%zu %d", (size_t) 12345672, 33, 44, 55);
108 ASSERT (result != NULL);
109 ASSERT (strcmp (result, "12345672 33") == 0);
110 ASSERT (length == strlen (result));
117 my_asnprintf (NULL, &length, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
118 ASSERT (result != NULL);
119 ASSERT (strcmp (result, "12345673 33") == 0);
120 ASSERT (length == strlen (result));
127 my_asnprintf (NULL, &length, "%Lg %d", (long double) 1.5, 33, 44, 55);
128 ASSERT (result != NULL);
129 ASSERT (strcmp (result, "1.5 33") == 0);
130 ASSERT (length == strlen (result));
134 /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
135 output of floating-point numbers. */
137 { /* A positive number. */
140 my_asnprintf (NULL, &length, "%a %d", 3.1416015625, 33, 44, 55);
141 ASSERT (result != NULL);
142 ASSERT (strcmp (result, "0x1.922p+1 33") == 0
143 || strcmp (result, "0x3.244p+0 33") == 0
144 || strcmp (result, "0x6.488p-1 33") == 0
145 || strcmp (result, "0xc.91p-2 33") == 0);
146 ASSERT (length == strlen (result));
150 { /* A negative number. */
153 my_asnprintf (NULL, &length, "%A %d", -3.1416015625, 33, 44, 55);
154 ASSERT (result != NULL);
155 ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
156 || strcmp (result, "-0X3.244P+0 33") == 0
157 || strcmp (result, "-0X6.488P-1 33") == 0
158 || strcmp (result, "-0XC.91P-2 33") == 0);
159 ASSERT (length == strlen (result));
163 { /* Positive zero. */
166 my_asnprintf (NULL, &length, "%a %d", 0.0, 33, 44, 55);
167 ASSERT (result != NULL);
168 ASSERT (strcmp (result, "0x0p+0 33") == 0);
169 ASSERT (length == strlen (result));
173 { /* Negative zero. */
176 my_asnprintf (NULL, &length, "%a %d", -0.0, 33, 44, 55);
177 ASSERT (result != NULL);
178 ASSERT (strcmp (result, "-0x0p+0 33") == 0);
179 ASSERT (length == strlen (result));
183 { /* Positive infinity. */
186 my_asnprintf (NULL, &length, "%a %d", 1.0 / 0.0, 33, 44, 55);
187 ASSERT (result != NULL);
188 ASSERT (strcmp (result, "inf 33") == 0);
189 ASSERT (length == strlen (result));
193 { /* Negative infinity. */
196 my_asnprintf (NULL, &length, "%a %d", -1.0 / 0.0, 33, 44, 55);
197 ASSERT (result != NULL);
198 ASSERT (strcmp (result, "-inf 33") == 0);
199 ASSERT (length == strlen (result));
206 my_asnprintf (NULL, &length, "%a %d", NaN (), 33, 44, 55);
207 ASSERT (result != NULL);
208 ASSERT (strcmp (result, "nan 33") == 0);
209 ASSERT (length == strlen (result));
213 { /* Rounding near the decimal point. */
216 my_asnprintf (NULL, &length, "%.0a %d", 1.5, 33, 44, 55);
217 ASSERT (result != NULL);
218 ASSERT (strcmp (result, "0x2p+0 33") == 0
219 || strcmp (result, "0x3p-1 33") == 0
220 || strcmp (result, "0x6p-2 33") == 0
221 || strcmp (result, "0xcp-3 33") == 0);
222 ASSERT (length == strlen (result));
226 { /* Rounding with precision 0. */
229 my_asnprintf (NULL, &length, "%.0a %d", 1.51, 33, 44, 55);
230 ASSERT (result != NULL);
231 ASSERT (strcmp (result, "0x2p+0 33") == 0
232 || strcmp (result, "0x3p-1 33") == 0
233 || strcmp (result, "0x6p-2 33") == 0
234 || strcmp (result, "0xcp-3 33") == 0);
235 ASSERT (length == strlen (result));
239 { /* Rounding with precision 1. */
242 my_asnprintf (NULL, &length, "%.1a %d", 1.51, 33, 44, 55);
243 ASSERT (result != NULL);
244 ASSERT (strcmp (result, "0x1.8p+0 33") == 0
245 || strcmp (result, "0x3.0p-1 33") == 0
246 || strcmp (result, "0x6.1p-2 33") == 0
247 || strcmp (result, "0xc.1p-3 33") == 0);
248 ASSERT (length == strlen (result));
252 { /* Rounding with precision 2. */
255 my_asnprintf (NULL, &length, "%.2a %d", 1.51, 33, 44, 55);
256 ASSERT (result != NULL);
257 ASSERT (strcmp (result, "0x1.83p+0 33") == 0
258 || strcmp (result, "0x3.05p-1 33") == 0
259 || strcmp (result, "0x6.0ap-2 33") == 0
260 || strcmp (result, "0xc.14p-3 33") == 0);
261 ASSERT (length == strlen (result));
265 { /* Rounding with precision 3. */
268 my_asnprintf (NULL, &length, "%.3a %d", 1.51, 33, 44, 55);
269 ASSERT (result != NULL);
270 ASSERT (strcmp (result, "0x1.829p+0 33") == 0
271 || strcmp (result, "0x3.052p-1 33") == 0
272 || strcmp (result, "0x6.0a4p-2 33") == 0
273 || strcmp (result, "0xc.148p-3 33") == 0);
274 ASSERT (length == strlen (result));
278 { /* Rounding can turn a ...FFF into a ...000. */
281 my_asnprintf (NULL, &length, "%.3a %d", 1.49999, 33, 44, 55);
282 ASSERT (result != NULL);
283 ASSERT (strcmp (result, "0x1.800p+0 33") == 0
284 || strcmp (result, "0x3.000p-1 33") == 0
285 || strcmp (result, "0x6.000p-2 33") == 0
286 || strcmp (result, "0xc.000p-3 33") == 0);
287 ASSERT (length == strlen (result));
291 { /* Rounding can turn a ...FFF into a ...000.
292 This shows a MacOS X 10.3.9 (Darwin 7.9) bug. */
295 my_asnprintf (NULL, &length, "%.1a %d", 1.999, 33, 44, 55);
296 ASSERT (result != NULL);
297 ASSERT (strcmp (result, "0x1.0p+1 33") == 0
298 || strcmp (result, "0x2.0p+0 33") == 0
299 || strcmp (result, "0x4.0p-1 33") == 0
300 || strcmp (result, "0x8.0p-2 33") == 0);
301 ASSERT (length == strlen (result));
308 my_asnprintf (NULL, &length, "%10a %d", 1.75, 33, 44, 55);
309 ASSERT (result != NULL);
310 ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
311 || strcmp (result, " 0x3.8p-1 33") == 0
312 || strcmp (result, " 0x7p-2 33") == 0
313 || strcmp (result, " 0xep-3 33") == 0);
314 ASSERT (length == strlen (result));
318 { /* Small precision. */
321 my_asnprintf (NULL, &length, "%.10a %d", 1.75, 33, 44, 55);
322 ASSERT (result != NULL);
323 ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
324 || strcmp (result, "0x3.8000000000p-1 33") == 0
325 || strcmp (result, "0x7.0000000000p-2 33") == 0
326 || strcmp (result, "0xe.0000000000p-3 33") == 0);
327 ASSERT (length == strlen (result));
331 { /* Large precision. */
334 my_asnprintf (NULL, &length, "%.50a %d", 1.75, 33, 44, 55);
335 ASSERT (result != NULL);
336 ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
337 || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
338 || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
339 || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
340 ASSERT (length == strlen (result));
347 my_asnprintf (NULL, &length, "%-10a %d", 1.75, 33, 44, 55);
348 ASSERT (result != NULL);
349 ASSERT (strcmp (result, "0x1.cp+0 33") == 0
350 || strcmp (result, "0x3.8p-1 33") == 0
351 || strcmp (result, "0x7p-2 33") == 0
352 || strcmp (result, "0xep-3 33") == 0);
353 ASSERT (length == strlen (result));
357 { /* FLAG_SHOWSIGN. */
360 my_asnprintf (NULL, &length, "%+a %d", 1.75, 33, 44, 55);
361 ASSERT (result != NULL);
362 ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
363 || strcmp (result, "+0x3.8p-1 33") == 0
364 || strcmp (result, "+0x7p-2 33") == 0
365 || strcmp (result, "+0xep-3 33") == 0);
366 ASSERT (length == strlen (result));
373 my_asnprintf (NULL, &length, "% a %d", 1.75, 33, 44, 55);
374 ASSERT (result != NULL);
375 ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
376 || strcmp (result, " 0x3.8p-1 33") == 0
377 || strcmp (result, " 0x7p-2 33") == 0
378 || strcmp (result, " 0xep-3 33") == 0);
379 ASSERT (length == strlen (result));
386 my_asnprintf (NULL, &length, "%#a %d", 1.75, 33, 44, 55);
387 ASSERT (result != NULL);
388 ASSERT (strcmp (result, "0x1.cp+0 33") == 0
389 || strcmp (result, "0x3.8p-1 33") == 0
390 || strcmp (result, "0x7.p-2 33") == 0
391 || strcmp (result, "0xe.p-3 33") == 0);
392 ASSERT (length == strlen (result));
399 my_asnprintf (NULL, &length, "%#a %d", 1.0, 33, 44, 55);
400 ASSERT (result != NULL);
401 ASSERT (strcmp (result, "0x1.p+0 33") == 0
402 || strcmp (result, "0x2.p-1 33") == 0
403 || strcmp (result, "0x4.p-2 33") == 0
404 || strcmp (result, "0x8.p-3 33") == 0);
405 ASSERT (length == strlen (result));
409 { /* FLAG_ZERO with finite number. */
412 my_asnprintf (NULL, &length, "%010a %d", 1.75, 33, 44, 55);
413 ASSERT (result != NULL);
414 ASSERT (strcmp (result, "0x001.cp+0 33") == 0
415 || strcmp (result, "0x003.8p-1 33") == 0
416 || strcmp (result, "0x00007p-2 33") == 0
417 || strcmp (result, "0x0000ep-3 33") == 0);
418 ASSERT (length == strlen (result));
422 { /* FLAG_ZERO with infinite number. */
425 my_asnprintf (NULL, &length, "%010a %d", 1.0 / 0.0, 33, 44, 55);
426 ASSERT (result != NULL);
427 /* "0000000inf 33" is not a valid result; see
428 <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
429 ASSERT (strcmp (result, " inf 33") == 0);
430 ASSERT (length == strlen (result));
434 { /* FLAG_ZERO with NaN. */
437 my_asnprintf (NULL, &length, "%010a %d", NaN (), 33, 44, 55);
438 ASSERT (result != NULL);
439 /* "0000000nan 33" is not a valid result; see
440 <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
441 ASSERT (strcmp (result, " nan 33") == 0);
442 ASSERT (length == strlen (result));
446 { /* A positive number. */
449 my_asnprintf (NULL, &length, "%La %d", 3.1416015625L, 33, 44, 55);
450 ASSERT (result != NULL);
451 ASSERT (strcmp (result, "0x1.922p+1 33") == 0
452 || strcmp (result, "0x3.244p+0 33") == 0
453 || strcmp (result, "0x6.488p-1 33") == 0
454 || strcmp (result, "0xc.91p-2 33") == 0);
455 ASSERT (length == strlen (result));
459 { /* A negative number. */
462 my_asnprintf (NULL, &length, "%LA %d", -3.1416015625L, 33, 44, 55);
463 ASSERT (result != NULL);
464 ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
465 || strcmp (result, "-0X3.244P+0 33") == 0
466 || strcmp (result, "-0X6.488P-1 33") == 0
467 || strcmp (result, "-0XC.91P-2 33") == 0);
468 ASSERT (length == strlen (result));
472 { /* Positive zero. */
475 my_asnprintf (NULL, &length, "%La %d", 0.0L, 33, 44, 55);
476 ASSERT (result != NULL);
477 ASSERT (strcmp (result, "0x0p+0 33") == 0);
478 ASSERT (length == strlen (result));
482 { /* Negative zero. */
485 my_asnprintf (NULL, &length, "%La %d", -0.0L, 33, 44, 55);
486 ASSERT (result != NULL);
487 ASSERT (strcmp (result, "-0x0p+0 33") == 0);
488 ASSERT (length == strlen (result));
492 { /* Positive infinity. */
495 my_asnprintf (NULL, &length, "%La %d", 1.0L / 0.0L, 33, 44, 55);
496 ASSERT (result != NULL);
497 ASSERT (strcmp (result, "inf 33") == 0);
498 ASSERT (length == strlen (result));
502 { /* Negative infinity. */
505 my_asnprintf (NULL, &length, "%La %d", -1.0L / 0.0L, 33, 44, 55);
506 ASSERT (result != NULL);
507 ASSERT (strcmp (result, "-inf 33") == 0);
508 ASSERT (length == strlen (result));
515 my_asnprintf (NULL, &length, "%La %d", 0.0L / 0.0L, 33, 44, 55);
516 ASSERT (result != NULL);
517 ASSERT (strcmp (result, "nan 33") == 0);
518 ASSERT (length == strlen (result));
522 { /* Rounding near the decimal point. */
525 my_asnprintf (NULL, &length, "%.0La %d", 1.5L, 33, 44, 55);
526 ASSERT (result != NULL);
527 ASSERT (strcmp (result, "0x2p+0 33") == 0
528 || strcmp (result, "0x3p-1 33") == 0
529 || strcmp (result, "0x6p-2 33") == 0
530 || strcmp (result, "0xcp-3 33") == 0);
531 ASSERT (length == strlen (result));
535 { /* Rounding with precision 0. */
538 my_asnprintf (NULL, &length, "%.0La %d", 1.51L, 33, 44, 55);
539 ASSERT (result != NULL);
540 ASSERT (strcmp (result, "0x2p+0 33") == 0
541 || strcmp (result, "0x3p-1 33") == 0
542 || strcmp (result, "0x6p-2 33") == 0
543 || strcmp (result, "0xcp-3 33") == 0);
544 ASSERT (length == strlen (result));
548 { /* Rounding with precision 1. */
551 my_asnprintf (NULL, &length, "%.1La %d", 1.51L, 33, 44, 55);
552 ASSERT (result != NULL);
553 ASSERT (strcmp (result, "0x1.8p+0 33") == 0
554 || strcmp (result, "0x3.0p-1 33") == 0
555 || strcmp (result, "0x6.1p-2 33") == 0
556 || strcmp (result, "0xc.1p-3 33") == 0);
557 ASSERT (length == strlen (result));
561 { /* Rounding with precision 2. */
564 my_asnprintf (NULL, &length, "%.2La %d", 1.51L, 33, 44, 55);
565 ASSERT (result != NULL);
566 ASSERT (strcmp (result, "0x1.83p+0 33") == 0
567 || strcmp (result, "0x3.05p-1 33") == 0
568 || strcmp (result, "0x6.0ap-2 33") == 0
569 || strcmp (result, "0xc.14p-3 33") == 0);
570 ASSERT (length == strlen (result));
574 { /* Rounding with precision 3. */
577 my_asnprintf (NULL, &length, "%.3La %d", 1.51L, 33, 44, 55);
578 ASSERT (result != NULL);
579 ASSERT (strcmp (result, "0x1.829p+0 33") == 0
580 || strcmp (result, "0x3.052p-1 33") == 0
581 || strcmp (result, "0x6.0a4p-2 33") == 0
582 || strcmp (result, "0xc.148p-3 33") == 0);
583 ASSERT (length == strlen (result));
587 { /* Rounding can turn a ...FFF into a ...000. */
590 my_asnprintf (NULL, &length, "%.3La %d", 1.49999L, 33, 44, 55);
591 ASSERT (result != NULL);
592 ASSERT (strcmp (result, "0x1.800p+0 33") == 0
593 || strcmp (result, "0x3.000p-1 33") == 0
594 || strcmp (result, "0x6.000p-2 33") == 0
595 || strcmp (result, "0xc.000p-3 33") == 0);
596 ASSERT (length == strlen (result));
600 { /* Rounding can turn a ...FFF into a ...000.
601 This shows a MacOS X 10.3.9 (Darwin 7.9) bug and a
602 glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
605 my_asnprintf (NULL, &length, "%.1La %d", 1.999L, 33, 44, 55);
606 ASSERT (result != NULL);
607 ASSERT (strcmp (result, "0x1.0p+1 33") == 0
608 || strcmp (result, "0x2.0p+0 33") == 0
609 || strcmp (result, "0x4.0p-1 33") == 0
610 || strcmp (result, "0x8.0p-2 33") == 0);
611 ASSERT (length == strlen (result));
618 my_asnprintf (NULL, &length, "%10La %d", 1.75L, 33, 44, 55);
619 ASSERT (result != NULL);
620 ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
621 || strcmp (result, " 0x3.8p-1 33") == 0
622 || strcmp (result, " 0x7p-2 33") == 0
623 || strcmp (result, " 0xep-3 33") == 0);
624 ASSERT (length == strlen (result));
628 { /* Small precision. */
631 my_asnprintf (NULL, &length, "%.10La %d", 1.75L, 33, 44, 55);
632 ASSERT (result != NULL);
633 ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
634 || strcmp (result, "0x3.8000000000p-1 33") == 0
635 || strcmp (result, "0x7.0000000000p-2 33") == 0
636 || strcmp (result, "0xe.0000000000p-3 33") == 0);
637 ASSERT (length == strlen (result));
641 { /* Large precision. */
644 my_asnprintf (NULL, &length, "%.50La %d", 1.75L, 33, 44, 55);
645 ASSERT (result != NULL);
646 ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
647 || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
648 || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
649 || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
650 ASSERT (length == strlen (result));
657 my_asnprintf (NULL, &length, "%-10La %d", 1.75L, 33, 44, 55);
658 ASSERT (result != NULL);
659 ASSERT (strcmp (result, "0x1.cp+0 33") == 0
660 || strcmp (result, "0x3.8p-1 33") == 0
661 || strcmp (result, "0x7p-2 33") == 0
662 || strcmp (result, "0xep-3 33") == 0);
663 ASSERT (length == strlen (result));
667 { /* FLAG_SHOWSIGN. */
670 my_asnprintf (NULL, &length, "%+La %d", 1.75L, 33, 44, 55);
671 ASSERT (result != NULL);
672 ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
673 || strcmp (result, "+0x3.8p-1 33") == 0
674 || strcmp (result, "+0x7p-2 33") == 0
675 || strcmp (result, "+0xep-3 33") == 0);
676 ASSERT (length == strlen (result));
683 my_asnprintf (NULL, &length, "% La %d", 1.75L, 33, 44, 55);
684 ASSERT (result != NULL);
685 ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
686 || strcmp (result, " 0x3.8p-1 33") == 0
687 || strcmp (result, " 0x7p-2 33") == 0
688 || strcmp (result, " 0xep-3 33") == 0);
689 ASSERT (length == strlen (result));
696 my_asnprintf (NULL, &length, "%#La %d", 1.75L, 33, 44, 55);
697 ASSERT (result != NULL);
698 ASSERT (strcmp (result, "0x1.cp+0 33") == 0
699 || strcmp (result, "0x3.8p-1 33") == 0
700 || strcmp (result, "0x7.p-2 33") == 0
701 || strcmp (result, "0xe.p-3 33") == 0);
702 ASSERT (length == strlen (result));
709 my_asnprintf (NULL, &length, "%#La %d", 1.0L, 33, 44, 55);
710 ASSERT (result != NULL);
711 ASSERT (strcmp (result, "0x1.p+0 33") == 0
712 || strcmp (result, "0x2.p-1 33") == 0
713 || strcmp (result, "0x4.p-2 33") == 0
714 || strcmp (result, "0x8.p-3 33") == 0);
715 ASSERT (length == strlen (result));
719 { /* FLAG_ZERO with finite number. */
722 my_asnprintf (NULL, &length, "%010La %d", 1.75L, 33, 44, 55);
723 ASSERT (result != NULL);
724 ASSERT (strcmp (result, "0x001.cp+0 33") == 0
725 || strcmp (result, "0x003.8p-1 33") == 0
726 || strcmp (result, "0x00007p-2 33") == 0
727 || strcmp (result, "0x0000ep-3 33") == 0);
728 ASSERT (length == strlen (result));
732 { /* FLAG_ZERO with infinite number. */
735 my_asnprintf (NULL, &length, "%010La %d", 1.0L / 0.0L, 33, 44, 55);
736 ASSERT (result != NULL);
737 /* "0000000inf 33" is not a valid result; see
738 <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
739 ASSERT (strcmp (result, " inf 33") == 0);
740 ASSERT (length == strlen (result));
744 { /* FLAG_ZERO with NaN. */
747 my_asnprintf (NULL, &length, "%010La %d", 0.0L / 0.0L, 33, 44, 55);
748 ASSERT (result != NULL);
749 /* "0000000nan 33" is not a valid result; see
750 <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
751 ASSERT (strcmp (result, " nan 33") == 0);
752 ASSERT (length == strlen (result));
756 /* Test the support of the %f format directive. */
758 { /* A positive number. */
761 my_asnprintf (NULL, &length, "%f %d", 12.75, 33, 44, 55);
762 ASSERT (result != NULL);
763 ASSERT (strcmp (result, "12.750000 33") == 0);
764 ASSERT (length == strlen (result));
768 { /* A larger positive number. */
771 my_asnprintf (NULL, &length, "%f %d", 1234567.0, 33, 44, 55);
772 ASSERT (result != NULL);
773 ASSERT (strcmp (result, "1234567.000000 33") == 0);
774 ASSERT (length == strlen (result));
778 { /* A negative number. */
781 my_asnprintf (NULL, &length, "%f %d", -0.03125, 33, 44, 55);
782 ASSERT (result != NULL);
783 ASSERT (strcmp (result, "-0.031250 33") == 0);
784 ASSERT (length == strlen (result));
788 { /* Positive zero. */
791 my_asnprintf (NULL, &length, "%f %d", 0.0, 33, 44, 55);
792 ASSERT (result != NULL);
793 ASSERT (strcmp (result, "0.000000 33") == 0);
794 ASSERT (length == strlen (result));
798 { /* Negative zero. */
801 my_asnprintf (NULL, &length, "%f %d", -0.0, 33, 44, 55);
802 ASSERT (result != NULL);
803 ASSERT (strcmp (result, "-0.000000 33") == 0);
804 ASSERT (length == strlen (result));
808 { /* Positive infinity. */
811 my_asnprintf (NULL, &length, "%f %d", 1.0 / 0.0, 33, 44, 55);
812 ASSERT (result != NULL);
813 ASSERT (strcmp (result, "inf 33") == 0
814 || strcmp (result, "infinity 33") == 0);
815 ASSERT (length == strlen (result));
819 { /* Negative infinity. */
822 my_asnprintf (NULL, &length, "%f %d", -1.0 / 0.0, 33, 44, 55);
823 ASSERT (result != NULL);
824 ASSERT (strcmp (result, "-inf 33") == 0
825 || strcmp (result, "-infinity 33") == 0);
826 ASSERT (length == strlen (result));
833 my_asnprintf (NULL, &length, "%f %d", NaN (), 33, 44, 55);
834 ASSERT (result != NULL);
835 ASSERT (strcmp (result, "nan 33") == 0);
836 ASSERT (length == strlen (result));
843 my_asnprintf (NULL, &length, "%10f %d", 1.75, 33, 44, 55);
844 ASSERT (result != NULL);
845 ASSERT (strcmp (result, " 1.750000 33") == 0);
846 ASSERT (length == strlen (result));
853 my_asnprintf (NULL, &length, "%-10f %d", 1.75, 33, 44, 55);
854 ASSERT (result != NULL);
855 ASSERT (strcmp (result, "1.750000 33") == 0);
856 ASSERT (length == strlen (result));
860 { /* FLAG_SHOWSIGN. */
863 my_asnprintf (NULL, &length, "%+f %d", 1.75, 33, 44, 55);
864 ASSERT (result != NULL);
865 ASSERT (strcmp (result, "+1.750000 33") == 0);
866 ASSERT (length == strlen (result));
873 my_asnprintf (NULL, &length, "% f %d", 1.75, 33, 44, 55);
874 ASSERT (result != NULL);
875 ASSERT (strcmp (result, " 1.750000 33") == 0);
876 ASSERT (length == strlen (result));
883 my_asnprintf (NULL, &length, "%#f %d", 1.75, 33, 44, 55);
884 ASSERT (result != NULL);
885 ASSERT (strcmp (result, "1.750000 33") == 0);
886 ASSERT (length == strlen (result));
893 my_asnprintf (NULL, &length, "%#.f %d", 1.75, 33, 44, 55);
894 ASSERT (result != NULL);
895 ASSERT (strcmp (result, "2. 33") == 0);
896 ASSERT (length == strlen (result));
900 { /* FLAG_ZERO with finite number. */
903 my_asnprintf (NULL, &length, "%015f %d", 1234.0, 33, 44, 55);
904 ASSERT (result != NULL);
905 ASSERT (strcmp (result, "00001234.000000 33") == 0);
906 ASSERT (length == strlen (result));
910 { /* FLAG_ZERO with infinite number. */
913 my_asnprintf (NULL, &length, "%015f %d", -1.0 / 0.0, 33, 44, 55);
914 ASSERT (result != NULL);
915 ASSERT (strcmp (result, " -inf 33") == 0
916 || strcmp (result, " -infinity 33") == 0);
917 ASSERT (length == strlen (result));
921 { /* FLAG_ZERO with NaN. */
924 my_asnprintf (NULL, &length, "%015f %d", NaN (), 33, 44, 55);
925 ASSERT (result != NULL);
926 ASSERT (strcmp (result, " nan 33") == 0);
927 ASSERT (length == strlen (result));
934 my_asnprintf (NULL, &length, "%.f %d", 1234.0, 33, 44, 55);
935 ASSERT (result != NULL);
936 ASSERT (strcmp (result, "1234 33") == 0);
937 ASSERT (length == strlen (result));
941 { /* A positive number. */
944 my_asnprintf (NULL, &length, "%Lf %d", 12.75L, 33, 44, 55);
945 ASSERT (result != NULL);
946 ASSERT (strcmp (result, "12.750000 33") == 0);
947 ASSERT (length == strlen (result));
951 { /* A larger positive number. */
954 my_asnprintf (NULL, &length, "%Lf %d", 1234567.0L, 33, 44, 55);
955 ASSERT (result != NULL);
956 ASSERT (strcmp (result, "1234567.000000 33") == 0);
957 ASSERT (length == strlen (result));
961 { /* A negative number. */
964 my_asnprintf (NULL, &length, "%Lf %d", -0.03125L, 33, 44, 55);
965 ASSERT (result != NULL);
966 ASSERT (strcmp (result, "-0.031250 33") == 0);
967 ASSERT (length == strlen (result));
971 { /* Positive zero. */
974 my_asnprintf (NULL, &length, "%Lf %d", 0.0L, 33, 44, 55);
975 ASSERT (result != NULL);
976 ASSERT (strcmp (result, "0.000000 33") == 0);
977 ASSERT (length == strlen (result));
981 { /* Negative zero. */
984 my_asnprintf (NULL, &length, "%Lf %d", -0.0L, 33, 44, 55);
985 ASSERT (result != NULL);
986 ASSERT (strcmp (result, "-0.000000 33") == 0);
987 ASSERT (length == strlen (result));
991 { /* Positive infinity. */
994 my_asnprintf (NULL, &length, "%Lf %d", 1.0L / 0.0L, 33, 44, 55);
995 ASSERT (result != NULL);
996 ASSERT (strcmp (result, "inf 33") == 0
997 || strcmp (result, "infinity 33") == 0);
998 ASSERT (length == strlen (result));
1002 { /* Negative infinity. */
1005 my_asnprintf (NULL, &length, "%Lf %d", -1.0L / 0.0L, 33, 44, 55);
1006 ASSERT (result != NULL);
1007 ASSERT (strcmp (result, "-inf 33") == 0
1008 || strcmp (result, "-infinity 33") == 0);
1009 ASSERT (length == strlen (result));
1014 static long double zero = 0.0L;
1017 my_asnprintf (NULL, &length, "%Lf %d", zero / zero, 33, 44, 55);
1018 ASSERT (result != NULL);
1019 ASSERT (strcmp (result, "nan 33") == 0);
1020 ASSERT (length == strlen (result));
1027 my_asnprintf (NULL, &length, "%10Lf %d", 1.75L, 33, 44, 55);
1028 ASSERT (result != NULL);
1029 ASSERT (strcmp (result, " 1.750000 33") == 0);
1030 ASSERT (length == strlen (result));
1037 my_asnprintf (NULL, &length, "%-10Lf %d", 1.75L, 33, 44, 55);
1038 ASSERT (result != NULL);
1039 ASSERT (strcmp (result, "1.750000 33") == 0);
1040 ASSERT (length == strlen (result));
1044 { /* FLAG_SHOWSIGN. */
1047 my_asnprintf (NULL, &length, "%+Lf %d", 1.75L, 33, 44, 55);
1048 ASSERT (result != NULL);
1049 ASSERT (strcmp (result, "+1.750000 33") == 0);
1050 ASSERT (length == strlen (result));
1057 my_asnprintf (NULL, &length, "% Lf %d", 1.75L, 33, 44, 55);
1058 ASSERT (result != NULL);
1059 ASSERT (strcmp (result, " 1.750000 33") == 0);
1060 ASSERT (length == strlen (result));
1067 my_asnprintf (NULL, &length, "%#Lf %d", 1.75L, 33, 44, 55);
1068 ASSERT (result != NULL);
1069 ASSERT (strcmp (result, "1.750000 33") == 0);
1070 ASSERT (length == strlen (result));
1077 my_asnprintf (NULL, &length, "%#.Lf %d", 1.75L, 33, 44, 55);
1078 ASSERT (result != NULL);
1079 ASSERT (strcmp (result, "2. 33") == 0);
1080 ASSERT (length == strlen (result));
1084 { /* FLAG_ZERO with finite number. */
1087 my_asnprintf (NULL, &length, "%015Lf %d", 1234.0L, 33, 44, 55);
1088 ASSERT (result != NULL);
1089 ASSERT (strcmp (result, "00001234.000000 33") == 0);
1090 ASSERT (length == strlen (result));
1094 { /* FLAG_ZERO with infinite number. */
1097 my_asnprintf (NULL, &length, "%015Lf %d", -1.0L / 0.0L, 33, 44, 55);
1098 ASSERT (result != NULL);
1099 ASSERT (strcmp (result, " -inf 33") == 0
1100 || strcmp (result, " -infinity 33") == 0);
1101 ASSERT (length == strlen (result));
1105 { /* FLAG_ZERO with NaN. */
1106 static long double zero = 0.0L;
1109 my_asnprintf (NULL, &length, "%015Lf %d", zero / zero, 33, 44, 55);
1110 ASSERT (result != NULL);
1111 ASSERT (strcmp (result, " nan 33") == 0);
1112 ASSERT (length == strlen (result));
1119 my_asnprintf (NULL, &length, "%.Lf %d", 1234.0L, 33, 44, 55);
1120 ASSERT (result != NULL);
1121 ASSERT (strcmp (result, "1234 33") == 0);
1122 ASSERT (length == strlen (result));
1126 /* Test the support of the %F format directive. */
1128 { /* A positive number. */
1131 my_asnprintf (NULL, &length, "%F %d", 12.75, 33, 44, 55);
1132 ASSERT (result != NULL);
1133 ASSERT (strcmp (result, "12.750000 33") == 0);
1134 ASSERT (length == strlen (result));
1138 { /* A larger positive number. */
1141 my_asnprintf (NULL, &length, "%F %d", 1234567.0, 33, 44, 55);
1142 ASSERT (result != NULL);
1143 ASSERT (strcmp (result, "1234567.000000 33") == 0);
1144 ASSERT (length == strlen (result));
1148 { /* A negative number. */
1151 my_asnprintf (NULL, &length, "%F %d", -0.03125, 33, 44, 55);
1152 ASSERT (result != NULL);
1153 ASSERT (strcmp (result, "-0.031250 33") == 0);
1154 ASSERT (length == strlen (result));
1158 { /* Positive zero. */
1161 my_asnprintf (NULL, &length, "%F %d", 0.0, 33, 44, 55);
1162 ASSERT (result != NULL);
1163 ASSERT (strcmp (result, "0.000000 33") == 0);
1164 ASSERT (length == strlen (result));
1168 { /* Negative zero. */
1171 my_asnprintf (NULL, &length, "%F %d", -0.0, 33, 44, 55);
1172 ASSERT (result != NULL);
1173 ASSERT (strcmp (result, "-0.000000 33") == 0);
1174 ASSERT (length == strlen (result));
1178 { /* Positive infinity. */
1181 my_asnprintf (NULL, &length, "%F %d", 1.0 / 0.0, 33, 44, 55);
1182 ASSERT (result != NULL);
1183 ASSERT (strcmp (result, "INF 33") == 0
1184 || strcmp (result, "INFINITY 33") == 0);
1185 ASSERT (length == strlen (result));
1189 { /* Negative infinity. */
1192 my_asnprintf (NULL, &length, "%F %d", -1.0 / 0.0, 33, 44, 55);
1193 ASSERT (result != NULL);
1194 ASSERT (strcmp (result, "-INF 33") == 0
1195 || strcmp (result, "-INFINITY 33") == 0);
1196 ASSERT (length == strlen (result));
1203 my_asnprintf (NULL, &length, "%F %d", NaN (), 33, 44, 55);
1204 ASSERT (result != NULL);
1205 ASSERT (strcmp (result, "NAN 33") == 0);
1206 ASSERT (length == strlen (result));
1213 my_asnprintf (NULL, &length, "%015F %d", 1234.0, 33, 44, 55);
1214 ASSERT (result != NULL);
1215 ASSERT (strcmp (result, "00001234.000000 33") == 0);
1216 ASSERT (length == strlen (result));
1220 { /* FLAG_ZERO with infinite number. */
1223 my_asnprintf (NULL, &length, "%015F %d", -1.0 / 0.0, 33, 44, 55);
1224 ASSERT (result != NULL);
1225 ASSERT (strcmp (result, " -INF 33") == 0
1226 || strcmp (result, " -INFINITY 33") == 0);
1227 ASSERT (length == strlen (result));
1234 my_asnprintf (NULL, &length, "%.F %d", 1234.0, 33, 44, 55);
1235 ASSERT (result != NULL);
1236 ASSERT (strcmp (result, "1234 33") == 0);
1237 ASSERT (length == strlen (result));
1241 { /* A positive number. */
1244 my_asnprintf (NULL, &length, "%LF %d", 12.75L, 33, 44, 55);
1245 ASSERT (result != NULL);
1246 ASSERT (strcmp (result, "12.750000 33") == 0);
1247 ASSERT (length == strlen (result));
1251 { /* A larger positive number. */
1254 my_asnprintf (NULL, &length, "%LF %d", 1234567.0L, 33, 44, 55);
1255 ASSERT (result != NULL);
1256 ASSERT (strcmp (result, "1234567.000000 33") == 0);
1257 ASSERT (length == strlen (result));
1261 { /* A negative number. */
1264 my_asnprintf (NULL, &length, "%LF %d", -0.03125L, 33, 44, 55);
1265 ASSERT (result != NULL);
1266 ASSERT (strcmp (result, "-0.031250 33") == 0);
1267 ASSERT (length == strlen (result));
1271 { /* Positive zero. */
1274 my_asnprintf (NULL, &length, "%LF %d", 0.0L, 33, 44, 55);
1275 ASSERT (result != NULL);
1276 ASSERT (strcmp (result, "0.000000 33") == 0);
1277 ASSERT (length == strlen (result));
1281 { /* Negative zero. */
1284 my_asnprintf (NULL, &length, "%LF %d", -0.0L, 33, 44, 55);
1285 ASSERT (result != NULL);
1286 ASSERT (strcmp (result, "-0.000000 33") == 0);
1287 ASSERT (length == strlen (result));
1291 { /* Positive infinity. */
1294 my_asnprintf (NULL, &length, "%LF %d", 1.0L / 0.0L, 33, 44, 55);
1295 ASSERT (result != NULL);
1296 ASSERT (strcmp (result, "INF 33") == 0
1297 || strcmp (result, "INFINITY 33") == 0);
1298 ASSERT (length == strlen (result));
1302 { /* Negative infinity. */
1305 my_asnprintf (NULL, &length, "%LF %d", -1.0L / 0.0L, 33, 44, 55);
1306 ASSERT (result != NULL);
1307 ASSERT (strcmp (result, "-INF 33") == 0
1308 || strcmp (result, "-INFINITY 33") == 0);
1309 ASSERT (length == strlen (result));
1314 static long double zero = 0.0L;
1317 my_asnprintf (NULL, &length, "%LF %d", zero / zero, 33, 44, 55);
1318 ASSERT (result != NULL);
1319 ASSERT (strcmp (result, "NAN 33") == 0);
1320 ASSERT (length == strlen (result));
1327 my_asnprintf (NULL, &length, "%015LF %d", 1234.0L, 33, 44, 55);
1328 ASSERT (result != NULL);
1329 ASSERT (strcmp (result, "00001234.000000 33") == 0);
1330 ASSERT (length == strlen (result));
1334 { /* FLAG_ZERO with infinite number. */
1337 my_asnprintf (NULL, &length, "%015LF %d", -1.0L / 0.0L, 33, 44, 55);
1338 ASSERT (result != NULL);
1339 ASSERT (strcmp (result, " -INF 33") == 0
1340 || strcmp (result, " -INFINITY 33") == 0);
1341 ASSERT (length == strlen (result));
1348 my_asnprintf (NULL, &length, "%.LF %d", 1234.0L, 33, 44, 55);
1349 ASSERT (result != NULL);
1350 ASSERT (strcmp (result, "1234 33") == 0);
1351 ASSERT (length == strlen (result));
1355 /* Test the support of the %n format directive. */
1361 my_asnprintf (NULL, &length, "%d %n", 123, &count, 33, 44, 55);
1362 ASSERT (result != NULL);
1363 ASSERT (strcmp (result, "123 ") == 0);
1364 ASSERT (length == strlen (result));
1365 ASSERT (count == 4);
1369 /* Test the support of the POSIX/XSI format strings with positions. */
1374 my_asnprintf (NULL, &length, "%2$d %1$d", 33, 55);
1375 ASSERT (result != NULL);
1376 ASSERT (strcmp (result, "55 33") == 0);
1377 ASSERT (length == strlen (result));
1381 /* Test the support of the grouping flag. */
1386 my_asnprintf (NULL, &length, "%'d %d", 1234567, 99);
1387 ASSERT (result != NULL);
1388 ASSERT (result[strlen (result) - 1] == '9');
1389 ASSERT (length == strlen (result));
1395 my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
1400 va_start (args, format);
1401 ret = vasnprintf (resultbuf, lengthp, format, args);
1409 test_function (my_asnprintf);
1415 test_function (asnprintf);
1419 main (int argc, char *argv[])