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