Avoid test failures on some versions of HP-UX 11.
[gnulib.git] / tests / test-vasnprintf-posix.c
1 /* Test of POSIX compatible vasnprintf() and asnprintf() functions.
2    Copyright (C) 2007 Free Software Foundation, Inc.
3
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)
7    any later version.
8
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.
13
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.  */
17
18 /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
19
20 #ifdef HAVE_CONFIG_H
21 # include <config.h>
22 #endif
23
24 #include "vasnprintf.h"
25
26 #include <stdarg.h>
27 #include <stddef.h>
28 #include <stdio.h>
29 #include <stdint.h>
30 #include <stdlib.h>
31 #include <string.h>
32
33 #define SIZEOF(array) (sizeof (array) / sizeof (array[0]))
34 #define ASSERT(expr) \
35   do                                                                         \
36     {                                                                        \
37       if (!(expr))                                                           \
38         {                                                                    \
39           fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
40           abort ();                                                          \
41         }                                                                    \
42     }                                                                        \
43   while (0)
44
45 /* The Compaq (ex-DEC) C 6.4 compiler chokes on the expression 0.0 / 0.0.  */
46 #ifdef __DECC
47 static double
48 NaN ()
49 {
50   static double zero = 0.0;
51   return zero / zero;
52 }
53 #else
54 # define NaN() (0.0 / 0.0)
55 #endif
56
57 /* The SGI MIPS floating-point format does not distinguish 0.0 and -0.0.  */
58 static int
59 have_minus_zero ()
60 {
61   static double plus_zero = 0.0;
62   static double minus_zero = -0.0;
63   return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
64 }
65
66 static int
67 strmatch (const char *pattern, const char *string)
68 {
69   if (strlen (pattern) != strlen (string))
70     return 0;
71   for (; *pattern != '\0'; pattern++, string++)
72     if (*pattern != '*' && *string != *pattern)
73       return 0;
74   return 1;
75 }
76
77 static void
78 test_function (char * (*my_asnprintf) (char *, size_t *, const char *, ...))
79 {
80   char buf[8];
81   int size;
82
83   /* Test return value convention.  */
84
85   for (size = 0; size <= 8; size++)
86     {
87       size_t length = size;
88       char *result = my_asnprintf (NULL, &length, "%d", 12345);
89       ASSERT (result != NULL);
90       ASSERT (strcmp (result, "12345") == 0);
91       ASSERT (length == 5);
92       free (result);
93     }
94
95   for (size = 0; size <= 8; size++)
96     {
97       size_t length;
98       char *result;
99
100       memcpy (buf, "DEADBEEF", 8);
101       length = size;
102       result = my_asnprintf (buf, &length, "%d", 12345);
103       ASSERT (result != NULL);
104       ASSERT (strcmp (result, "12345") == 0);
105       ASSERT (length == 5);
106       if (size < 6)
107         ASSERT (result != buf);
108       ASSERT (memcmp (buf + size, "DEADBEEF" + size, 8 - size) == 0);
109       if (result != buf)
110         free (result);
111     }
112
113   /* Test support of size specifiers as in C99.  */
114
115   {
116     size_t length;
117     char *result =
118       my_asnprintf (NULL, &length, "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
119     ASSERT (result != NULL);
120     ASSERT (strcmp (result, "12345671 33") == 0);
121     ASSERT (length == strlen (result));
122     free (result);
123   }
124
125   {
126     size_t length;
127     char *result =
128       my_asnprintf (NULL, &length, "%zu %d", (size_t) 12345672, 33, 44, 55);
129     ASSERT (result != NULL);
130     ASSERT (strcmp (result, "12345672 33") == 0);
131     ASSERT (length == strlen (result));
132     free (result);
133   }
134
135   {
136     size_t length;
137     char *result =
138       my_asnprintf (NULL, &length, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
139     ASSERT (result != NULL);
140     ASSERT (strcmp (result, "12345673 33") == 0);
141     ASSERT (length == strlen (result));
142     free (result);
143   }
144
145   {
146     size_t length;
147     char *result =
148       my_asnprintf (NULL, &length, "%Lg %d", (long double) 1.5, 33, 44, 55);
149     ASSERT (result != NULL);
150     ASSERT (strcmp (result, "1.5 33") == 0);
151     ASSERT (length == strlen (result));
152     free (result);
153   }
154
155   /* Test the support of the 'a' and 'A' conversion specifier for hexadecimal
156      output of floating-point numbers.  */
157
158   { /* A positive number.  */
159     size_t length;
160     char *result =
161       my_asnprintf (NULL, &length, "%a %d", 3.1416015625, 33, 44, 55);
162     ASSERT (result != NULL);
163     ASSERT (strcmp (result, "0x1.922p+1 33") == 0
164             || strcmp (result, "0x3.244p+0 33") == 0
165             || strcmp (result, "0x6.488p-1 33") == 0
166             || strcmp (result, "0xc.91p-2 33") == 0);
167     ASSERT (length == strlen (result));
168     free (result);
169   }
170
171   { /* A negative number.  */
172     size_t length;
173     char *result =
174       my_asnprintf (NULL, &length, "%A %d", -3.1416015625, 33, 44, 55);
175     ASSERT (result != NULL);
176     ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
177             || strcmp (result, "-0X3.244P+0 33") == 0
178             || strcmp (result, "-0X6.488P-1 33") == 0
179             || strcmp (result, "-0XC.91P-2 33") == 0);
180     ASSERT (length == strlen (result));
181     free (result);
182   }
183
184   { /* Positive zero.  */
185     size_t length;
186     char *result =
187       my_asnprintf (NULL, &length, "%a %d", 0.0, 33, 44, 55);
188     ASSERT (result != NULL);
189     ASSERT (strcmp (result, "0x0p+0 33") == 0);
190     ASSERT (length == strlen (result));
191     free (result);
192   }
193
194   { /* Negative zero.  */
195     size_t length;
196     char *result =
197       my_asnprintf (NULL, &length, "%a %d", -0.0, 33, 44, 55);
198     ASSERT (result != NULL);
199     if (have_minus_zero ())
200       ASSERT (strcmp (result, "-0x0p+0 33") == 0);
201     ASSERT (length == strlen (result));
202     free (result);
203   }
204
205   { /* Positive infinity.  */
206     size_t length;
207     char *result =
208       my_asnprintf (NULL, &length, "%a %d", 1.0 / 0.0, 33, 44, 55);
209     ASSERT (result != NULL);
210     ASSERT (strcmp (result, "inf 33") == 0);
211     ASSERT (length == strlen (result));
212     free (result);
213   }
214
215   { /* Negative infinity.  */
216     size_t length;
217     char *result =
218       my_asnprintf (NULL, &length, "%a %d", -1.0 / 0.0, 33, 44, 55);
219     ASSERT (result != NULL);
220     ASSERT (strcmp (result, "-inf 33") == 0);
221     ASSERT (length == strlen (result));
222     free (result);
223   }
224
225   { /* NaN.  */
226     size_t length;
227     char *result =
228       my_asnprintf (NULL, &length, "%a %d", NaN (), 33, 44, 55);
229     ASSERT (result != NULL);
230     ASSERT (strlen (result) >= 3 + 3
231             && (memcmp (result, "nan", 3) == 0
232                 || memcmp (result, "-nan", 4) == 0)
233             && strcmp (result + strlen (result) - 3, " 33") == 0);
234     ASSERT (length == strlen (result));
235     free (result);
236   }
237
238   { /* Rounding near the decimal point.  */
239     size_t length;
240     char *result =
241       my_asnprintf (NULL, &length, "%.0a %d", 1.5, 33, 44, 55);
242     ASSERT (result != NULL);
243     ASSERT (strcmp (result, "0x2p+0 33") == 0
244             || strcmp (result, "0x3p-1 33") == 0
245             || strcmp (result, "0x6p-2 33") == 0
246             || strcmp (result, "0xcp-3 33") == 0);
247     ASSERT (length == strlen (result));
248     free (result);
249   }
250
251   { /* Rounding with precision 0.  */
252     size_t length;
253     char *result =
254       my_asnprintf (NULL, &length, "%.0a %d", 1.51, 33, 44, 55);
255     ASSERT (result != NULL);
256     ASSERT (strcmp (result, "0x2p+0 33") == 0
257             || strcmp (result, "0x3p-1 33") == 0
258             || strcmp (result, "0x6p-2 33") == 0
259             || strcmp (result, "0xcp-3 33") == 0);
260     ASSERT (length == strlen (result));
261     free (result);
262   }
263
264   { /* Rounding with precision 1.  */
265     size_t length;
266     char *result =
267       my_asnprintf (NULL, &length, "%.1a %d", 1.51, 33, 44, 55);
268     ASSERT (result != NULL);
269     ASSERT (strcmp (result, "0x1.8p+0 33") == 0
270             || strcmp (result, "0x3.0p-1 33") == 0
271             || strcmp (result, "0x6.1p-2 33") == 0
272             || strcmp (result, "0xc.1p-3 33") == 0);
273     ASSERT (length == strlen (result));
274     free (result);
275   }
276
277   { /* Rounding with precision 2.  */
278     size_t length;
279     char *result =
280       my_asnprintf (NULL, &length, "%.2a %d", 1.51, 33, 44, 55);
281     ASSERT (result != NULL);
282     ASSERT (strcmp (result, "0x1.83p+0 33") == 0
283             || strcmp (result, "0x3.05p-1 33") == 0
284             || strcmp (result, "0x6.0ap-2 33") == 0
285             || strcmp (result, "0xc.14p-3 33") == 0);
286     ASSERT (length == strlen (result));
287     free (result);
288   }
289
290   { /* Rounding with precision 3.  */
291     size_t length;
292     char *result =
293       my_asnprintf (NULL, &length, "%.3a %d", 1.51, 33, 44, 55);
294     ASSERT (result != NULL);
295     ASSERT (strcmp (result, "0x1.829p+0 33") == 0
296             || strcmp (result, "0x3.052p-1 33") == 0
297             || strcmp (result, "0x6.0a4p-2 33") == 0
298             || strcmp (result, "0xc.148p-3 33") == 0);
299     ASSERT (length == strlen (result));
300     free (result);
301   }
302
303   { /* Rounding can turn a ...FFF into a ...000.  */
304     size_t length;
305     char *result =
306       my_asnprintf (NULL, &length, "%.3a %d", 1.49999, 33, 44, 55);
307     ASSERT (result != NULL);
308     ASSERT (strcmp (result, "0x1.800p+0 33") == 0
309             || strcmp (result, "0x3.000p-1 33") == 0
310             || strcmp (result, "0x6.000p-2 33") == 0
311             || strcmp (result, "0xc.000p-3 33") == 0);
312     ASSERT (length == strlen (result));
313     free (result);
314   }
315
316   { /* Rounding can turn a ...FFF into a ...000.
317        This shows a MacOS X 10.3.9 (Darwin 7.9) bug.  */
318     size_t length;
319     char *result =
320       my_asnprintf (NULL, &length, "%.1a %d", 1.999, 33, 44, 55);
321     ASSERT (result != NULL);
322     ASSERT (strcmp (result, "0x1.0p+1 33") == 0
323             || strcmp (result, "0x2.0p+0 33") == 0
324             || strcmp (result, "0x4.0p-1 33") == 0
325             || strcmp (result, "0x8.0p-2 33") == 0);
326     ASSERT (length == strlen (result));
327     free (result);
328   }
329
330   { /* Width.  */
331     size_t length;
332     char *result =
333       my_asnprintf (NULL, &length, "%10a %d", 1.75, 33, 44, 55);
334     ASSERT (result != NULL);
335     ASSERT (strcmp (result, "  0x1.cp+0 33") == 0
336             || strcmp (result, "  0x3.8p-1 33") == 0
337             || strcmp (result, "    0x7p-2 33") == 0
338             || strcmp (result, "    0xep-3 33") == 0);
339     ASSERT (length == strlen (result));
340     free (result);
341   }
342
343   { /* Small precision.  */
344     size_t length;
345     char *result =
346       my_asnprintf (NULL, &length, "%.10a %d", 1.75, 33, 44, 55);
347     ASSERT (result != NULL);
348     ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
349             || strcmp (result, "0x3.8000000000p-1 33") == 0
350             || strcmp (result, "0x7.0000000000p-2 33") == 0
351             || strcmp (result, "0xe.0000000000p-3 33") == 0);
352     ASSERT (length == strlen (result));
353     free (result);
354   }
355
356   { /* Large precision.  */
357     size_t length;
358     char *result =
359       my_asnprintf (NULL, &length, "%.50a %d", 1.75, 33, 44, 55);
360     ASSERT (result != NULL);
361     ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
362             || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
363             || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
364             || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
365     ASSERT (length == strlen (result));
366     free (result);
367   }
368
369   { /* FLAG_LEFT.  */
370     size_t length;
371     char *result =
372       my_asnprintf (NULL, &length, "%-10a %d", 1.75, 33, 44, 55);
373     ASSERT (result != NULL);
374     ASSERT (strcmp (result, "0x1.cp+0   33") == 0
375             || strcmp (result, "0x3.8p-1   33") == 0
376             || strcmp (result, "0x7p-2     33") == 0
377             || strcmp (result, "0xep-3     33") == 0);
378     ASSERT (length == strlen (result));
379     free (result);
380   }
381
382   { /* FLAG_SHOWSIGN.  */
383     size_t length;
384     char *result =
385       my_asnprintf (NULL, &length, "%+a %d", 1.75, 33, 44, 55);
386     ASSERT (result != NULL);
387     ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
388             || strcmp (result, "+0x3.8p-1 33") == 0
389             || strcmp (result, "+0x7p-2 33") == 0
390             || strcmp (result, "+0xep-3 33") == 0);
391     ASSERT (length == strlen (result));
392     free (result);
393   }
394
395   { /* FLAG_SPACE.  */
396     size_t length;
397     char *result =
398       my_asnprintf (NULL, &length, "% a %d", 1.75, 33, 44, 55);
399     ASSERT (result != NULL);
400     ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
401             || strcmp (result, " 0x3.8p-1 33") == 0
402             || strcmp (result, " 0x7p-2 33") == 0
403             || strcmp (result, " 0xep-3 33") == 0);
404     ASSERT (length == strlen (result));
405     free (result);
406   }
407
408   { /* FLAG_ALT.  */
409     size_t length;
410     char *result =
411       my_asnprintf (NULL, &length, "%#a %d", 1.75, 33, 44, 55);
412     ASSERT (result != NULL);
413     ASSERT (strcmp (result, "0x1.cp+0 33") == 0
414             || strcmp (result, "0x3.8p-1 33") == 0
415             || strcmp (result, "0x7.p-2 33") == 0
416             || strcmp (result, "0xe.p-3 33") == 0);
417     ASSERT (length == strlen (result));
418     free (result);
419   }
420
421   { /* FLAG_ALT.  */
422     size_t length;
423     char *result =
424       my_asnprintf (NULL, &length, "%#a %d", 1.0, 33, 44, 55);
425     ASSERT (result != NULL);
426     ASSERT (strcmp (result, "0x1.p+0 33") == 0
427             || strcmp (result, "0x2.p-1 33") == 0
428             || strcmp (result, "0x4.p-2 33") == 0
429             || strcmp (result, "0x8.p-3 33") == 0);
430     ASSERT (length == strlen (result));
431     free (result);
432   }
433
434   { /* FLAG_ZERO with finite number.  */
435     size_t length;
436     char *result =
437       my_asnprintf (NULL, &length, "%010a %d", 1.75, 33, 44, 55);
438     ASSERT (result != NULL);
439     ASSERT (strcmp (result, "0x001.cp+0 33") == 0
440             || strcmp (result, "0x003.8p-1 33") == 0
441             || strcmp (result, "0x00007p-2 33") == 0
442             || strcmp (result, "0x0000ep-3 33") == 0);
443     ASSERT (length == strlen (result));
444     free (result);
445   }
446
447   { /* FLAG_ZERO with infinite number.  */
448     size_t length;
449     char *result =
450       my_asnprintf (NULL, &length, "%010a %d", 1.0 / 0.0, 33, 44, 55);
451     ASSERT (result != NULL);
452     /* "0000000inf 33" is not a valid result; see
453        <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
454     ASSERT (strcmp (result, "       inf 33") == 0);
455     ASSERT (length == strlen (result));
456     free (result);
457   }
458
459   { /* FLAG_ZERO with NaN.  */
460     size_t length;
461     char *result =
462       my_asnprintf (NULL, &length, "%020a %d", NaN (), 33, 44, 55);
463     ASSERT (result != NULL);
464     /* "0000000nan 33" is not a valid result; see
465        <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
466     ASSERT (strlen (result) == 20 + 3
467             && (memcmp (result + strspn (result, " "), "nan", 3) == 0
468                 || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
469             && strcmp (result + strlen (result) - 3, " 33") == 0);
470     ASSERT (length == strlen (result));
471     free (result);
472   }
473
474   { /* A positive number.  */
475     size_t length;
476     char *result =
477       my_asnprintf (NULL, &length, "%La %d", 3.1416015625L, 33, 44, 55);
478     ASSERT (result != NULL);
479     ASSERT (strcmp (result, "0x1.922p+1 33") == 0
480             || strcmp (result, "0x3.244p+0 33") == 0
481             || strcmp (result, "0x6.488p-1 33") == 0
482             || strcmp (result, "0xc.91p-2 33") == 0);
483     ASSERT (length == strlen (result));
484     free (result);
485   }
486
487   { /* A negative number.  */
488     size_t length;
489     char *result =
490       my_asnprintf (NULL, &length, "%LA %d", -3.1416015625L, 33, 44, 55);
491     ASSERT (result != NULL);
492     ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
493             || strcmp (result, "-0X3.244P+0 33") == 0
494             || strcmp (result, "-0X6.488P-1 33") == 0
495             || strcmp (result, "-0XC.91P-2 33") == 0);
496     ASSERT (length == strlen (result));
497     free (result);
498   }
499
500   { /* Positive zero.  */
501     size_t length;
502     char *result =
503       my_asnprintf (NULL, &length, "%La %d", 0.0L, 33, 44, 55);
504     ASSERT (result != NULL);
505     ASSERT (strcmp (result, "0x0p+0 33") == 0);
506     ASSERT (length == strlen (result));
507     free (result);
508   }
509
510   { /* Negative zero.  */
511     size_t length;
512     char *result =
513       my_asnprintf (NULL, &length, "%La %d", -0.0L, 33, 44, 55);
514     ASSERT (result != NULL);
515     if (have_minus_zero ())
516       ASSERT (strcmp (result, "-0x0p+0 33") == 0);
517     ASSERT (length == strlen (result));
518     free (result);
519   }
520
521   { /* Positive infinity.  */
522     size_t length;
523     char *result =
524       my_asnprintf (NULL, &length, "%La %d", 1.0L / 0.0L, 33, 44, 55);
525     ASSERT (result != NULL);
526     ASSERT (strcmp (result, "inf 33") == 0);
527     ASSERT (length == strlen (result));
528     free (result);
529   }
530
531   { /* Negative infinity.  */
532     size_t length;
533     char *result =
534       my_asnprintf (NULL, &length, "%La %d", -1.0L / 0.0L, 33, 44, 55);
535     ASSERT (result != NULL);
536     ASSERT (strcmp (result, "-inf 33") == 0);
537     ASSERT (length == strlen (result));
538     free (result);
539   }
540
541   { /* NaN.  */
542     size_t length;
543     char *result =
544       my_asnprintf (NULL, &length, "%La %d", 0.0L / 0.0L, 33, 44, 55);
545     ASSERT (result != NULL);
546     ASSERT (strlen (result) >= 3 + 3
547             && (memcmp (result, "nan", 3) == 0
548                 || memcmp (result, "-nan", 4) == 0)
549             && strcmp (result + strlen (result) - 3, " 33") == 0);
550     ASSERT (length == strlen (result));
551     free (result);
552   }
553
554   { /* Rounding near the decimal point.  */
555     size_t length;
556     char *result =
557       my_asnprintf (NULL, &length, "%.0La %d", 1.5L, 33, 44, 55);
558     ASSERT (result != NULL);
559     ASSERT (strcmp (result, "0x2p+0 33") == 0
560             || strcmp (result, "0x3p-1 33") == 0
561             || strcmp (result, "0x6p-2 33") == 0
562             || strcmp (result, "0xcp-3 33") == 0);
563     ASSERT (length == strlen (result));
564     free (result);
565   }
566
567   { /* Rounding with precision 0.  */
568     size_t length;
569     char *result =
570       my_asnprintf (NULL, &length, "%.0La %d", 1.51L, 33, 44, 55);
571     ASSERT (result != NULL);
572     ASSERT (strcmp (result, "0x2p+0 33") == 0
573             || strcmp (result, "0x3p-1 33") == 0
574             || strcmp (result, "0x6p-2 33") == 0
575             || strcmp (result, "0xcp-3 33") == 0);
576     ASSERT (length == strlen (result));
577     free (result);
578   }
579
580   { /* Rounding with precision 1.  */
581     size_t length;
582     char *result =
583       my_asnprintf (NULL, &length, "%.1La %d", 1.51L, 33, 44, 55);
584     ASSERT (result != NULL);
585     ASSERT (strcmp (result, "0x1.8p+0 33") == 0
586             || strcmp (result, "0x3.0p-1 33") == 0
587             || strcmp (result, "0x6.1p-2 33") == 0
588             || strcmp (result, "0xc.1p-3 33") == 0);
589     ASSERT (length == strlen (result));
590     free (result);
591   }
592
593   { /* Rounding with precision 2.  */
594     size_t length;
595     char *result =
596       my_asnprintf (NULL, &length, "%.2La %d", 1.51L, 33, 44, 55);
597     ASSERT (result != NULL);
598     ASSERT (strcmp (result, "0x1.83p+0 33") == 0
599             || strcmp (result, "0x3.05p-1 33") == 0
600             || strcmp (result, "0x6.0ap-2 33") == 0
601             || strcmp (result, "0xc.14p-3 33") == 0);
602     ASSERT (length == strlen (result));
603     free (result);
604   }
605
606   { /* Rounding with precision 3.  */
607     size_t length;
608     char *result =
609       my_asnprintf (NULL, &length, "%.3La %d", 1.51L, 33, 44, 55);
610     ASSERT (result != NULL);
611     ASSERT (strcmp (result, "0x1.829p+0 33") == 0
612             || strcmp (result, "0x3.052p-1 33") == 0
613             || strcmp (result, "0x6.0a4p-2 33") == 0
614             || strcmp (result, "0xc.148p-3 33") == 0);
615     ASSERT (length == strlen (result));
616     free (result);
617   }
618
619   { /* Rounding can turn a ...FFF into a ...000.  */
620     size_t length;
621     char *result =
622       my_asnprintf (NULL, &length, "%.3La %d", 1.49999L, 33, 44, 55);
623     ASSERT (result != NULL);
624     ASSERT (strcmp (result, "0x1.800p+0 33") == 0
625             || strcmp (result, "0x3.000p-1 33") == 0
626             || strcmp (result, "0x6.000p-2 33") == 0
627             || strcmp (result, "0xc.000p-3 33") == 0);
628     ASSERT (length == strlen (result));
629     free (result);
630   }
631
632   { /* Rounding can turn a ...FFF into a ...000.
633        This shows a MacOS X 10.3.9 (Darwin 7.9) bug and a
634        glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
635     size_t length;
636     char *result =
637       my_asnprintf (NULL, &length, "%.1La %d", 1.999L, 33, 44, 55);
638     ASSERT (result != NULL);
639     ASSERT (strcmp (result, "0x1.0p+1 33") == 0
640             || strcmp (result, "0x2.0p+0 33") == 0
641             || strcmp (result, "0x4.0p-1 33") == 0
642             || strcmp (result, "0x8.0p-2 33") == 0);
643     ASSERT (length == strlen (result));
644     free (result);
645   }
646
647   { /* Width.  */
648     size_t length;
649     char *result =
650       my_asnprintf (NULL, &length, "%10La %d", 1.75L, 33, 44, 55);
651     ASSERT (result != NULL);
652     ASSERT (strcmp (result, "  0x1.cp+0 33") == 0
653             || strcmp (result, "  0x3.8p-1 33") == 0
654             || strcmp (result, "    0x7p-2 33") == 0
655             || strcmp (result, "    0xep-3 33") == 0);
656     ASSERT (length == strlen (result));
657     free (result);
658   }
659
660   { /* Small precision.  */
661     size_t length;
662     char *result =
663       my_asnprintf (NULL, &length, "%.10La %d", 1.75L, 33, 44, 55);
664     ASSERT (result != NULL);
665     ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
666             || strcmp (result, "0x3.8000000000p-1 33") == 0
667             || strcmp (result, "0x7.0000000000p-2 33") == 0
668             || strcmp (result, "0xe.0000000000p-3 33") == 0);
669     ASSERT (length == strlen (result));
670     free (result);
671   }
672
673   { /* Large precision.  */
674     size_t length;
675     char *result =
676       my_asnprintf (NULL, &length, "%.50La %d", 1.75L, 33, 44, 55);
677     ASSERT (result != NULL);
678     ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
679             || strcmp (result, "0x3.80000000000000000000000000000000000000000000000000p-1 33") == 0
680             || strcmp (result, "0x7.00000000000000000000000000000000000000000000000000p-2 33") == 0
681             || strcmp (result, "0xe.00000000000000000000000000000000000000000000000000p-3 33") == 0);
682     ASSERT (length == strlen (result));
683     free (result);
684   }
685
686   { /* FLAG_LEFT.  */
687     size_t length;
688     char *result =
689       my_asnprintf (NULL, &length, "%-10La %d", 1.75L, 33, 44, 55);
690     ASSERT (result != NULL);
691     ASSERT (strcmp (result, "0x1.cp+0   33") == 0
692             || strcmp (result, "0x3.8p-1   33") == 0
693             || strcmp (result, "0x7p-2     33") == 0
694             || strcmp (result, "0xep-3     33") == 0);
695     ASSERT (length == strlen (result));
696     free (result);
697   }
698
699   { /* FLAG_SHOWSIGN.  */
700     size_t length;
701     char *result =
702       my_asnprintf (NULL, &length, "%+La %d", 1.75L, 33, 44, 55);
703     ASSERT (result != NULL);
704     ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
705             || strcmp (result, "+0x3.8p-1 33") == 0
706             || strcmp (result, "+0x7p-2 33") == 0
707             || strcmp (result, "+0xep-3 33") == 0);
708     ASSERT (length == strlen (result));
709     free (result);
710   }
711
712   { /* FLAG_SPACE.  */
713     size_t length;
714     char *result =
715       my_asnprintf (NULL, &length, "% La %d", 1.75L, 33, 44, 55);
716     ASSERT (result != NULL);
717     ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
718             || strcmp (result, " 0x3.8p-1 33") == 0
719             || strcmp (result, " 0x7p-2 33") == 0
720             || strcmp (result, " 0xep-3 33") == 0);
721     ASSERT (length == strlen (result));
722     free (result);
723   }
724
725   { /* FLAG_ALT.  */
726     size_t length;
727     char *result =
728       my_asnprintf (NULL, &length, "%#La %d", 1.75L, 33, 44, 55);
729     ASSERT (result != NULL);
730     ASSERT (strcmp (result, "0x1.cp+0 33") == 0
731             || strcmp (result, "0x3.8p-1 33") == 0
732             || strcmp (result, "0x7.p-2 33") == 0
733             || strcmp (result, "0xe.p-3 33") == 0);
734     ASSERT (length == strlen (result));
735     free (result);
736   }
737
738   { /* FLAG_ALT.  */
739     size_t length;
740     char *result =
741       my_asnprintf (NULL, &length, "%#La %d", 1.0L, 33, 44, 55);
742     ASSERT (result != NULL);
743     ASSERT (strcmp (result, "0x1.p+0 33") == 0
744             || strcmp (result, "0x2.p-1 33") == 0
745             || strcmp (result, "0x4.p-2 33") == 0
746             || strcmp (result, "0x8.p-3 33") == 0);
747     ASSERT (length == strlen (result));
748     free (result);
749   }
750
751   { /* FLAG_ZERO with finite number.  */
752     size_t length;
753     char *result =
754       my_asnprintf (NULL, &length, "%010La %d", 1.75L, 33, 44, 55);
755     ASSERT (result != NULL);
756     ASSERT (strcmp (result, "0x001.cp+0 33") == 0
757             || strcmp (result, "0x003.8p-1 33") == 0
758             || strcmp (result, "0x00007p-2 33") == 0
759             || strcmp (result, "0x0000ep-3 33") == 0);
760     ASSERT (length == strlen (result));
761     free (result);
762   }
763
764   { /* FLAG_ZERO with infinite number.  */
765     size_t length;
766     char *result =
767       my_asnprintf (NULL, &length, "%010La %d", 1.0L / 0.0L, 33, 44, 55);
768     ASSERT (result != NULL);
769     /* "0000000inf 33" is not a valid result; see
770        <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
771     ASSERT (strcmp (result, "       inf 33") == 0);
772     ASSERT (length == strlen (result));
773     free (result);
774   }
775
776   { /* FLAG_ZERO with NaN.  */
777     size_t length;
778     char *result =
779       my_asnprintf (NULL, &length, "%020La %d", 0.0L / 0.0L, 33, 44, 55);
780     ASSERT (result != NULL);
781     /* "0000000nan 33" is not a valid result; see
782        <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
783     ASSERT (strlen (result) == 20 + 3
784             && (memcmp (result + strspn (result, " "), "nan", 3) == 0
785                 || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
786             && strcmp (result + strlen (result) - 3, " 33") == 0);
787     ASSERT (length == strlen (result));
788     free (result);
789   }
790
791   /* Test the support of the %f format directive.  */
792
793   { /* A positive number.  */
794     size_t length;
795     char *result =
796       my_asnprintf (NULL, &length, "%f %d", 12.75, 33, 44, 55);
797     ASSERT (result != NULL);
798     ASSERT (strcmp (result, "12.750000 33") == 0);
799     ASSERT (length == strlen (result));
800     free (result);
801   }
802
803   { /* A larger positive number.  */
804     size_t length;
805     char *result =
806       my_asnprintf (NULL, &length, "%f %d", 1234567.0, 33, 44, 55);
807     ASSERT (result != NULL);
808     ASSERT (strcmp (result, "1234567.000000 33") == 0);
809     ASSERT (length == strlen (result));
810     free (result);
811   }
812
813   { /* Small and large positive numbers.  */
814     static struct { double value; const char *string; } data[] =
815       {
816         { 1.234321234321234e-37, "0.000000" },
817         { 1.234321234321234e-36, "0.000000" },
818         { 1.234321234321234e-35, "0.000000" },
819         { 1.234321234321234e-34, "0.000000" },
820         { 1.234321234321234e-33, "0.000000" },
821         { 1.234321234321234e-32, "0.000000" },
822         { 1.234321234321234e-31, "0.000000" },
823         { 1.234321234321234e-30, "0.000000" },
824         { 1.234321234321234e-29, "0.000000" },
825         { 1.234321234321234e-28, "0.000000" },
826         { 1.234321234321234e-27, "0.000000" },
827         { 1.234321234321234e-26, "0.000000" },
828         { 1.234321234321234e-25, "0.000000" },
829         { 1.234321234321234e-24, "0.000000" },
830         { 1.234321234321234e-23, "0.000000" },
831         { 1.234321234321234e-22, "0.000000" },
832         { 1.234321234321234e-21, "0.000000" },
833         { 1.234321234321234e-20, "0.000000" },
834         { 1.234321234321234e-19, "0.000000" },
835         { 1.234321234321234e-18, "0.000000" },
836         { 1.234321234321234e-17, "0.000000" },
837         { 1.234321234321234e-16, "0.000000" },
838         { 1.234321234321234e-15, "0.000000" },
839         { 1.234321234321234e-14, "0.000000" },
840         { 1.234321234321234e-13, "0.000000" },
841         { 1.234321234321234e-12, "0.000000" },
842         { 1.234321234321234e-11, "0.000000" },
843         { 1.234321234321234e-10, "0.000000" },
844         { 1.234321234321234e-9, "0.000000" },
845         { 1.234321234321234e-8, "0.000000" },
846         { 1.234321234321234e-7, "0.000000" },
847         { 1.234321234321234e-6, "0.000001" },
848         { 1.234321234321234e-5, "0.000012" },
849         { 1.234321234321234e-4, "0.000123" },
850         { 1.234321234321234e-3, "0.001234" },
851         { 1.234321234321234e-2, "0.012343" },
852         { 1.234321234321234e-1, "0.123432" },
853         { 1.234321234321234, "1.234321" },
854         { 1.234321234321234e1, "12.343212" },
855         { 1.234321234321234e2, "123.432123" },
856         { 1.234321234321234e3, "1234.321234" },
857         { 1.234321234321234e4, "12343.212343" },
858         { 1.234321234321234e5, "123432.123432" },
859         { 1.234321234321234e6, "1234321.234321" },
860         { 1.234321234321234e7, "12343212.343212" },
861         { 1.234321234321234e8, "123432123.432123" },
862         { 1.234321234321234e9, "1234321234.321234" },
863         { 1.234321234321234e10, "12343212343.2123**" },
864         { 1.234321234321234e11, "123432123432.123***" },
865         { 1.234321234321234e12, "1234321234321.23****" },
866         { 1.234321234321234e13, "12343212343212.3*****" },
867         { 1.234321234321234e14, "123432123432123.******" },
868         { 1.234321234321234e15, "1234321234321234.000000" },
869         { 1.234321234321234e16, "123432123432123**.000000" },
870         { 1.234321234321234e17, "123432123432123***.000000" },
871         { 1.234321234321234e18, "123432123432123****.000000" },
872         { 1.234321234321234e19, "123432123432123*****.000000" },
873         { 1.234321234321234e20, "123432123432123******.000000" },
874         { 1.234321234321234e21, "123432123432123*******.000000" },
875         { 1.234321234321234e22, "123432123432123********.000000" },
876         { 1.234321234321234e23, "123432123432123*********.000000" },
877         { 1.234321234321234e24, "123432123432123**********.000000" },
878         { 1.234321234321234e25, "123432123432123***********.000000" },
879         { 1.234321234321234e26, "123432123432123************.000000" },
880         { 1.234321234321234e27, "123432123432123*************.000000" },
881         { 1.234321234321234e28, "123432123432123**************.000000" },
882         { 1.234321234321234e29, "123432123432123***************.000000" },
883         { 1.234321234321234e30, "123432123432123****************.000000" },
884         { 1.234321234321234e31, "123432123432123*****************.000000" },
885         { 1.234321234321234e32, "123432123432123******************.000000" },
886         { 1.234321234321234e33, "123432123432123*******************.000000" },
887         { 1.234321234321234e34, "123432123432123********************.000000" },
888         { 1.234321234321234e35, "123432123432123*********************.000000" },
889         { 1.234321234321234e36, "123432123432123**********************.000000" }
890       };
891     size_t k;
892     for (k = 0; k < SIZEOF (data); k++)
893       {
894         size_t length;
895         char *result =
896           my_asnprintf (NULL, &length, "%f", data[k].value);
897         ASSERT (result != NULL);
898         ASSERT (strmatch (data[k].string, result));
899         ASSERT (length == strlen (result));
900         free (result);
901       }
902   }
903
904   { /* A negative number.  */
905     size_t length;
906     char *result =
907       my_asnprintf (NULL, &length, "%f %d", -0.03125, 33, 44, 55);
908     ASSERT (result != NULL);
909     ASSERT (strcmp (result, "-0.031250 33") == 0);
910     ASSERT (length == strlen (result));
911     free (result);
912   }
913
914   { /* Positive zero.  */
915     size_t length;
916     char *result =
917       my_asnprintf (NULL, &length, "%f %d", 0.0, 33, 44, 55);
918     ASSERT (result != NULL);
919     ASSERT (strcmp (result, "0.000000 33") == 0);
920     ASSERT (length == strlen (result));
921     free (result);
922   }
923
924   { /* Negative zero.  */
925     size_t length;
926     char *result =
927       my_asnprintf (NULL, &length, "%f %d", -0.0, 33, 44, 55);
928     ASSERT (result != NULL);
929     if (have_minus_zero ())
930       ASSERT (strcmp (result, "-0.000000 33") == 0);
931     ASSERT (length == strlen (result));
932     free (result);
933   }
934
935   { /* Positive infinity.  */
936     size_t length;
937     char *result =
938       my_asnprintf (NULL, &length, "%f %d", 1.0 / 0.0, 33, 44, 55);
939     ASSERT (result != NULL);
940     ASSERT (strcmp (result, "inf 33") == 0
941             || strcmp (result, "infinity 33") == 0);
942     ASSERT (length == strlen (result));
943     free (result);
944   }
945
946   { /* Negative infinity.  */
947     size_t length;
948     char *result =
949       my_asnprintf (NULL, &length, "%f %d", -1.0 / 0.0, 33, 44, 55);
950     ASSERT (result != NULL);
951     ASSERT (strcmp (result, "-inf 33") == 0
952             || strcmp (result, "-infinity 33") == 0);
953     ASSERT (length == strlen (result));
954     free (result);
955   }
956
957   { /* NaN.  */
958     size_t length;
959     char *result =
960       my_asnprintf (NULL, &length, "%f %d", NaN (), 33, 44, 55);
961     ASSERT (result != NULL);
962     ASSERT (strlen (result) >= 3 + 3
963             && (memcmp (result, "nan", 3) == 0
964                 || memcmp (result, "-nan", 4) == 0)
965             && strcmp (result + strlen (result) - 3, " 33") == 0);
966     ASSERT (length == strlen (result));
967     free (result);
968   }
969
970   { /* Width.  */
971     size_t length;
972     char *result =
973       my_asnprintf (NULL, &length, "%10f %d", 1.75, 33, 44, 55);
974     ASSERT (result != NULL);
975     ASSERT (strcmp (result, "  1.750000 33") == 0);
976     ASSERT (length == strlen (result));
977     free (result);
978   }
979
980   { /* FLAG_LEFT.  */
981     size_t length;
982     char *result =
983       my_asnprintf (NULL, &length, "%-10f %d", 1.75, 33, 44, 55);
984     ASSERT (result != NULL);
985     ASSERT (strcmp (result, "1.750000   33") == 0);
986     ASSERT (length == strlen (result));
987     free (result);
988   }
989
990   { /* FLAG_SHOWSIGN.  */
991     size_t length;
992     char *result =
993       my_asnprintf (NULL, &length, "%+f %d", 1.75, 33, 44, 55);
994     ASSERT (result != NULL);
995     ASSERT (strcmp (result, "+1.750000 33") == 0);
996     ASSERT (length == strlen (result));
997     free (result);
998   }
999
1000   { /* FLAG_SPACE.  */
1001     size_t length;
1002     char *result =
1003       my_asnprintf (NULL, &length, "% f %d", 1.75, 33, 44, 55);
1004     ASSERT (result != NULL);
1005     ASSERT (strcmp (result, " 1.750000 33") == 0);
1006     ASSERT (length == strlen (result));
1007     free (result);
1008   }
1009
1010   { /* FLAG_ALT.  */
1011     size_t length;
1012     char *result =
1013       my_asnprintf (NULL, &length, "%#f %d", 1.75, 33, 44, 55);
1014     ASSERT (result != NULL);
1015     ASSERT (strcmp (result, "1.750000 33") == 0);
1016     ASSERT (length == strlen (result));
1017     free (result);
1018   }
1019
1020   { /* FLAG_ALT.  */
1021     size_t length;
1022     char *result =
1023       my_asnprintf (NULL, &length, "%#.f %d", 1.75, 33, 44, 55);
1024     ASSERT (result != NULL);
1025     ASSERT (strcmp (result, "2. 33") == 0);
1026     ASSERT (length == strlen (result));
1027     free (result);
1028   }
1029
1030   { /* FLAG_ZERO with finite number.  */
1031     size_t length;
1032     char *result =
1033       my_asnprintf (NULL, &length, "%015f %d", 1234.0, 33, 44, 55);
1034     ASSERT (result != NULL);
1035     ASSERT (strcmp (result, "00001234.000000 33") == 0);
1036     ASSERT (length == strlen (result));
1037     free (result);
1038   }
1039
1040   { /* FLAG_ZERO with infinite number.  */
1041     size_t length;
1042     char *result =
1043       my_asnprintf (NULL, &length, "%015f %d", -1.0 / 0.0, 33, 44, 55);
1044     ASSERT (result != NULL);
1045     ASSERT (strcmp (result, "           -inf 33") == 0
1046             || strcmp (result, "      -infinity 33") == 0);
1047     ASSERT (length == strlen (result));
1048     free (result);
1049   }
1050
1051   { /* FLAG_ZERO with NaN.  */
1052     size_t length;
1053     char *result =
1054       my_asnprintf (NULL, &length, "%020f %d", NaN (), 33, 44, 55);
1055     ASSERT (result != NULL);
1056     ASSERT (strlen (result) == 20 + 3
1057             && (memcmp (result + strspn (result, " "), "nan", 3) == 0
1058                 || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
1059             && strcmp (result + strlen (result) - 3, " 33") == 0);
1060     ASSERT (length == strlen (result));
1061     free (result);
1062   }
1063
1064   { /* Precision.  */
1065     size_t length;
1066     char *result =
1067       my_asnprintf (NULL, &length, "%.f %d", 1234.0, 33, 44, 55);
1068     ASSERT (result != NULL);
1069     ASSERT (strcmp (result, "1234 33") == 0);
1070     ASSERT (length == strlen (result));
1071     free (result);
1072   }
1073
1074   { /* A positive number.  */
1075     size_t length;
1076     char *result =
1077       my_asnprintf (NULL, &length, "%Lf %d", 12.75L, 33, 44, 55);
1078     ASSERT (result != NULL);
1079     ASSERT (strcmp (result, "12.750000 33") == 0);
1080     ASSERT (length == strlen (result));
1081     free (result);
1082   }
1083
1084   { /* A larger positive number.  */
1085     size_t length;
1086     char *result =
1087       my_asnprintf (NULL, &length, "%Lf %d", 1234567.0L, 33, 44, 55);
1088     ASSERT (result != NULL);
1089     ASSERT (strcmp (result, "1234567.000000 33") == 0);
1090     ASSERT (length == strlen (result));
1091     free (result);
1092   }
1093
1094   { /* Small and large positive numbers.  */
1095     static struct { long double value; const char *string; } data[] =
1096       {
1097         { 1.234321234321234e-37L, "0.000000" },
1098         { 1.234321234321234e-36L, "0.000000" },
1099         { 1.234321234321234e-35L, "0.000000" },
1100         { 1.234321234321234e-34L, "0.000000" },
1101         { 1.234321234321234e-33L, "0.000000" },
1102         { 1.234321234321234e-32L, "0.000000" },
1103         { 1.234321234321234e-31L, "0.000000" },
1104         { 1.234321234321234e-30L, "0.000000" },
1105         { 1.234321234321234e-29L, "0.000000" },
1106         { 1.234321234321234e-28L, "0.000000" },
1107         { 1.234321234321234e-27L, "0.000000" },
1108         { 1.234321234321234e-26L, "0.000000" },
1109         { 1.234321234321234e-25L, "0.000000" },
1110         { 1.234321234321234e-24L, "0.000000" },
1111         { 1.234321234321234e-23L, "0.000000" },
1112         { 1.234321234321234e-22L, "0.000000" },
1113         { 1.234321234321234e-21L, "0.000000" },
1114         { 1.234321234321234e-20L, "0.000000" },
1115         { 1.234321234321234e-19L, "0.000000" },
1116         { 1.234321234321234e-18L, "0.000000" },
1117         { 1.234321234321234e-17L, "0.000000" },
1118         { 1.234321234321234e-16L, "0.000000" },
1119         { 1.234321234321234e-15L, "0.000000" },
1120         { 1.234321234321234e-14L, "0.000000" },
1121         { 1.234321234321234e-13L, "0.000000" },
1122         { 1.234321234321234e-12L, "0.000000" },
1123         { 1.234321234321234e-11L, "0.000000" },
1124         { 1.234321234321234e-10L, "0.000000" },
1125         { 1.234321234321234e-9L, "0.000000" },
1126         { 1.234321234321234e-8L, "0.000000" },
1127         { 1.234321234321234e-7L, "0.000000" },
1128         { 1.234321234321234e-6L, "0.000001" },
1129         { 1.234321234321234e-5L, "0.000012" },
1130         { 1.234321234321234e-4L, "0.000123" },
1131         { 1.234321234321234e-3L, "0.001234" },
1132         { 1.234321234321234e-2L, "0.012343" },
1133         { 1.234321234321234e-1L, "0.123432" },
1134         { 1.234321234321234L, "1.234321" },
1135         { 1.234321234321234e1L, "12.343212" },
1136         { 1.234321234321234e2L, "123.432123" },
1137         { 1.234321234321234e3L, "1234.321234" },
1138         { 1.234321234321234e4L, "12343.212343" },
1139         { 1.234321234321234e5L, "123432.123432" },
1140         { 1.234321234321234e6L, "1234321.234321" },
1141         { 1.234321234321234e7L, "12343212.343212" },
1142         { 1.234321234321234e8L, "123432123.432123" },
1143         { 1.234321234321234e9L, "1234321234.321234" },
1144         { 1.234321234321234e10L, "12343212343.2123**" },
1145         { 1.234321234321234e11L, "123432123432.123***" },
1146         { 1.234321234321234e12L, "1234321234321.23****" },
1147         { 1.234321234321234e13L, "12343212343212.3*****" },
1148         { 1.234321234321234e14L, "123432123432123.******" },
1149         { 1.234321234321234e15L, "1234321234321234.000000" },
1150         { 1.234321234321234e16L, "123432123432123**.000000" },
1151         { 1.234321234321234e17L, "123432123432123***.000000" },
1152         { 1.234321234321234e18L, "123432123432123****.000000" },
1153         { 1.234321234321234e19L, "123432123432123*****.000000" },
1154         { 1.234321234321234e20L, "123432123432123******.000000" },
1155         { 1.234321234321234e21L, "123432123432123*******.000000" },
1156         { 1.234321234321234e22L, "123432123432123********.000000" },
1157         { 1.234321234321234e23L, "123432123432123*********.000000" },
1158         { 1.234321234321234e24L, "123432123432123**********.000000" },
1159         { 1.234321234321234e25L, "123432123432123***********.000000" },
1160         { 1.234321234321234e26L, "123432123432123************.000000" },
1161         { 1.234321234321234e27L, "123432123432123*************.000000" },
1162         { 1.234321234321234e28L, "123432123432123**************.000000" },
1163         { 1.234321234321234e29L, "123432123432123***************.000000" },
1164         { 1.234321234321234e30L, "123432123432123****************.000000" },
1165         { 1.234321234321234e31L, "123432123432123*****************.000000" },
1166         { 1.234321234321234e32L, "123432123432123******************.000000" },
1167         { 1.234321234321234e33L, "123432123432123*******************.000000" },
1168         { 1.234321234321234e34L, "123432123432123********************.000000" },
1169         { 1.234321234321234e35L, "123432123432123*********************.000000" },
1170         { 1.234321234321234e36L, "123432123432123**********************.000000" }
1171       };
1172     size_t k;
1173     for (k = 0; k < SIZEOF (data); k++)
1174       {
1175         size_t length;
1176         char *result =
1177           my_asnprintf (NULL, &length, "%Lf", data[k].value);
1178         ASSERT (result != NULL);
1179         ASSERT (strmatch (data[k].string, result));
1180         ASSERT (length == strlen (result));
1181         free (result);
1182       }
1183   }
1184
1185   { /* A negative number.  */
1186     size_t length;
1187     char *result =
1188       my_asnprintf (NULL, &length, "%Lf %d", -0.03125L, 33, 44, 55);
1189     ASSERT (result != NULL);
1190     ASSERT (strcmp (result, "-0.031250 33") == 0);
1191     ASSERT (length == strlen (result));
1192     free (result);
1193   }
1194
1195   { /* Positive zero.  */
1196     size_t length;
1197     char *result =
1198       my_asnprintf (NULL, &length, "%Lf %d", 0.0L, 33, 44, 55);
1199     ASSERT (result != NULL);
1200     ASSERT (strcmp (result, "0.000000 33") == 0);
1201     ASSERT (length == strlen (result));
1202     free (result);
1203   }
1204
1205   { /* Negative zero.  */
1206     size_t length;
1207     char *result =
1208       my_asnprintf (NULL, &length, "%Lf %d", -0.0L, 33, 44, 55);
1209     ASSERT (result != NULL);
1210     if (have_minus_zero ())
1211       ASSERT (strcmp (result, "-0.000000 33") == 0);
1212     ASSERT (length == strlen (result));
1213     free (result);
1214   }
1215
1216   { /* Positive infinity.  */
1217     size_t length;
1218     char *result =
1219       my_asnprintf (NULL, &length, "%Lf %d", 1.0L / 0.0L, 33, 44, 55);
1220     ASSERT (result != NULL);
1221     ASSERT (strcmp (result, "inf 33") == 0
1222             || strcmp (result, "infinity 33") == 0);
1223     ASSERT (length == strlen (result));
1224     free (result);
1225   }
1226
1227   { /* Negative infinity.  */
1228     size_t length;
1229     char *result =
1230       my_asnprintf (NULL, &length, "%Lf %d", -1.0L / 0.0L, 33, 44, 55);
1231     ASSERT (result != NULL);
1232     ASSERT (strcmp (result, "-inf 33") == 0
1233             || strcmp (result, "-infinity 33") == 0);
1234     ASSERT (length == strlen (result));
1235     free (result);
1236   }
1237
1238   { /* NaN.  */
1239     static long double zero = 0.0L;
1240     size_t length;
1241     char *result =
1242       my_asnprintf (NULL, &length, "%Lf %d", zero / zero, 33, 44, 55);
1243     ASSERT (result != NULL);
1244     ASSERT (strlen (result) >= 3 + 3
1245             && (memcmp (result, "nan", 3) == 0
1246                 || memcmp (result, "-nan", 4) == 0)
1247             && strcmp (result + strlen (result) - 3, " 33") == 0);
1248     ASSERT (length == strlen (result));
1249     free (result);
1250   }
1251
1252   { /* Width.  */
1253     size_t length;
1254     char *result =
1255       my_asnprintf (NULL, &length, "%10Lf %d", 1.75L, 33, 44, 55);
1256     ASSERT (result != NULL);
1257     ASSERT (strcmp (result, "  1.750000 33") == 0);
1258     ASSERT (length == strlen (result));
1259     free (result);
1260   }
1261
1262   { /* FLAG_LEFT.  */
1263     size_t length;
1264     char *result =
1265       my_asnprintf (NULL, &length, "%-10Lf %d", 1.75L, 33, 44, 55);
1266     ASSERT (result != NULL);
1267     ASSERT (strcmp (result, "1.750000   33") == 0);
1268     ASSERT (length == strlen (result));
1269     free (result);
1270   }
1271
1272   { /* FLAG_SHOWSIGN.  */
1273     size_t length;
1274     char *result =
1275       my_asnprintf (NULL, &length, "%+Lf %d", 1.75L, 33, 44, 55);
1276     ASSERT (result != NULL);
1277     ASSERT (strcmp (result, "+1.750000 33") == 0);
1278     ASSERT (length == strlen (result));
1279     free (result);
1280   }
1281
1282   { /* FLAG_SPACE.  */
1283     size_t length;
1284     char *result =
1285       my_asnprintf (NULL, &length, "% Lf %d", 1.75L, 33, 44, 55);
1286     ASSERT (result != NULL);
1287     ASSERT (strcmp (result, " 1.750000 33") == 0);
1288     ASSERT (length == strlen (result));
1289     free (result);
1290   }
1291
1292   { /* FLAG_ALT.  */
1293     size_t length;
1294     char *result =
1295       my_asnprintf (NULL, &length, "%#Lf %d", 1.75L, 33, 44, 55);
1296     ASSERT (result != NULL);
1297     ASSERT (strcmp (result, "1.750000 33") == 0);
1298     ASSERT (length == strlen (result));
1299     free (result);
1300   }
1301
1302   { /* FLAG_ALT.  */
1303     size_t length;
1304     char *result =
1305       my_asnprintf (NULL, &length, "%#.Lf %d", 1.75L, 33, 44, 55);
1306     ASSERT (result != NULL);
1307     ASSERT (strcmp (result, "2. 33") == 0);
1308     ASSERT (length == strlen (result));
1309     free (result);
1310   }
1311
1312   { /* FLAG_ZERO with finite number.  */
1313     size_t length;
1314     char *result =
1315       my_asnprintf (NULL, &length, "%015Lf %d", 1234.0L, 33, 44, 55);
1316     ASSERT (result != NULL);
1317     ASSERT (strcmp (result, "00001234.000000 33") == 0);
1318     ASSERT (length == strlen (result));
1319     free (result);
1320   }
1321
1322   { /* FLAG_ZERO with infinite number.  */
1323     size_t length;
1324     char *result =
1325       my_asnprintf (NULL, &length, "%015Lf %d", -1.0L / 0.0L, 33, 44, 55);
1326     ASSERT (result != NULL);
1327     ASSERT (strcmp (result, "           -inf 33") == 0
1328             || strcmp (result, "      -infinity 33") == 0);
1329     ASSERT (length == strlen (result));
1330     free (result);
1331   }
1332
1333   { /* FLAG_ZERO with NaN.  */
1334     static long double zero = 0.0L;
1335     size_t length;
1336     char *result =
1337       my_asnprintf (NULL, &length, "%020Lf %d", zero / zero, 33, 44, 55);
1338     ASSERT (result != NULL);
1339     ASSERT (strlen (result) == 20 + 3
1340             && (memcmp (result + strspn (result, " "), "nan", 3) == 0
1341                 || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
1342             && strcmp (result + strlen (result) - 3, " 33") == 0);
1343     ASSERT (length == strlen (result));
1344     free (result);
1345   }
1346
1347   { /* Precision.  */
1348     size_t length;
1349     char *result =
1350       my_asnprintf (NULL, &length, "%.Lf %d", 1234.0L, 33, 44, 55);
1351     ASSERT (result != NULL);
1352     ASSERT (strcmp (result, "1234 33") == 0);
1353     ASSERT (length == strlen (result));
1354     free (result);
1355   }
1356
1357   /* Test the support of the %F format directive.  */
1358
1359   { /* A positive number.  */
1360     size_t length;
1361     char *result =
1362       my_asnprintf (NULL, &length, "%F %d", 12.75, 33, 44, 55);
1363     ASSERT (result != NULL);
1364     ASSERT (strcmp (result, "12.750000 33") == 0);
1365     ASSERT (length == strlen (result));
1366     free (result);
1367   }
1368
1369   { /* A larger positive number.  */
1370     size_t length;
1371     char *result =
1372       my_asnprintf (NULL, &length, "%F %d", 1234567.0, 33, 44, 55);
1373     ASSERT (result != NULL);
1374     ASSERT (strcmp (result, "1234567.000000 33") == 0);
1375     ASSERT (length == strlen (result));
1376     free (result);
1377   }
1378
1379   { /* A negative number.  */
1380     size_t length;
1381     char *result =
1382       my_asnprintf (NULL, &length, "%F %d", -0.03125, 33, 44, 55);
1383     ASSERT (result != NULL);
1384     ASSERT (strcmp (result, "-0.031250 33") == 0);
1385     ASSERT (length == strlen (result));
1386     free (result);
1387   }
1388
1389   { /* Positive zero.  */
1390     size_t length;
1391     char *result =
1392       my_asnprintf (NULL, &length, "%F %d", 0.0, 33, 44, 55);
1393     ASSERT (result != NULL);
1394     ASSERT (strcmp (result, "0.000000 33") == 0);
1395     ASSERT (length == strlen (result));
1396     free (result);
1397   }
1398
1399   { /* Negative zero.  */
1400     size_t length;
1401     char *result =
1402       my_asnprintf (NULL, &length, "%F %d", -0.0, 33, 44, 55);
1403     ASSERT (result != NULL);
1404     if (have_minus_zero ())
1405       ASSERT (strcmp (result, "-0.000000 33") == 0);
1406     ASSERT (length == strlen (result));
1407     free (result);
1408   }
1409
1410   { /* Positive infinity.  */
1411     size_t length;
1412     char *result =
1413       my_asnprintf (NULL, &length, "%F %d", 1.0 / 0.0, 33, 44, 55);
1414     ASSERT (result != NULL);
1415     ASSERT (strcmp (result, "INF 33") == 0
1416             || strcmp (result, "INFINITY 33") == 0);
1417     ASSERT (length == strlen (result));
1418     free (result);
1419   }
1420
1421   { /* Negative infinity.  */
1422     size_t length;
1423     char *result =
1424       my_asnprintf (NULL, &length, "%F %d", -1.0 / 0.0, 33, 44, 55);
1425     ASSERT (result != NULL);
1426     ASSERT (strcmp (result, "-INF 33") == 0
1427             || strcmp (result, "-INFINITY 33") == 0);
1428     ASSERT (length == strlen (result));
1429     free (result);
1430   }
1431
1432   { /* NaN.  */
1433     size_t length;
1434     char *result =
1435       my_asnprintf (NULL, &length, "%F %d", NaN (), 33, 44, 55);
1436     ASSERT (result != NULL);
1437     ASSERT (strlen (result) >= 3 + 3
1438             && (memcmp (result, "NAN", 3) == 0
1439                 || memcmp (result, "-NAN", 4) == 0)
1440             && strcmp (result + strlen (result) - 3, " 33") == 0);
1441     ASSERT (length == strlen (result));
1442     free (result);
1443   }
1444
1445   { /* FLAG_ZERO.  */
1446     size_t length;
1447     char *result =
1448       my_asnprintf (NULL, &length, "%015F %d", 1234.0, 33, 44, 55);
1449     ASSERT (result != NULL);
1450     ASSERT (strcmp (result, "00001234.000000 33") == 0);
1451     ASSERT (length == strlen (result));
1452     free (result);
1453   }
1454
1455   { /* FLAG_ZERO with infinite number.  */
1456     size_t length;
1457     char *result =
1458       my_asnprintf (NULL, &length, "%015F %d", -1.0 / 0.0, 33, 44, 55);
1459     ASSERT (result != NULL);
1460     ASSERT (strcmp (result, "           -INF 33") == 0
1461             || strcmp (result, "      -INFINITY 33") == 0);
1462     ASSERT (length == strlen (result));
1463     free (result);
1464   }
1465
1466   { /* Precision.  */
1467     size_t length;
1468     char *result =
1469       my_asnprintf (NULL, &length, "%.F %d", 1234.0, 33, 44, 55);
1470     ASSERT (result != NULL);
1471     ASSERT (strcmp (result, "1234 33") == 0);
1472     ASSERT (length == strlen (result));
1473     free (result);
1474   }
1475
1476   { /* A positive number.  */
1477     size_t length;
1478     char *result =
1479       my_asnprintf (NULL, &length, "%LF %d", 12.75L, 33, 44, 55);
1480     ASSERT (result != NULL);
1481     ASSERT (strcmp (result, "12.750000 33") == 0);
1482     ASSERT (length == strlen (result));
1483     free (result);
1484   }
1485
1486   { /* A larger positive number.  */
1487     size_t length;
1488     char *result =
1489       my_asnprintf (NULL, &length, "%LF %d", 1234567.0L, 33, 44, 55);
1490     ASSERT (result != NULL);
1491     ASSERT (strcmp (result, "1234567.000000 33") == 0);
1492     ASSERT (length == strlen (result));
1493     free (result);
1494   }
1495
1496   { /* A negative number.  */
1497     size_t length;
1498     char *result =
1499       my_asnprintf (NULL, &length, "%LF %d", -0.03125L, 33, 44, 55);
1500     ASSERT (result != NULL);
1501     ASSERT (strcmp (result, "-0.031250 33") == 0);
1502     ASSERT (length == strlen (result));
1503     free (result);
1504   }
1505
1506   { /* Positive zero.  */
1507     size_t length;
1508     char *result =
1509       my_asnprintf (NULL, &length, "%LF %d", 0.0L, 33, 44, 55);
1510     ASSERT (result != NULL);
1511     ASSERT (strcmp (result, "0.000000 33") == 0);
1512     ASSERT (length == strlen (result));
1513     free (result);
1514   }
1515
1516   { /* Negative zero.  */
1517     size_t length;
1518     char *result =
1519       my_asnprintf (NULL, &length, "%LF %d", -0.0L, 33, 44, 55);
1520     ASSERT (result != NULL);
1521     if (have_minus_zero ())
1522       ASSERT (strcmp (result, "-0.000000 33") == 0);
1523     ASSERT (length == strlen (result));
1524     free (result);
1525   }
1526
1527   { /* Positive infinity.  */
1528     size_t length;
1529     char *result =
1530       my_asnprintf (NULL, &length, "%LF %d", 1.0L / 0.0L, 33, 44, 55);
1531     ASSERT (result != NULL);
1532     ASSERT (strcmp (result, "INF 33") == 0
1533             || strcmp (result, "INFINITY 33") == 0);
1534     ASSERT (length == strlen (result));
1535     free (result);
1536   }
1537
1538   { /* Negative infinity.  */
1539     size_t length;
1540     char *result =
1541       my_asnprintf (NULL, &length, "%LF %d", -1.0L / 0.0L, 33, 44, 55);
1542     ASSERT (result != NULL);
1543     ASSERT (strcmp (result, "-INF 33") == 0
1544             || strcmp (result, "-INFINITY 33") == 0);
1545     ASSERT (length == strlen (result));
1546     free (result);
1547   }
1548
1549   { /* NaN.  */
1550     static long double zero = 0.0L;
1551     size_t length;
1552     char *result =
1553       my_asnprintf (NULL, &length, "%LF %d", zero / zero, 33, 44, 55);
1554     ASSERT (result != NULL);
1555     ASSERT (strlen (result) >= 3 + 3
1556             && (memcmp (result, "NAN", 3) == 0
1557                 || memcmp (result, "-NAN", 4) == 0)
1558             && strcmp (result + strlen (result) - 3, " 33") == 0);
1559     ASSERT (length == strlen (result));
1560     free (result);
1561   }
1562
1563   { /* FLAG_ZERO.  */
1564     size_t length;
1565     char *result =
1566       my_asnprintf (NULL, &length, "%015LF %d", 1234.0L, 33, 44, 55);
1567     ASSERT (result != NULL);
1568     ASSERT (strcmp (result, "00001234.000000 33") == 0);
1569     ASSERT (length == strlen (result));
1570     free (result);
1571   }
1572
1573   { /* FLAG_ZERO with infinite number.  */
1574     size_t length;
1575     char *result =
1576       my_asnprintf (NULL, &length, "%015LF %d", -1.0L / 0.0L, 33, 44, 55);
1577     ASSERT (result != NULL);
1578     ASSERT (strcmp (result, "           -INF 33") == 0
1579             || strcmp (result, "      -INFINITY 33") == 0);
1580     ASSERT (length == strlen (result));
1581     free (result);
1582   }
1583
1584   { /* Precision.  */
1585     size_t length;
1586     char *result =
1587       my_asnprintf (NULL, &length, "%.LF %d", 1234.0L, 33, 44, 55);
1588     ASSERT (result != NULL);
1589     ASSERT (strcmp (result, "1234 33") == 0);
1590     ASSERT (length == strlen (result));
1591     free (result);
1592   }
1593
1594   /* Test the support of the %e format directive.  */
1595
1596   { /* A positive number.  */
1597     size_t length;
1598     char *result =
1599       my_asnprintf (NULL, &length, "%e %d", 12.75, 33, 44, 55);
1600     ASSERT (result != NULL);
1601     ASSERT (strcmp (result, "1.275000e+01 33") == 0
1602             || strcmp (result, "1.275000e+001 33") == 0);
1603     ASSERT (length == strlen (result));
1604     free (result);
1605   }
1606
1607   { /* A larger positive number.  */
1608     size_t length;
1609     char *result =
1610       my_asnprintf (NULL, &length, "%e %d", 1234567.0, 33, 44, 55);
1611     ASSERT (result != NULL);
1612     ASSERT (strcmp (result, "1.234567e+06 33") == 0
1613             || strcmp (result, "1.234567e+006 33") == 0);
1614     ASSERT (length == strlen (result));
1615     free (result);
1616   }
1617
1618   { /* Small and large positive numbers.  */
1619     static struct { double value; const char *string; } data[] =
1620       {
1621         { 1.234321234321234e-37, "1.234321e-37" },
1622         { 1.234321234321234e-36, "1.234321e-36" },
1623         { 1.234321234321234e-35, "1.234321e-35" },
1624         { 1.234321234321234e-34, "1.234321e-34" },
1625         { 1.234321234321234e-33, "1.234321e-33" },
1626         { 1.234321234321234e-32, "1.234321e-32" },
1627         { 1.234321234321234e-31, "1.234321e-31" },
1628         { 1.234321234321234e-30, "1.234321e-30" },
1629         { 1.234321234321234e-29, "1.234321e-29" },
1630         { 1.234321234321234e-28, "1.234321e-28" },
1631         { 1.234321234321234e-27, "1.234321e-27" },
1632         { 1.234321234321234e-26, "1.234321e-26" },
1633         { 1.234321234321234e-25, "1.234321e-25" },
1634         { 1.234321234321234e-24, "1.234321e-24" },
1635         { 1.234321234321234e-23, "1.234321e-23" },
1636         { 1.234321234321234e-22, "1.234321e-22" },
1637         { 1.234321234321234e-21, "1.234321e-21" },
1638         { 1.234321234321234e-20, "1.234321e-20" },
1639         { 1.234321234321234e-19, "1.234321e-19" },
1640         { 1.234321234321234e-18, "1.234321e-18" },
1641         { 1.234321234321234e-17, "1.234321e-17" },
1642         { 1.234321234321234e-16, "1.234321e-16" },
1643         { 1.234321234321234e-15, "1.234321e-15" },
1644         { 1.234321234321234e-14, "1.234321e-14" },
1645         { 1.234321234321234e-13, "1.234321e-13" },
1646         { 1.234321234321234e-12, "1.234321e-12" },
1647         { 1.234321234321234e-11, "1.234321e-11" },
1648         { 1.234321234321234e-10, "1.234321e-10" },
1649         { 1.234321234321234e-9, "1.234321e-09" },
1650         { 1.234321234321234e-8, "1.234321e-08" },
1651         { 1.234321234321234e-7, "1.234321e-07" },
1652         { 1.234321234321234e-6, "1.234321e-06" },
1653         { 1.234321234321234e-5, "1.234321e-05" },
1654         { 1.234321234321234e-4, "1.234321e-04" },
1655         { 1.234321234321234e-3, "1.234321e-03" },
1656         { 1.234321234321234e-2, "1.234321e-02" },
1657         { 1.234321234321234e-1, "1.234321e-01" },
1658         { 1.234321234321234, "1.234321e+00" },
1659         { 1.234321234321234e1, "1.234321e+01" },
1660         { 1.234321234321234e2, "1.234321e+02" },
1661         { 1.234321234321234e3, "1.234321e+03" },
1662         { 1.234321234321234e4, "1.234321e+04" },
1663         { 1.234321234321234e5, "1.234321e+05" },
1664         { 1.234321234321234e6, "1.234321e+06" },
1665         { 1.234321234321234e7, "1.234321e+07" },
1666         { 1.234321234321234e8, "1.234321e+08" },
1667         { 1.234321234321234e9, "1.234321e+09" },
1668         { 1.234321234321234e10, "1.234321e+10" },
1669         { 1.234321234321234e11, "1.234321e+11" },
1670         { 1.234321234321234e12, "1.234321e+12" },
1671         { 1.234321234321234e13, "1.234321e+13" },
1672         { 1.234321234321234e14, "1.234321e+14" },
1673         { 1.234321234321234e15, "1.234321e+15" },
1674         { 1.234321234321234e16, "1.234321e+16" },
1675         { 1.234321234321234e17, "1.234321e+17" },
1676         { 1.234321234321234e18, "1.234321e+18" },
1677         { 1.234321234321234e19, "1.234321e+19" },
1678         { 1.234321234321234e20, "1.234321e+20" },
1679         { 1.234321234321234e21, "1.234321e+21" },
1680         { 1.234321234321234e22, "1.234321e+22" },
1681         { 1.234321234321234e23, "1.234321e+23" },
1682         { 1.234321234321234e24, "1.234321e+24" },
1683         { 1.234321234321234e25, "1.234321e+25" },
1684         { 1.234321234321234e26, "1.234321e+26" },
1685         { 1.234321234321234e27, "1.234321e+27" },
1686         { 1.234321234321234e28, "1.234321e+28" },
1687         { 1.234321234321234e29, "1.234321e+29" },
1688         { 1.234321234321234e30, "1.234321e+30" },
1689         { 1.234321234321234e31, "1.234321e+31" },
1690         { 1.234321234321234e32, "1.234321e+32" },
1691         { 1.234321234321234e33, "1.234321e+33" },
1692         { 1.234321234321234e34, "1.234321e+34" },
1693         { 1.234321234321234e35, "1.234321e+35" },
1694         { 1.234321234321234e36, "1.234321e+36" }
1695       };
1696     size_t k;
1697     for (k = 0; k < SIZEOF (data); k++)
1698       {
1699         size_t length;
1700         char *result =
1701           my_asnprintf (NULL, &length, "%e", data[k].value);
1702         const char *expected = data[k].string;
1703         ASSERT (result != NULL);
1704         ASSERT (strcmp (result, expected) == 0
1705                 /* Some implementations produce exponents with 3 digits.  */
1706                 || (strlen (result) == strlen (expected) + 1
1707                     && memcmp (result, expected, strlen (expected) - 2) == 0
1708                     && result[strlen (expected) - 2] == '0'
1709                     && strcmp (result + strlen (expected) - 1,
1710                                expected + strlen (expected) - 2)
1711                        == 0));
1712         ASSERT (length == strlen (result));
1713         free (result);
1714       }
1715   }
1716
1717   { /* A negative number.  */
1718     size_t length;
1719     char *result =
1720       my_asnprintf (NULL, &length, "%e %d", -0.03125, 33, 44, 55);
1721     ASSERT (result != NULL);
1722     ASSERT (strcmp (result, "-3.125000e-02 33") == 0
1723             || strcmp (result, "-3.125000e-002 33") == 0);
1724     ASSERT (length == strlen (result));
1725     free (result);
1726   }
1727
1728   { /* Positive zero.  */
1729     size_t length;
1730     char *result =
1731       my_asnprintf (NULL, &length, "%e %d", 0.0, 33, 44, 55);
1732     ASSERT (result != NULL);
1733     ASSERT (strcmp (result, "0.000000e+00 33") == 0
1734             || strcmp (result, "0.000000e+000 33") == 0);
1735     ASSERT (length == strlen (result));
1736     free (result);
1737   }
1738
1739   { /* Negative zero.  */
1740     size_t length;
1741     char *result =
1742       my_asnprintf (NULL, &length, "%e %d", -0.0, 33, 44, 55);
1743     ASSERT (result != NULL);
1744     if (have_minus_zero ())
1745       ASSERT (strcmp (result, "-0.000000e+00 33") == 0
1746               || strcmp (result, "-0.000000e+000 33") == 0);
1747     ASSERT (length == strlen (result));
1748     free (result);
1749   }
1750
1751   { /* Positive infinity.  */
1752     size_t length;
1753     char *result =
1754       my_asnprintf (NULL, &length, "%e %d", 1.0 / 0.0, 33, 44, 55);
1755     ASSERT (result != NULL);
1756     ASSERT (strcmp (result, "inf 33") == 0
1757             || strcmp (result, "infinity 33") == 0);
1758     ASSERT (length == strlen (result));
1759     free (result);
1760   }
1761
1762   { /* Negative infinity.  */
1763     size_t length;
1764     char *result =
1765       my_asnprintf (NULL, &length, "%e %d", -1.0 / 0.0, 33, 44, 55);
1766     ASSERT (result != NULL);
1767     ASSERT (strcmp (result, "-inf 33") == 0
1768             || strcmp (result, "-infinity 33") == 0);
1769     ASSERT (length == strlen (result));
1770     free (result);
1771   }
1772
1773   { /* NaN.  */
1774     size_t length;
1775     char *result =
1776       my_asnprintf (NULL, &length, "%e %d", NaN (), 33, 44, 55);
1777     ASSERT (result != NULL);
1778     ASSERT (strlen (result) >= 3 + 3
1779             && (memcmp (result, "nan", 3) == 0
1780                 || memcmp (result, "-nan", 4) == 0)
1781             && strcmp (result + strlen (result) - 3, " 33") == 0);
1782     ASSERT (length == strlen (result));
1783     free (result);
1784   }
1785
1786   { /* Width.  */
1787     size_t length;
1788     char *result =
1789       my_asnprintf (NULL, &length, "%15e %d", 1.75, 33, 44, 55);
1790     ASSERT (result != NULL);
1791     ASSERT (strcmp (result, "   1.750000e+00 33") == 0
1792             || strcmp (result, "  1.750000e+000 33") == 0);
1793     ASSERT (length == strlen (result));
1794     free (result);
1795   }
1796
1797   { /* FLAG_LEFT.  */
1798     size_t length;
1799     char *result =
1800       my_asnprintf (NULL, &length, "%-15e %d", 1.75, 33, 44, 55);
1801     ASSERT (result != NULL);
1802     ASSERT (strcmp (result, "1.750000e+00    33") == 0
1803             || strcmp (result, "1.750000e+000   33") == 0);
1804     ASSERT (length == strlen (result));
1805     free (result);
1806   }
1807
1808   { /* FLAG_SHOWSIGN.  */
1809     size_t length;
1810     char *result =
1811       my_asnprintf (NULL, &length, "%+e %d", 1.75, 33, 44, 55);
1812     ASSERT (result != NULL);
1813     ASSERT (strcmp (result, "+1.750000e+00 33") == 0
1814             || strcmp (result, "+1.750000e+000 33") == 0);
1815     ASSERT (length == strlen (result));
1816     free (result);
1817   }
1818
1819   { /* FLAG_SPACE.  */
1820     size_t length;
1821     char *result =
1822       my_asnprintf (NULL, &length, "% e %d", 1.75, 33, 44, 55);
1823     ASSERT (result != NULL);
1824     ASSERT (strcmp (result, " 1.750000e+00 33") == 0
1825             || strcmp (result, " 1.750000e+000 33") == 0);
1826     ASSERT (length == strlen (result));
1827     free (result);
1828   }
1829
1830   { /* FLAG_ALT.  */
1831     size_t length;
1832     char *result =
1833       my_asnprintf (NULL, &length, "%#e %d", 1.75, 33, 44, 55);
1834     ASSERT (result != NULL);
1835     ASSERT (strcmp (result, "1.750000e+00 33") == 0
1836             || strcmp (result, "1.750000e+000 33") == 0);
1837     ASSERT (length == strlen (result));
1838     free (result);
1839   }
1840
1841   { /* FLAG_ALT.  */
1842     size_t length;
1843     char *result =
1844       my_asnprintf (NULL, &length, "%#.e %d", 1.75, 33, 44, 55);
1845     ASSERT (result != NULL);
1846     ASSERT (strcmp (result, "2.e+00 33") == 0
1847             || strcmp (result, "2.e+000 33") == 0);
1848     ASSERT (length == strlen (result));
1849     free (result);
1850   }
1851
1852   { /* FLAG_ALT.  */
1853     size_t length;
1854     char *result =
1855       my_asnprintf (NULL, &length, "%#.e %d", 9.75, 33, 44, 55);
1856     ASSERT (result != NULL);
1857     ASSERT (strcmp (result, "1.e+01 33") == 0
1858             || strcmp (result, "1.e+001 33") == 0);
1859     ASSERT (length == strlen (result));
1860     free (result);
1861   }
1862
1863   { /* FLAG_ZERO with finite number.  */
1864     size_t length;
1865     char *result =
1866       my_asnprintf (NULL, &length, "%015e %d", 1234.0, 33, 44, 55);
1867     ASSERT (result != NULL);
1868     ASSERT (strcmp (result, "0001.234000e+03 33") == 0
1869             || strcmp (result, "001.234000e+003 33") == 0);
1870     ASSERT (length == strlen (result));
1871     free (result);
1872   }
1873
1874   { /* FLAG_ZERO with infinite number.  */
1875     size_t length;
1876     char *result =
1877       my_asnprintf (NULL, &length, "%015e %d", -1.0 / 0.0, 33, 44, 55);
1878     ASSERT (result != NULL);
1879     ASSERT (strcmp (result, "           -inf 33") == 0
1880             || strcmp (result, "      -infinity 33") == 0);
1881     ASSERT (length == strlen (result));
1882     free (result);
1883   }
1884
1885   { /* FLAG_ZERO with NaN.  */
1886     size_t length;
1887     char *result =
1888       my_asnprintf (NULL, &length, "%020e %d", NaN (), 33, 44, 55);
1889     ASSERT (result != NULL);
1890     ASSERT (strlen (result) == 20 + 3
1891             && (memcmp (result + strspn (result, " "), "nan", 3) == 0
1892                 || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
1893             && strcmp (result + strlen (result) - 3, " 33") == 0);
1894     ASSERT (length == strlen (result));
1895     free (result);
1896   }
1897
1898   { /* Precision.  */
1899     size_t length;
1900     char *result =
1901       my_asnprintf (NULL, &length, "%.e %d", 1234.0, 33, 44, 55);
1902     ASSERT (result != NULL);
1903     ASSERT (strcmp (result, "1e+03 33") == 0
1904             || strcmp (result, "1e+003 33") == 0);
1905     ASSERT (length == strlen (result));
1906     free (result);
1907   }
1908
1909   { /* A positive number.  */
1910     size_t length;
1911     char *result =
1912       my_asnprintf (NULL, &length, "%Le %d", 12.75L, 33, 44, 55);
1913     ASSERT (result != NULL);
1914     ASSERT (strcmp (result, "1.275000e+01 33") == 0);
1915     ASSERT (length == strlen (result));
1916     free (result);
1917   }
1918
1919   { /* A larger positive number.  */
1920     size_t length;
1921     char *result =
1922       my_asnprintf (NULL, &length, "%Le %d", 1234567.0L, 33, 44, 55);
1923     ASSERT (result != NULL);
1924     ASSERT (strcmp (result, "1.234567e+06 33") == 0);
1925     ASSERT (length == strlen (result));
1926     free (result);
1927   }
1928
1929   { /* Small and large positive numbers.  */
1930     static struct { long double value; const char *string; } data[] =
1931       {
1932         { 1.234321234321234e-37L, "1.234321e-37" },
1933         { 1.234321234321234e-36L, "1.234321e-36" },
1934         { 1.234321234321234e-35L, "1.234321e-35" },
1935         { 1.234321234321234e-34L, "1.234321e-34" },
1936         { 1.234321234321234e-33L, "1.234321e-33" },
1937         { 1.234321234321234e-32L, "1.234321e-32" },
1938         { 1.234321234321234e-31L, "1.234321e-31" },
1939         { 1.234321234321234e-30L, "1.234321e-30" },
1940         { 1.234321234321234e-29L, "1.234321e-29" },
1941         { 1.234321234321234e-28L, "1.234321e-28" },
1942         { 1.234321234321234e-27L, "1.234321e-27" },
1943         { 1.234321234321234e-26L, "1.234321e-26" },
1944         { 1.234321234321234e-25L, "1.234321e-25" },
1945         { 1.234321234321234e-24L, "1.234321e-24" },
1946         { 1.234321234321234e-23L, "1.234321e-23" },
1947         { 1.234321234321234e-22L, "1.234321e-22" },
1948         { 1.234321234321234e-21L, "1.234321e-21" },
1949         { 1.234321234321234e-20L, "1.234321e-20" },
1950         { 1.234321234321234e-19L, "1.234321e-19" },
1951         { 1.234321234321234e-18L, "1.234321e-18" },
1952         { 1.234321234321234e-17L, "1.234321e-17" },
1953         { 1.234321234321234e-16L, "1.234321e-16" },
1954         { 1.234321234321234e-15L, "1.234321e-15" },
1955         { 1.234321234321234e-14L, "1.234321e-14" },
1956         { 1.234321234321234e-13L, "1.234321e-13" },
1957         { 1.234321234321234e-12L, "1.234321e-12" },
1958         { 1.234321234321234e-11L, "1.234321e-11" },
1959         { 1.234321234321234e-10L, "1.234321e-10" },
1960         { 1.234321234321234e-9L, "1.234321e-09" },
1961         { 1.234321234321234e-8L, "1.234321e-08" },
1962         { 1.234321234321234e-7L, "1.234321e-07" },
1963         { 1.234321234321234e-6L, "1.234321e-06" },
1964         { 1.234321234321234e-5L, "1.234321e-05" },
1965         { 1.234321234321234e-4L, "1.234321e-04" },
1966         { 1.234321234321234e-3L, "1.234321e-03" },
1967         { 1.234321234321234e-2L, "1.234321e-02" },
1968         { 1.234321234321234e-1L, "1.234321e-01" },
1969         { 1.234321234321234L, "1.234321e+00" },
1970         { 1.234321234321234e1L, "1.234321e+01" },
1971         { 1.234321234321234e2L, "1.234321e+02" },
1972         { 1.234321234321234e3L, "1.234321e+03" },
1973         { 1.234321234321234e4L, "1.234321e+04" },
1974         { 1.234321234321234e5L, "1.234321e+05" },
1975         { 1.234321234321234e6L, "1.234321e+06" },
1976         { 1.234321234321234e7L, "1.234321e+07" },
1977         { 1.234321234321234e8L, "1.234321e+08" },
1978         { 1.234321234321234e9L, "1.234321e+09" },
1979         { 1.234321234321234e10L, "1.234321e+10" },
1980         { 1.234321234321234e11L, "1.234321e+11" },
1981         { 1.234321234321234e12L, "1.234321e+12" },
1982         { 1.234321234321234e13L, "1.234321e+13" },
1983         { 1.234321234321234e14L, "1.234321e+14" },
1984         { 1.234321234321234e15L, "1.234321e+15" },
1985         { 1.234321234321234e16L, "1.234321e+16" },
1986         { 1.234321234321234e17L, "1.234321e+17" },
1987         { 1.234321234321234e18L, "1.234321e+18" },
1988         { 1.234321234321234e19L, "1.234321e+19" },
1989         { 1.234321234321234e20L, "1.234321e+20" },
1990         { 1.234321234321234e21L, "1.234321e+21" },
1991         { 1.234321234321234e22L, "1.234321e+22" },
1992         { 1.234321234321234e23L, "1.234321e+23" },
1993         { 1.234321234321234e24L, "1.234321e+24" },
1994         { 1.234321234321234e25L, "1.234321e+25" },
1995         { 1.234321234321234e26L, "1.234321e+26" },
1996         { 1.234321234321234e27L, "1.234321e+27" },
1997         { 1.234321234321234e28L, "1.234321e+28" },
1998         { 1.234321234321234e29L, "1.234321e+29" },
1999         { 1.234321234321234e30L, "1.234321e+30" },
2000         { 1.234321234321234e31L, "1.234321e+31" },
2001         { 1.234321234321234e32L, "1.234321e+32" },
2002         { 1.234321234321234e33L, "1.234321e+33" },
2003         { 1.234321234321234e34L, "1.234321e+34" },
2004         { 1.234321234321234e35L, "1.234321e+35" },
2005         { 1.234321234321234e36L, "1.234321e+36" }
2006       };
2007     size_t k;
2008     for (k = 0; k < SIZEOF (data); k++)
2009       {
2010         size_t length;
2011         char *result =
2012           my_asnprintf (NULL, &length, "%Le", data[k].value);
2013         ASSERT (result != NULL);
2014         ASSERT (strcmp (result, data[k].string) == 0);
2015         ASSERT (length == strlen (result));
2016         free (result);
2017       }
2018   }
2019
2020   { /* A negative number.  */
2021     size_t length;
2022     char *result =
2023       my_asnprintf (NULL, &length, "%Le %d", -0.03125L, 33, 44, 55);
2024     ASSERT (result != NULL);
2025     ASSERT (strcmp (result, "-3.125000e-02 33") == 0);
2026     ASSERT (length == strlen (result));
2027     free (result);
2028   }
2029
2030   { /* Positive zero.  */
2031     size_t length;
2032     char *result =
2033       my_asnprintf (NULL, &length, "%Le %d", 0.0L, 33, 44, 55);
2034     ASSERT (result != NULL);
2035     ASSERT (strcmp (result, "0.000000e+00 33") == 0);
2036     ASSERT (length == strlen (result));
2037     free (result);
2038   }
2039
2040   { /* Negative zero.  */
2041     size_t length;
2042     char *result =
2043       my_asnprintf (NULL, &length, "%Le %d", -0.0L, 33, 44, 55);
2044     ASSERT (result != NULL);
2045     if (have_minus_zero ())
2046       ASSERT (strcmp (result, "-0.000000e+00 33") == 0);
2047     ASSERT (length == strlen (result));
2048     free (result);
2049   }
2050
2051   { /* Positive infinity.  */
2052     size_t length;
2053     char *result =
2054       my_asnprintf (NULL, &length, "%Le %d", 1.0L / 0.0L, 33, 44, 55);
2055     ASSERT (result != NULL);
2056     ASSERT (strcmp (result, "inf 33") == 0
2057             || strcmp (result, "infinity 33") == 0);
2058     ASSERT (length == strlen (result));
2059     free (result);
2060   }
2061
2062   { /* Negative infinity.  */
2063     size_t length;
2064     char *result =
2065       my_asnprintf (NULL, &length, "%Le %d", -1.0L / 0.0L, 33, 44, 55);
2066     ASSERT (result != NULL);
2067     ASSERT (strcmp (result, "-inf 33") == 0
2068             || strcmp (result, "-infinity 33") == 0);
2069     ASSERT (length == strlen (result));
2070     free (result);
2071   }
2072
2073   { /* NaN.  */
2074     static long double zero = 0.0L;
2075     size_t length;
2076     char *result =
2077       my_asnprintf (NULL, &length, "%Le %d", zero / zero, 33, 44, 55);
2078     ASSERT (result != NULL);
2079     ASSERT (strlen (result) >= 3 + 3
2080             && (memcmp (result, "nan", 3) == 0
2081                 || memcmp (result, "-nan", 4) == 0)
2082             && strcmp (result + strlen (result) - 3, " 33") == 0);
2083     ASSERT (length == strlen (result));
2084     free (result);
2085   }
2086
2087   { /* Width.  */
2088     size_t length;
2089     char *result =
2090       my_asnprintf (NULL, &length, "%15Le %d", 1.75L, 33, 44, 55);
2091     ASSERT (result != NULL);
2092     ASSERT (strcmp (result, "   1.750000e+00 33") == 0);
2093     ASSERT (length == strlen (result));
2094     free (result);
2095   }
2096
2097   { /* FLAG_LEFT.  */
2098     size_t length;
2099     char *result =
2100       my_asnprintf (NULL, &length, "%-15Le %d", 1.75L, 33, 44, 55);
2101     ASSERT (result != NULL);
2102     ASSERT (strcmp (result, "1.750000e+00    33") == 0);
2103     ASSERT (length == strlen (result));
2104     free (result);
2105   }
2106
2107   { /* FLAG_SHOWSIGN.  */
2108     size_t length;
2109     char *result =
2110       my_asnprintf (NULL, &length, "%+Le %d", 1.75L, 33, 44, 55);
2111     ASSERT (result != NULL);
2112     ASSERT (strcmp (result, "+1.750000e+00 33") == 0);
2113     ASSERT (length == strlen (result));
2114     free (result);
2115   }
2116
2117   { /* FLAG_SPACE.  */
2118     size_t length;
2119     char *result =
2120       my_asnprintf (NULL, &length, "% Le %d", 1.75L, 33, 44, 55);
2121     ASSERT (result != NULL);
2122     ASSERT (strcmp (result, " 1.750000e+00 33") == 0);
2123     ASSERT (length == strlen (result));
2124     free (result);
2125   }
2126
2127   { /* FLAG_ALT.  */
2128     size_t length;
2129     char *result =
2130       my_asnprintf (NULL, &length, "%#Le %d", 1.75L, 33, 44, 55);
2131     ASSERT (result != NULL);
2132     ASSERT (strcmp (result, "1.750000e+00 33") == 0);
2133     ASSERT (length == strlen (result));
2134     free (result);
2135   }
2136
2137   { /* FLAG_ALT.  */
2138     size_t length;
2139     char *result =
2140       my_asnprintf (NULL, &length, "%#.Le %d", 1.75L, 33, 44, 55);
2141     ASSERT (result != NULL);
2142     ASSERT (strcmp (result, "2.e+00 33") == 0);
2143     ASSERT (length == strlen (result));
2144     free (result);
2145   }
2146
2147   { /* FLAG_ALT.  */
2148     size_t length;
2149     char *result =
2150       my_asnprintf (NULL, &length, "%#.Le %d", 9.75L, 33, 44, 55);
2151     ASSERT (result != NULL);
2152     ASSERT (strcmp (result, "1.e+01 33") == 0);
2153     ASSERT (length == strlen (result));
2154     free (result);
2155   }
2156
2157   { /* FLAG_ZERO with finite number.  */
2158     size_t length;
2159     char *result =
2160       my_asnprintf (NULL, &length, "%015Le %d", 1234.0L, 33, 44, 55);
2161     ASSERT (result != NULL);
2162     ASSERT (strcmp (result, "0001.234000e+03 33") == 0);
2163     ASSERT (length == strlen (result));
2164     free (result);
2165   }
2166
2167   { /* FLAG_ZERO with infinite number.  */
2168     size_t length;
2169     char *result =
2170       my_asnprintf (NULL, &length, "%015Le %d", -1.0L / 0.0L, 33, 44, 55);
2171     ASSERT (result != NULL);
2172     ASSERT (strcmp (result, "           -inf 33") == 0
2173             || strcmp (result, "      -infinity 33") == 0);
2174     ASSERT (length == strlen (result));
2175     free (result);
2176   }
2177
2178   { /* FLAG_ZERO with NaN.  */
2179     static long double zero = 0.0L;
2180     size_t length;
2181     char *result =
2182       my_asnprintf (NULL, &length, "%020Le %d", zero / zero, 33, 44, 55);
2183     ASSERT (result != NULL);
2184     ASSERT (strlen (result) == 20 + 3
2185             && (memcmp (result + strspn (result, " "), "nan", 3) == 0
2186                 || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
2187             && strcmp (result + strlen (result) - 3, " 33") == 0);
2188     ASSERT (length == strlen (result));
2189     free (result);
2190   }
2191
2192   { /* Precision.  */
2193     size_t length;
2194     char *result =
2195       my_asnprintf (NULL, &length, "%.Le %d", 1234.0L, 33, 44, 55);
2196     ASSERT (result != NULL);
2197     ASSERT (strcmp (result, "1e+03 33") == 0);
2198     ASSERT (length == strlen (result));
2199     free (result);
2200   }
2201
2202   /* Test the support of the %g format directive.  */
2203
2204   { /* A positive number.  */
2205     size_t length;
2206     char *result =
2207       my_asnprintf (NULL, &length, "%g %d", 12.75, 33, 44, 55);
2208     ASSERT (result != NULL);
2209     ASSERT (strcmp (result, "12.75 33") == 0);
2210     ASSERT (length == strlen (result));
2211     free (result);
2212   }
2213
2214   { /* A larger positive number.  */
2215     size_t length;
2216     char *result =
2217       my_asnprintf (NULL, &length, "%g %d", 1234567.0, 33, 44, 55);
2218     ASSERT (result != NULL);
2219     ASSERT (strcmp (result, "1.23457e+06 33") == 0
2220             || strcmp (result, "1.23457e+006 33") == 0);
2221     ASSERT (length == strlen (result));
2222     free (result);
2223   }
2224
2225   { /* Small and large positive numbers.  */
2226     static struct { double value; const char *string; } data[] =
2227       {
2228         { 1.234321234321234e-37, "1.23432e-37" },
2229         { 1.234321234321234e-36, "1.23432e-36" },
2230         { 1.234321234321234e-35, "1.23432e-35" },
2231         { 1.234321234321234e-34, "1.23432e-34" },
2232         { 1.234321234321234e-33, "1.23432e-33" },
2233         { 1.234321234321234e-32, "1.23432e-32" },
2234         { 1.234321234321234e-31, "1.23432e-31" },
2235         { 1.234321234321234e-30, "1.23432e-30" },
2236         { 1.234321234321234e-29, "1.23432e-29" },
2237         { 1.234321234321234e-28, "1.23432e-28" },
2238         { 1.234321234321234e-27, "1.23432e-27" },
2239         { 1.234321234321234e-26, "1.23432e-26" },
2240         { 1.234321234321234e-25, "1.23432e-25" },
2241         { 1.234321234321234e-24, "1.23432e-24" },
2242         { 1.234321234321234e-23, "1.23432e-23" },
2243         { 1.234321234321234e-22, "1.23432e-22" },
2244         { 1.234321234321234e-21, "1.23432e-21" },
2245         { 1.234321234321234e-20, "1.23432e-20" },
2246         { 1.234321234321234e-19, "1.23432e-19" },
2247         { 1.234321234321234e-18, "1.23432e-18" },
2248         { 1.234321234321234e-17, "1.23432e-17" },
2249         { 1.234321234321234e-16, "1.23432e-16" },
2250         { 1.234321234321234e-15, "1.23432e-15" },
2251         { 1.234321234321234e-14, "1.23432e-14" },
2252         { 1.234321234321234e-13, "1.23432e-13" },
2253         { 1.234321234321234e-12, "1.23432e-12" },
2254         { 1.234321234321234e-11, "1.23432e-11" },
2255         { 1.234321234321234e-10, "1.23432e-10" },
2256         { 1.234321234321234e-9, "1.23432e-09" },
2257         { 1.234321234321234e-8, "1.23432e-08" },
2258         { 1.234321234321234e-7, "1.23432e-07" },
2259         { 1.234321234321234e-6, "1.23432e-06" },
2260         { 1.234321234321234e-5, "1.23432e-05" },
2261         { 1.234321234321234e-4, "0.000123432" },
2262         { 1.234321234321234e-3, "0.00123432" },
2263         { 1.234321234321234e-2, "0.0123432" },
2264         { 1.234321234321234e-1, "0.123432" },
2265         { 1.234321234321234, "1.23432" },
2266         { 1.234321234321234e1, "12.3432" },
2267         { 1.234321234321234e2, "123.432" },
2268         { 1.234321234321234e3, "1234.32" },
2269         { 1.234321234321234e4, "12343.2" },
2270         { 1.234321234321234e5, "123432" },
2271         { 1.234321234321234e6, "1.23432e+06" },
2272         { 1.234321234321234e7, "1.23432e+07" },
2273         { 1.234321234321234e8, "1.23432e+08" },
2274         { 1.234321234321234e9, "1.23432e+09" },
2275         { 1.234321234321234e10, "1.23432e+10" },
2276         { 1.234321234321234e11, "1.23432e+11" },
2277         { 1.234321234321234e12, "1.23432e+12" },
2278         { 1.234321234321234e13, "1.23432e+13" },
2279         { 1.234321234321234e14, "1.23432e+14" },
2280         { 1.234321234321234e15, "1.23432e+15" },
2281         { 1.234321234321234e16, "1.23432e+16" },
2282         { 1.234321234321234e17, "1.23432e+17" },
2283         { 1.234321234321234e18, "1.23432e+18" },
2284         { 1.234321234321234e19, "1.23432e+19" },
2285         { 1.234321234321234e20, "1.23432e+20" },
2286         { 1.234321234321234e21, "1.23432e+21" },
2287         { 1.234321234321234e22, "1.23432e+22" },
2288         { 1.234321234321234e23, "1.23432e+23" },
2289         { 1.234321234321234e24, "1.23432e+24" },
2290         { 1.234321234321234e25, "1.23432e+25" },
2291         { 1.234321234321234e26, "1.23432e+26" },
2292         { 1.234321234321234e27, "1.23432e+27" },
2293         { 1.234321234321234e28, "1.23432e+28" },
2294         { 1.234321234321234e29, "1.23432e+29" },
2295         { 1.234321234321234e30, "1.23432e+30" },
2296         { 1.234321234321234e31, "1.23432e+31" },
2297         { 1.234321234321234e32, "1.23432e+32" },
2298         { 1.234321234321234e33, "1.23432e+33" },
2299         { 1.234321234321234e34, "1.23432e+34" },
2300         { 1.234321234321234e35, "1.23432e+35" },
2301         { 1.234321234321234e36, "1.23432e+36" }
2302       };
2303     size_t k;
2304     for (k = 0; k < SIZEOF (data); k++)
2305       {
2306         size_t length;
2307         char *result =
2308           my_asnprintf (NULL, &length, "%g", data[k].value);
2309         const char *expected = data[k].string;
2310         ASSERT (result != NULL);
2311         ASSERT (strcmp (result, expected) == 0
2312                 /* Some implementations produce exponents with 3 digits.  */
2313                 || (expected[strlen (expected) - 4] == 'e'
2314                     && strlen (result) == strlen (expected) + 1
2315                     && memcmp (result, expected, strlen (expected) - 2) == 0
2316                     && result[strlen (expected) - 2] == '0'
2317                     && strcmp (result + strlen (expected) - 1,
2318                                expected + strlen (expected) - 2)
2319                        == 0));
2320         ASSERT (length == strlen (result));
2321         free (result);
2322       }
2323   }
2324
2325   { /* A negative number.  */
2326     size_t length;
2327     char *result =
2328       my_asnprintf (NULL, &length, "%g %d", -0.03125, 33, 44, 55);
2329     ASSERT (result != NULL);
2330     ASSERT (strcmp (result, "-0.03125 33") == 0);
2331     ASSERT (length == strlen (result));
2332     free (result);
2333   }
2334
2335   { /* Positive zero.  */
2336     size_t length;
2337     char *result =
2338       my_asnprintf (NULL, &length, "%g %d", 0.0, 33, 44, 55);
2339     ASSERT (result != NULL);
2340     ASSERT (strcmp (result, "0 33") == 0);
2341     ASSERT (length == strlen (result));
2342     free (result);
2343   }
2344
2345   { /* Negative zero.  */
2346     size_t length;
2347     char *result =
2348       my_asnprintf (NULL, &length, "%g %d", -0.0, 33, 44, 55);
2349     ASSERT (result != NULL);
2350     if (have_minus_zero ())
2351       ASSERT (strcmp (result, "-0 33") == 0);
2352     ASSERT (length == strlen (result));
2353     free (result);
2354   }
2355
2356   { /* Positive infinity.  */
2357     size_t length;
2358     char *result =
2359       my_asnprintf (NULL, &length, "%g %d", 1.0 / 0.0, 33, 44, 55);
2360     ASSERT (result != NULL);
2361     ASSERT (strcmp (result, "inf 33") == 0
2362             || strcmp (result, "infinity 33") == 0);
2363     ASSERT (length == strlen (result));
2364     free (result);
2365   }
2366
2367   { /* Negative infinity.  */
2368     size_t length;
2369     char *result =
2370       my_asnprintf (NULL, &length, "%g %d", -1.0 / 0.0, 33, 44, 55);
2371     ASSERT (result != NULL);
2372     ASSERT (strcmp (result, "-inf 33") == 0
2373             || strcmp (result, "-infinity 33") == 0);
2374     ASSERT (length == strlen (result));
2375     free (result);
2376   }
2377
2378   { /* NaN.  */
2379     size_t length;
2380     char *result =
2381       my_asnprintf (NULL, &length, "%g %d", NaN (), 33, 44, 55);
2382     ASSERT (result != NULL);
2383     ASSERT (strlen (result) >= 3 + 3
2384             && (memcmp (result, "nan", 3) == 0
2385                 || memcmp (result, "-nan", 4) == 0)
2386             && strcmp (result + strlen (result) - 3, " 33") == 0);
2387     ASSERT (length == strlen (result));
2388     free (result);
2389   }
2390
2391   { /* Width.  */
2392     size_t length;
2393     char *result =
2394       my_asnprintf (NULL, &length, "%10g %d", 1.75, 33, 44, 55);
2395     ASSERT (result != NULL);
2396     ASSERT (strcmp (result, "      1.75 33") == 0);
2397     ASSERT (length == strlen (result));
2398     free (result);
2399   }
2400
2401   { /* FLAG_LEFT.  */
2402     size_t length;
2403     char *result =
2404       my_asnprintf (NULL, &length, "%-10g %d", 1.75, 33, 44, 55);
2405     ASSERT (result != NULL);
2406     ASSERT (strcmp (result, "1.75       33") == 0);
2407     ASSERT (length == strlen (result));
2408     free (result);
2409   }
2410
2411   { /* FLAG_SHOWSIGN.  */
2412     size_t length;
2413     char *result =
2414       my_asnprintf (NULL, &length, "%+g %d", 1.75, 33, 44, 55);
2415     ASSERT (result != NULL);
2416     ASSERT (strcmp (result, "+1.75 33") == 0);
2417     ASSERT (length == strlen (result));
2418     free (result);
2419   }
2420
2421   { /* FLAG_SPACE.  */
2422     size_t length;
2423     char *result =
2424       my_asnprintf (NULL, &length, "% g %d", 1.75, 33, 44, 55);
2425     ASSERT (result != NULL);
2426     ASSERT (strcmp (result, " 1.75 33") == 0);
2427     ASSERT (length == strlen (result));
2428     free (result);
2429   }
2430
2431   { /* FLAG_ALT.  */
2432     size_t length;
2433     char *result =
2434       my_asnprintf (NULL, &length, "%#g %d", 1.75, 33, 44, 55);
2435     ASSERT (result != NULL);
2436     ASSERT (strcmp (result, "1.75000 33") == 0);
2437     ASSERT (length == strlen (result));
2438     free (result);
2439   }
2440
2441   { /* FLAG_ALT.  */
2442     size_t length;
2443     char *result =
2444       my_asnprintf (NULL, &length, "%#.g %d", 1.75, 33, 44, 55);
2445     ASSERT (result != NULL);
2446     ASSERT (strcmp (result, "2. 33") == 0);
2447     ASSERT (length == strlen (result));
2448     free (result);
2449   }
2450
2451   { /* FLAG_ALT.  */
2452     size_t length;
2453     char *result =
2454       my_asnprintf (NULL, &length, "%#.g %d", 9.75, 33, 44, 55);
2455     ASSERT (result != NULL);
2456     ASSERT (strcmp (result, "1.e+01 33") == 0
2457             || strcmp (result, "1.e+001 33") == 0);
2458     ASSERT (length == strlen (result));
2459     free (result);
2460   }
2461
2462   { /* FLAG_ZERO with finite number.  */
2463     size_t length;
2464     char *result =
2465       my_asnprintf (NULL, &length, "%010g %d", 1234.0, 33, 44, 55);
2466     ASSERT (result != NULL);
2467     ASSERT (strcmp (result, "0000001234 33") == 0);
2468     ASSERT (length == strlen (result));
2469     free (result);
2470   }
2471
2472   { /* FLAG_ZERO with infinite number.  */
2473     size_t length;
2474     char *result =
2475       my_asnprintf (NULL, &length, "%015g %d", -1.0 / 0.0, 33, 44, 55);
2476     ASSERT (result != NULL);
2477     ASSERT (strcmp (result, "           -inf 33") == 0
2478             || strcmp (result, "      -infinity 33") == 0);
2479     ASSERT (length == strlen (result));
2480     free (result);
2481   }
2482
2483   { /* FLAG_ZERO with NaN.  */
2484     size_t length;
2485     char *result =
2486       my_asnprintf (NULL, &length, "%020g %d", NaN (), 33, 44, 55);
2487     ASSERT (result != NULL);
2488     ASSERT (strlen (result) == 20 + 3
2489             && (memcmp (result + strspn (result, " "), "nan", 3) == 0
2490                 || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
2491             && strcmp (result + strlen (result) - 3, " 33") == 0);
2492     ASSERT (length == strlen (result));
2493     free (result);
2494   }
2495
2496   { /* Precision.  */
2497     size_t length;
2498     char *result =
2499       my_asnprintf (NULL, &length, "%.g %d", 1234.0, 33, 44, 55);
2500     ASSERT (result != NULL);
2501     ASSERT (strcmp (result, "1e+03 33") == 0
2502             || strcmp (result, "1e+003 33") == 0);
2503     ASSERT (length == strlen (result));
2504     free (result);
2505   }
2506
2507   { /* A positive number.  */
2508     size_t length;
2509     char *result =
2510       my_asnprintf (NULL, &length, "%Lg %d", 12.75L, 33, 44, 55);
2511     ASSERT (result != NULL);
2512     ASSERT (strcmp (result, "12.75 33") == 0);
2513     ASSERT (length == strlen (result));
2514     free (result);
2515   }
2516
2517   { /* A larger positive number.  */
2518     size_t length;
2519     char *result =
2520       my_asnprintf (NULL, &length, "%Lg %d", 1234567.0L, 33, 44, 55);
2521     ASSERT (result != NULL);
2522     ASSERT (strcmp (result, "1.23457e+06 33") == 0);
2523     ASSERT (length == strlen (result));
2524     free (result);
2525   }
2526
2527   { /* Small and large positive numbers.  */
2528     static struct { long double value; const char *string; } data[] =
2529       {
2530         { 1.234321234321234e-37L, "1.23432e-37" },
2531         { 1.234321234321234e-36L, "1.23432e-36" },
2532         { 1.234321234321234e-35L, "1.23432e-35" },
2533         { 1.234321234321234e-34L, "1.23432e-34" },
2534         { 1.234321234321234e-33L, "1.23432e-33" },
2535         { 1.234321234321234e-32L, "1.23432e-32" },
2536         { 1.234321234321234e-31L, "1.23432e-31" },
2537         { 1.234321234321234e-30L, "1.23432e-30" },
2538         { 1.234321234321234e-29L, "1.23432e-29" },
2539         { 1.234321234321234e-28L, "1.23432e-28" },
2540         { 1.234321234321234e-27L, "1.23432e-27" },
2541         { 1.234321234321234e-26L, "1.23432e-26" },
2542         { 1.234321234321234e-25L, "1.23432e-25" },
2543         { 1.234321234321234e-24L, "1.23432e-24" },
2544         { 1.234321234321234e-23L, "1.23432e-23" },
2545         { 1.234321234321234e-22L, "1.23432e-22" },
2546         { 1.234321234321234e-21L, "1.23432e-21" },
2547         { 1.234321234321234e-20L, "1.23432e-20" },
2548         { 1.234321234321234e-19L, "1.23432e-19" },
2549         { 1.234321234321234e-18L, "1.23432e-18" },
2550         { 1.234321234321234e-17L, "1.23432e-17" },
2551         { 1.234321234321234e-16L, "1.23432e-16" },
2552         { 1.234321234321234e-15L, "1.23432e-15" },
2553         { 1.234321234321234e-14L, "1.23432e-14" },
2554         { 1.234321234321234e-13L, "1.23432e-13" },
2555         { 1.234321234321234e-12L, "1.23432e-12" },
2556         { 1.234321234321234e-11L, "1.23432e-11" },
2557         { 1.234321234321234e-10L, "1.23432e-10" },
2558         { 1.234321234321234e-9L, "1.23432e-09" },
2559         { 1.234321234321234e-8L, "1.23432e-08" },
2560         { 1.234321234321234e-7L, "1.23432e-07" },
2561         { 1.234321234321234e-6L, "1.23432e-06" },
2562         { 1.234321234321234e-5L, "1.23432e-05" },
2563         { 1.234321234321234e-4L, "0.000123432" },
2564         { 1.234321234321234e-3L, "0.00123432" },
2565         { 1.234321234321234e-2L, "0.0123432" },
2566         { 1.234321234321234e-1L, "0.123432" },
2567         { 1.234321234321234L, "1.23432" },
2568         { 1.234321234321234e1L, "12.3432" },
2569         { 1.234321234321234e2L, "123.432" },
2570         { 1.234321234321234e3L, "1234.32" },
2571         { 1.234321234321234e4L, "12343.2" },
2572         { 1.234321234321234e5L, "123432" },
2573         { 1.234321234321234e6L, "1.23432e+06" },
2574         { 1.234321234321234e7L, "1.23432e+07" },
2575         { 1.234321234321234e8L, "1.23432e+08" },
2576         { 1.234321234321234e9L, "1.23432e+09" },
2577         { 1.234321234321234e10L, "1.23432e+10" },
2578         { 1.234321234321234e11L, "1.23432e+11" },
2579         { 1.234321234321234e12L, "1.23432e+12" },
2580         { 1.234321234321234e13L, "1.23432e+13" },
2581         { 1.234321234321234e14L, "1.23432e+14" },
2582         { 1.234321234321234e15L, "1.23432e+15" },
2583         { 1.234321234321234e16L, "1.23432e+16" },
2584         { 1.234321234321234e17L, "1.23432e+17" },
2585         { 1.234321234321234e18L, "1.23432e+18" },
2586         { 1.234321234321234e19L, "1.23432e+19" },
2587         { 1.234321234321234e20L, "1.23432e+20" },
2588         { 1.234321234321234e21L, "1.23432e+21" },
2589         { 1.234321234321234e22L, "1.23432e+22" },
2590         { 1.234321234321234e23L, "1.23432e+23" },
2591         { 1.234321234321234e24L, "1.23432e+24" },
2592         { 1.234321234321234e25L, "1.23432e+25" },
2593         { 1.234321234321234e26L, "1.23432e+26" },
2594         { 1.234321234321234e27L, "1.23432e+27" },
2595         { 1.234321234321234e28L, "1.23432e+28" },
2596         { 1.234321234321234e29L, "1.23432e+29" },
2597         { 1.234321234321234e30L, "1.23432e+30" },
2598         { 1.234321234321234e31L, "1.23432e+31" },
2599         { 1.234321234321234e32L, "1.23432e+32" },
2600         { 1.234321234321234e33L, "1.23432e+33" },
2601         { 1.234321234321234e34L, "1.23432e+34" },
2602         { 1.234321234321234e35L, "1.23432e+35" },
2603         { 1.234321234321234e36L, "1.23432e+36" }
2604       };
2605     size_t k;
2606     for (k = 0; k < SIZEOF (data); k++)
2607       {
2608         size_t length;
2609         char *result =
2610           my_asnprintf (NULL, &length, "%Lg", data[k].value);
2611         ASSERT (result != NULL);
2612         ASSERT (strcmp (result, data[k].string) == 0);
2613         ASSERT (length == strlen (result));
2614         free (result);
2615       }
2616   }
2617
2618   { /* A negative number.  */
2619     size_t length;
2620     char *result =
2621       my_asnprintf (NULL, &length, "%Lg %d", -0.03125L, 33, 44, 55);
2622     ASSERT (result != NULL);
2623     ASSERT (strcmp (result, "-0.03125 33") == 0);
2624     ASSERT (length == strlen (result));
2625     free (result);
2626   }
2627
2628   { /* Positive zero.  */
2629     size_t length;
2630     char *result =
2631       my_asnprintf (NULL, &length, "%Lg %d", 0.0L, 33, 44, 55);
2632     ASSERT (result != NULL);
2633     ASSERT (strcmp (result, "0 33") == 0);
2634     ASSERT (length == strlen (result));
2635     free (result);
2636   }
2637
2638   { /* Negative zero.  */
2639     size_t length;
2640     char *result =
2641       my_asnprintf (NULL, &length, "%Lg %d", -0.0L, 33, 44, 55);
2642     ASSERT (result != NULL);
2643     if (have_minus_zero ())
2644       ASSERT (strcmp (result, "-0 33") == 0);
2645     ASSERT (length == strlen (result));
2646     free (result);
2647   }
2648
2649   { /* Positive infinity.  */
2650     size_t length;
2651     char *result =
2652       my_asnprintf (NULL, &length, "%Lg %d", 1.0L / 0.0L, 33, 44, 55);
2653     ASSERT (result != NULL);
2654     ASSERT (strcmp (result, "inf 33") == 0
2655             || strcmp (result, "infinity 33") == 0);
2656     ASSERT (length == strlen (result));
2657     free (result);
2658   }
2659
2660   { /* Negative infinity.  */
2661     size_t length;
2662     char *result =
2663       my_asnprintf (NULL, &length, "%Lg %d", -1.0L / 0.0L, 33, 44, 55);
2664     ASSERT (result != NULL);
2665     ASSERT (strcmp (result, "-inf 33") == 0
2666             || strcmp (result, "-infinity 33") == 0);
2667     ASSERT (length == strlen (result));
2668     free (result);
2669   }
2670
2671   { /* NaN.  */
2672     static long double zero = 0.0L;
2673     size_t length;
2674     char *result =
2675       my_asnprintf (NULL, &length, "%Lg %d", zero / zero, 33, 44, 55);
2676     ASSERT (result != NULL);
2677     ASSERT (strlen (result) >= 3 + 3
2678             && (memcmp (result, "nan", 3) == 0
2679                 || memcmp (result, "-nan", 4) == 0)
2680             && strcmp (result + strlen (result) - 3, " 33") == 0);
2681     ASSERT (length == strlen (result));
2682     free (result);
2683   }
2684
2685   { /* Width.  */
2686     size_t length;
2687     char *result =
2688       my_asnprintf (NULL, &length, "%10Lg %d", 1.75L, 33, 44, 55);
2689     ASSERT (result != NULL);
2690     ASSERT (strcmp (result, "      1.75 33") == 0);
2691     ASSERT (length == strlen (result));
2692     free (result);
2693   }
2694
2695   { /* FLAG_LEFT.  */
2696     size_t length;
2697     char *result =
2698       my_asnprintf (NULL, &length, "%-10Lg %d", 1.75L, 33, 44, 55);
2699     ASSERT (result != NULL);
2700     ASSERT (strcmp (result, "1.75       33") == 0);
2701     ASSERT (length == strlen (result));
2702     free (result);
2703   }
2704
2705   { /* FLAG_SHOWSIGN.  */
2706     size_t length;
2707     char *result =
2708       my_asnprintf (NULL, &length, "%+Lg %d", 1.75L, 33, 44, 55);
2709     ASSERT (result != NULL);
2710     ASSERT (strcmp (result, "+1.75 33") == 0);
2711     ASSERT (length == strlen (result));
2712     free (result);
2713   }
2714
2715   { /* FLAG_SPACE.  */
2716     size_t length;
2717     char *result =
2718       my_asnprintf (NULL, &length, "% Lg %d", 1.75L, 33, 44, 55);
2719     ASSERT (result != NULL);
2720     ASSERT (strcmp (result, " 1.75 33") == 0);
2721     ASSERT (length == strlen (result));
2722     free (result);
2723   }
2724
2725   { /* FLAG_ALT.  */
2726     size_t length;
2727     char *result =
2728       my_asnprintf (NULL, &length, "%#Lg %d", 1.75L, 33, 44, 55);
2729     ASSERT (result != NULL);
2730     ASSERT (strcmp (result, "1.75000 33") == 0);
2731     ASSERT (length == strlen (result));
2732     free (result);
2733   }
2734
2735   { /* FLAG_ALT.  */
2736     size_t length;
2737     char *result =
2738       my_asnprintf (NULL, &length, "%#.Lg %d", 1.75L, 33, 44, 55);
2739     ASSERT (result != NULL);
2740     ASSERT (strcmp (result, "2. 33") == 0);
2741     ASSERT (length == strlen (result));
2742     free (result);
2743   }
2744
2745   { /* FLAG_ALT.  */
2746     size_t length;
2747     char *result =
2748       my_asnprintf (NULL, &length, "%#.Lg %d", 9.75L, 33, 44, 55);
2749     ASSERT (result != NULL);
2750     ASSERT (strcmp (result, "1.e+01 33") == 0);
2751     ASSERT (length == strlen (result));
2752     free (result);
2753   }
2754
2755   { /* FLAG_ZERO with finite number.  */
2756     size_t length;
2757     char *result =
2758       my_asnprintf (NULL, &length, "%010Lg %d", 1234.0L, 33, 44, 55);
2759     ASSERT (result != NULL);
2760     ASSERT (strcmp (result, "0000001234 33") == 0);
2761     ASSERT (length == strlen (result));
2762     free (result);
2763   }
2764
2765   { /* FLAG_ZERO with infinite number.  */
2766     size_t length;
2767     char *result =
2768       my_asnprintf (NULL, &length, "%015Lg %d", -1.0L / 0.0L, 33, 44, 55);
2769     ASSERT (result != NULL);
2770     ASSERT (strcmp (result, "           -inf 33") == 0
2771             || strcmp (result, "      -infinity 33") == 0);
2772     ASSERT (length == strlen (result));
2773     free (result);
2774   }
2775
2776   { /* FLAG_ZERO with NaN.  */
2777     static long double zero = 0.0L;
2778     size_t length;
2779     char *result =
2780       my_asnprintf (NULL, &length, "%020Lg %d", zero / zero, 33, 44, 55);
2781     ASSERT (result != NULL);
2782     ASSERT (strlen (result) == 20 + 3
2783             && (memcmp (result + strspn (result, " "), "nan", 3) == 0
2784                 || memcmp (result + strspn (result, " "), "-nan", 4) == 0)
2785             && strcmp (result + strlen (result) - 3, " 33") == 0);
2786     ASSERT (length == strlen (result));
2787     free (result);
2788   }
2789
2790   { /* Precision.  */
2791     size_t length;
2792     char *result =
2793       my_asnprintf (NULL, &length, "%.Lg %d", 1234.0L, 33, 44, 55);
2794     ASSERT (result != NULL);
2795     ASSERT (strcmp (result, "1e+03 33") == 0);
2796     ASSERT (length == strlen (result));
2797     free (result);
2798   }
2799
2800   /* Test the support of the %n format directive.  */
2801
2802   {
2803     int count = -1;
2804     size_t length;
2805     char *result =
2806       my_asnprintf (NULL, &length, "%d %n", 123, &count, 33, 44, 55);
2807     ASSERT (result != NULL);
2808     ASSERT (strcmp (result, "123 ") == 0);
2809     ASSERT (length == strlen (result));
2810     ASSERT (count == 4);
2811     free (result);
2812   }
2813
2814   /* Test the support of the POSIX/XSI format strings with positions.  */
2815
2816   {
2817     size_t length;
2818     char *result =
2819       my_asnprintf (NULL, &length, "%2$d %1$d", 33, 55);
2820     ASSERT (result != NULL);
2821     ASSERT (strcmp (result, "55 33") == 0);
2822     ASSERT (length == strlen (result));
2823     free (result);
2824   }
2825
2826   /* Test the support of the grouping flag.  */
2827
2828   {
2829     size_t length;
2830     char *result =
2831       my_asnprintf (NULL, &length, "%'d %d", 1234567, 99);
2832     ASSERT (result != NULL);
2833     ASSERT (result[strlen (result) - 1] == '9');
2834     ASSERT (length == strlen (result));
2835     free (result);
2836   }
2837 }
2838
2839 static char *
2840 my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
2841 {
2842   va_list args;
2843   char *ret;
2844
2845   va_start (args, format);
2846   ret = vasnprintf (resultbuf, lengthp, format, args);
2847   va_end (args);
2848   return ret;
2849 }
2850
2851 static void
2852 test_vasnprintf ()
2853 {
2854   test_function (my_asnprintf);
2855 }
2856
2857 static void
2858 test_asnprintf ()
2859 {
2860   test_function (asnprintf);
2861 }
2862
2863 int
2864 main (int argc, char *argv[])
2865 {
2866   test_vasnprintf ();
2867   test_asnprintf ();
2868   return 0;
2869 }