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