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