Add tests for %e and %g directives.
[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     ASSERT (retval == strlen (result));
1310   }
1311
1312   { /* A larger positive number.  */
1313     char result[100];
1314     int retval =
1315       my_snprintf (result, sizeof (result), "%e %d", 1234567.0, 33, 44, 55);
1316     ASSERT (strcmp (result, "1.234567e+06 33") == 0);
1317     ASSERT (retval == strlen (result));
1318   }
1319
1320   { /* Small and large positive numbers.  */
1321     static struct { double value; const char *string; } data[] =
1322       {
1323         { 1.234321234321234e-37, "1.234321e-37" },
1324         { 1.234321234321234e-36, "1.234321e-36" },
1325         { 1.234321234321234e-35, "1.234321e-35" },
1326         { 1.234321234321234e-34, "1.234321e-34" },
1327         { 1.234321234321234e-33, "1.234321e-33" },
1328         { 1.234321234321234e-32, "1.234321e-32" },
1329         { 1.234321234321234e-31, "1.234321e-31" },
1330         { 1.234321234321234e-30, "1.234321e-30" },
1331         { 1.234321234321234e-29, "1.234321e-29" },
1332         { 1.234321234321234e-28, "1.234321e-28" },
1333         { 1.234321234321234e-27, "1.234321e-27" },
1334         { 1.234321234321234e-26, "1.234321e-26" },
1335         { 1.234321234321234e-25, "1.234321e-25" },
1336         { 1.234321234321234e-24, "1.234321e-24" },
1337         { 1.234321234321234e-23, "1.234321e-23" },
1338         { 1.234321234321234e-22, "1.234321e-22" },
1339         { 1.234321234321234e-21, "1.234321e-21" },
1340         { 1.234321234321234e-20, "1.234321e-20" },
1341         { 1.234321234321234e-19, "1.234321e-19" },
1342         { 1.234321234321234e-18, "1.234321e-18" },
1343         { 1.234321234321234e-17, "1.234321e-17" },
1344         { 1.234321234321234e-16, "1.234321e-16" },
1345         { 1.234321234321234e-15, "1.234321e-15" },
1346         { 1.234321234321234e-14, "1.234321e-14" },
1347         { 1.234321234321234e-13, "1.234321e-13" },
1348         { 1.234321234321234e-12, "1.234321e-12" },
1349         { 1.234321234321234e-11, "1.234321e-11" },
1350         { 1.234321234321234e-10, "1.234321e-10" },
1351         { 1.234321234321234e-9, "1.234321e-09" },
1352         { 1.234321234321234e-8, "1.234321e-08" },
1353         { 1.234321234321234e-7, "1.234321e-07" },
1354         { 1.234321234321234e-6, "1.234321e-06" },
1355         { 1.234321234321234e-5, "1.234321e-05" },
1356         { 1.234321234321234e-4, "1.234321e-04" },
1357         { 1.234321234321234e-3, "1.234321e-03" },
1358         { 1.234321234321234e-2, "1.234321e-02" },
1359         { 1.234321234321234e-1, "1.234321e-01" },
1360         { 1.234321234321234, "1.234321e+00" },
1361         { 1.234321234321234e1, "1.234321e+01" },
1362         { 1.234321234321234e2, "1.234321e+02" },
1363         { 1.234321234321234e3, "1.234321e+03" },
1364         { 1.234321234321234e4, "1.234321e+04" },
1365         { 1.234321234321234e5, "1.234321e+05" },
1366         { 1.234321234321234e6, "1.234321e+06" },
1367         { 1.234321234321234e7, "1.234321e+07" },
1368         { 1.234321234321234e8, "1.234321e+08" },
1369         { 1.234321234321234e9, "1.234321e+09" },
1370         { 1.234321234321234e10, "1.234321e+10" },
1371         { 1.234321234321234e11, "1.234321e+11" },
1372         { 1.234321234321234e12, "1.234321e+12" },
1373         { 1.234321234321234e13, "1.234321e+13" },
1374         { 1.234321234321234e14, "1.234321e+14" },
1375         { 1.234321234321234e15, "1.234321e+15" },
1376         { 1.234321234321234e16, "1.234321e+16" },
1377         { 1.234321234321234e17, "1.234321e+17" },
1378         { 1.234321234321234e18, "1.234321e+18" },
1379         { 1.234321234321234e19, "1.234321e+19" },
1380         { 1.234321234321234e20, "1.234321e+20" },
1381         { 1.234321234321234e21, "1.234321e+21" },
1382         { 1.234321234321234e22, "1.234321e+22" },
1383         { 1.234321234321234e23, "1.234321e+23" },
1384         { 1.234321234321234e24, "1.234321e+24" },
1385         { 1.234321234321234e25, "1.234321e+25" },
1386         { 1.234321234321234e26, "1.234321e+26" },
1387         { 1.234321234321234e27, "1.234321e+27" },
1388         { 1.234321234321234e28, "1.234321e+28" },
1389         { 1.234321234321234e29, "1.234321e+29" },
1390         { 1.234321234321234e30, "1.234321e+30" },
1391         { 1.234321234321234e31, "1.234321e+31" },
1392         { 1.234321234321234e32, "1.234321e+32" },
1393         { 1.234321234321234e33, "1.234321e+33" },
1394         { 1.234321234321234e34, "1.234321e+34" },
1395         { 1.234321234321234e35, "1.234321e+35" },
1396         { 1.234321234321234e36, "1.234321e+36" }
1397       };
1398     size_t k;
1399     for (k = 0; k < SIZEOF (data); k++)
1400       {
1401         char result[100];
1402         int retval =
1403           my_snprintf (result, sizeof (result), "%e", data[k].value);
1404         ASSERT (strmatch (data[k].string, result));
1405         ASSERT (retval == strlen (result));
1406       }
1407   }
1408
1409   { /* A negative number.  */
1410     char result[100];
1411     int retval =
1412       my_snprintf (result, sizeof (result), "%e %d", -0.03125, 33, 44, 55);
1413     ASSERT (strcmp (result, "-3.125000e-02 33") == 0);
1414     ASSERT (retval == strlen (result));
1415   }
1416
1417   { /* Positive zero.  */
1418     char result[100];
1419     int retval =
1420       my_snprintf (result, sizeof (result), "%e %d", 0.0, 33, 44, 55);
1421     ASSERT (strcmp (result, "0.000000e+00 33") == 0);
1422     ASSERT (retval == strlen (result));
1423   }
1424
1425   { /* Negative zero.  */
1426     char result[100];
1427     int retval =
1428       my_snprintf (result, sizeof (result), "%e %d", -0.0, 33, 44, 55);
1429     ASSERT (strcmp (result, "-0.000000e+00 33") == 0);
1430     ASSERT (retval == strlen (result));
1431   }
1432
1433   { /* Positive infinity.  */
1434     char result[100];
1435     int retval =
1436       my_snprintf (result, sizeof (result), "%e %d", 1.0 / 0.0, 33, 44, 55);
1437     ASSERT (strcmp (result, "inf 33") == 0
1438             || strcmp (result, "infinity 33") == 0);
1439     ASSERT (retval == strlen (result));
1440   }
1441
1442   { /* Negative infinity.  */
1443     char result[100];
1444     int retval =
1445       my_snprintf (result, sizeof (result), "%e %d", -1.0 / 0.0, 33, 44, 55);
1446     ASSERT (strcmp (result, "-inf 33") == 0
1447             || strcmp (result, "-infinity 33") == 0);
1448     ASSERT (retval == strlen (result));
1449   }
1450
1451   { /* NaN.  */
1452     char result[100];
1453     int retval =
1454       my_snprintf (result, sizeof (result), "%e %d", NaN (), 33, 44, 55);
1455     ASSERT (strcmp (result, "nan 33") == 0);
1456     ASSERT (retval == strlen (result));
1457   }
1458
1459   { /* Width.  */
1460     char result[100];
1461     int retval =
1462       my_snprintf (result, sizeof (result), "%15e %d", 1.75, 33, 44, 55);
1463     ASSERT (strcmp (result, "   1.750000e+00 33") == 0);
1464     ASSERT (retval == strlen (result));
1465   }
1466
1467   { /* FLAG_LEFT.  */
1468     char result[100];
1469     int retval =
1470       my_snprintf (result, sizeof (result), "%-15e %d", 1.75, 33, 44, 55);
1471     ASSERT (strcmp (result, "1.750000e+00    33") == 0);
1472     ASSERT (retval == strlen (result));
1473   }
1474
1475   { /* FLAG_SHOWSIGN.  */
1476     char result[100];
1477     int retval =
1478       my_snprintf (result, sizeof (result), "%+e %d", 1.75, 33, 44, 55);
1479     ASSERT (strcmp (result, "+1.750000e+00 33") == 0);
1480     ASSERT (retval == strlen (result));
1481   }
1482
1483   { /* FLAG_SPACE.  */
1484     char result[100];
1485     int retval =
1486       my_snprintf (result, sizeof (result), "% e %d", 1.75, 33, 44, 55);
1487     ASSERT (strcmp (result, " 1.750000e+00 33") == 0);
1488     ASSERT (retval == strlen (result));
1489   }
1490
1491   { /* FLAG_ALT.  */
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     ASSERT (retval == strlen (result));
1497   }
1498
1499   { /* FLAG_ALT.  */
1500     char result[100];
1501     int retval =
1502       my_snprintf (result, sizeof (result), "%#.e %d", 1.75, 33, 44, 55);
1503     ASSERT (strcmp (result, "2.e+00 33") == 0);
1504     ASSERT (retval == strlen (result));
1505   }
1506
1507   { /* FLAG_ALT.  */
1508     char result[100];
1509     int retval =
1510       my_snprintf (result, sizeof (result), "%#.e %d", 9.75, 33, 44, 55);
1511     ASSERT (strcmp (result, "1.e+01 33") == 0);
1512     ASSERT (retval == strlen (result));
1513   }
1514
1515   { /* FLAG_ZERO with finite number.  */
1516     char result[100];
1517     int retval =
1518       my_snprintf (result, sizeof (result), "%015e %d", 1234.0, 33, 44, 55);
1519     ASSERT (strcmp (result, "0001.234000e+03 33") == 0);
1520     ASSERT (retval == strlen (result));
1521   }
1522
1523   { /* FLAG_ZERO with infinite number.  */
1524     char result[100];
1525     int retval =
1526       my_snprintf (result, sizeof (result), "%015e %d", -1.0 / 0.0, 33, 44, 55);
1527     ASSERT (strcmp (result, "           -inf 33") == 0
1528             || strcmp (result, "      -infinity 33") == 0);
1529     ASSERT (retval == strlen (result));
1530   }
1531
1532   { /* FLAG_ZERO with NaN.  */
1533     char result[100];
1534     int retval =
1535       my_snprintf (result, sizeof (result), "%015e %d", NaN (), 33, 44, 55);
1536     ASSERT (strcmp (result, "            nan 33") == 0);
1537     ASSERT (retval == strlen (result));
1538   }
1539
1540   { /* Precision.  */
1541     char result[100];
1542     int retval =
1543       my_snprintf (result, sizeof (result), "%.e %d", 1234.0, 33, 44, 55);
1544     ASSERT (strcmp (result, "1e+03 33") == 0);
1545     ASSERT (retval == strlen (result));
1546   }
1547
1548   { /* A positive number.  */
1549     char result[100];
1550     int retval =
1551       my_snprintf (result, sizeof (result), "%Le %d", 12.75L, 33, 44, 55);
1552     ASSERT (strcmp (result, "1.275000e+01 33") == 0);
1553     ASSERT (retval == strlen (result));
1554   }
1555
1556   { /* A larger positive number.  */
1557     char result[100];
1558     int retval =
1559       my_snprintf (result, sizeof (result), "%Le %d", 1234567.0L, 33, 44, 55);
1560     ASSERT (strcmp (result, "1.234567e+06 33") == 0);
1561     ASSERT (retval == strlen (result));
1562   }
1563
1564   { /* Small and large positive numbers.  */
1565     static struct { long double value; const char *string; } data[] =
1566       {
1567         { 1.234321234321234e-37L, "1.234321e-37" },
1568         { 1.234321234321234e-36L, "1.234321e-36" },
1569         { 1.234321234321234e-35L, "1.234321e-35" },
1570         { 1.234321234321234e-34L, "1.234321e-34" },
1571         { 1.234321234321234e-33L, "1.234321e-33" },
1572         { 1.234321234321234e-32L, "1.234321e-32" },
1573         { 1.234321234321234e-31L, "1.234321e-31" },
1574         { 1.234321234321234e-30L, "1.234321e-30" },
1575         { 1.234321234321234e-29L, "1.234321e-29" },
1576         { 1.234321234321234e-28L, "1.234321e-28" },
1577         { 1.234321234321234e-27L, "1.234321e-27" },
1578         { 1.234321234321234e-26L, "1.234321e-26" },
1579         { 1.234321234321234e-25L, "1.234321e-25" },
1580         { 1.234321234321234e-24L, "1.234321e-24" },
1581         { 1.234321234321234e-23L, "1.234321e-23" },
1582         { 1.234321234321234e-22L, "1.234321e-22" },
1583         { 1.234321234321234e-21L, "1.234321e-21" },
1584         { 1.234321234321234e-20L, "1.234321e-20" },
1585         { 1.234321234321234e-19L, "1.234321e-19" },
1586         { 1.234321234321234e-18L, "1.234321e-18" },
1587         { 1.234321234321234e-17L, "1.234321e-17" },
1588         { 1.234321234321234e-16L, "1.234321e-16" },
1589         { 1.234321234321234e-15L, "1.234321e-15" },
1590         { 1.234321234321234e-14L, "1.234321e-14" },
1591         { 1.234321234321234e-13L, "1.234321e-13" },
1592         { 1.234321234321234e-12L, "1.234321e-12" },
1593         { 1.234321234321234e-11L, "1.234321e-11" },
1594         { 1.234321234321234e-10L, "1.234321e-10" },
1595         { 1.234321234321234e-9L, "1.234321e-09" },
1596         { 1.234321234321234e-8L, "1.234321e-08" },
1597         { 1.234321234321234e-7L, "1.234321e-07" },
1598         { 1.234321234321234e-6L, "1.234321e-06" },
1599         { 1.234321234321234e-5L, "1.234321e-05" },
1600         { 1.234321234321234e-4L, "1.234321e-04" },
1601         { 1.234321234321234e-3L, "1.234321e-03" },
1602         { 1.234321234321234e-2L, "1.234321e-02" },
1603         { 1.234321234321234e-1L, "1.234321e-01" },
1604         { 1.234321234321234L, "1.234321e+00" },
1605         { 1.234321234321234e1L, "1.234321e+01" },
1606         { 1.234321234321234e2L, "1.234321e+02" },
1607         { 1.234321234321234e3L, "1.234321e+03" },
1608         { 1.234321234321234e4L, "1.234321e+04" },
1609         { 1.234321234321234e5L, "1.234321e+05" },
1610         { 1.234321234321234e6L, "1.234321e+06" },
1611         { 1.234321234321234e7L, "1.234321e+07" },
1612         { 1.234321234321234e8L, "1.234321e+08" },
1613         { 1.234321234321234e9L, "1.234321e+09" },
1614         { 1.234321234321234e10L, "1.234321e+10" },
1615         { 1.234321234321234e11L, "1.234321e+11" },
1616         { 1.234321234321234e12L, "1.234321e+12" },
1617         { 1.234321234321234e13L, "1.234321e+13" },
1618         { 1.234321234321234e14L, "1.234321e+14" },
1619         { 1.234321234321234e15L, "1.234321e+15" },
1620         { 1.234321234321234e16L, "1.234321e+16" },
1621         { 1.234321234321234e17L, "1.234321e+17" },
1622         { 1.234321234321234e18L, "1.234321e+18" },
1623         { 1.234321234321234e19L, "1.234321e+19" },
1624         { 1.234321234321234e20L, "1.234321e+20" },
1625         { 1.234321234321234e21L, "1.234321e+21" },
1626         { 1.234321234321234e22L, "1.234321e+22" },
1627         { 1.234321234321234e23L, "1.234321e+23" },
1628         { 1.234321234321234e24L, "1.234321e+24" },
1629         { 1.234321234321234e25L, "1.234321e+25" },
1630         { 1.234321234321234e26L, "1.234321e+26" },
1631         { 1.234321234321234e27L, "1.234321e+27" },
1632         { 1.234321234321234e28L, "1.234321e+28" },
1633         { 1.234321234321234e29L, "1.234321e+29" },
1634         { 1.234321234321234e30L, "1.234321e+30" },
1635         { 1.234321234321234e31L, "1.234321e+31" },
1636         { 1.234321234321234e32L, "1.234321e+32" },
1637         { 1.234321234321234e33L, "1.234321e+33" },
1638         { 1.234321234321234e34L, "1.234321e+34" },
1639         { 1.234321234321234e35L, "1.234321e+35" },
1640         { 1.234321234321234e36L, "1.234321e+36" }
1641       };
1642     size_t k;
1643     for (k = 0; k < SIZEOF (data); k++)
1644       {
1645         char result[100];
1646         int retval =
1647           my_snprintf (result, sizeof (result), "%Le", data[k].value);
1648         ASSERT (strmatch (data[k].string, result));
1649         ASSERT (retval == strlen (result));
1650       }
1651   }
1652
1653   { /* A negative number.  */
1654     char result[100];
1655     int retval =
1656       my_snprintf (result, sizeof (result), "%Le %d", -0.03125L, 33, 44, 55);
1657     ASSERT (strcmp (result, "-3.125000e-02 33") == 0);
1658     ASSERT (retval == strlen (result));
1659   }
1660
1661   { /* Positive zero.  */
1662     char result[100];
1663     int retval =
1664       my_snprintf (result, sizeof (result), "%Le %d", 0.0L, 33, 44, 55);
1665     ASSERT (strcmp (result, "0.000000e+00 33") == 0);
1666     ASSERT (retval == strlen (result));
1667   }
1668
1669   { /* Negative zero.  */
1670     char result[100];
1671     int retval =
1672       my_snprintf (result, sizeof (result), "%Le %d", -0.0L, 33, 44, 55);
1673     ASSERT (strcmp (result, "-0.000000e+00 33") == 0);
1674     ASSERT (retval == strlen (result));
1675   }
1676
1677   { /* Positive infinity.  */
1678     char result[100];
1679     int retval =
1680       my_snprintf (result, sizeof (result), "%Le %d", 1.0L / 0.0L, 33, 44, 55);
1681     ASSERT (strcmp (result, "inf 33") == 0
1682             || strcmp (result, "infinity 33") == 0);
1683     ASSERT (retval == strlen (result));
1684   }
1685
1686   { /* Negative infinity.  */
1687     char result[100];
1688     int retval =
1689       my_snprintf (result, sizeof (result), "%Le %d", -1.0L / 0.0L, 33, 44, 55);
1690     ASSERT (strcmp (result, "-inf 33") == 0
1691             || strcmp (result, "-infinity 33") == 0);
1692     ASSERT (retval == strlen (result));
1693   }
1694
1695   { /* NaN.  */
1696     static long double zero = 0.0L;
1697     char result[100];
1698     int retval =
1699       my_snprintf (result, sizeof (result), "%Le %d", zero / zero, 33, 44, 55);
1700     ASSERT (strcmp (result, "nan 33") == 0);
1701     ASSERT (retval == strlen (result));
1702   }
1703
1704   { /* Width.  */
1705     char result[100];
1706     int retval =
1707       my_snprintf (result, sizeof (result), "%15Le %d", 1.75L, 33, 44, 55);
1708     ASSERT (strcmp (result, "   1.750000e+00 33") == 0);
1709     ASSERT (retval == strlen (result));
1710   }
1711
1712   { /* FLAG_LEFT.  */
1713     char result[100];
1714     int retval =
1715       my_snprintf (result, sizeof (result), "%-15Le %d", 1.75L, 33, 44, 55);
1716     ASSERT (strcmp (result, "1.750000e+00    33") == 0);
1717     ASSERT (retval == strlen (result));
1718   }
1719
1720   { /* FLAG_SHOWSIGN.  */
1721     char result[100];
1722     int retval =
1723       my_snprintf (result, sizeof (result), "%+Le %d", 1.75L, 33, 44, 55);
1724     ASSERT (strcmp (result, "+1.750000e+00 33") == 0);
1725     ASSERT (retval == strlen (result));
1726   }
1727
1728   { /* FLAG_SPACE.  */
1729     char result[100];
1730     int retval =
1731       my_snprintf (result, sizeof (result), "% Le %d", 1.75L, 33, 44, 55);
1732     ASSERT (strcmp (result, " 1.750000e+00 33") == 0);
1733     ASSERT (retval == strlen (result));
1734   }
1735
1736   { /* FLAG_ALT.  */
1737     char result[100];
1738     int retval =
1739       my_snprintf (result, sizeof (result), "%#Le %d", 1.75L, 33, 44, 55);
1740     ASSERT (strcmp (result, "1.750000e+00 33") == 0);
1741     ASSERT (retval == strlen (result));
1742   }
1743
1744   { /* FLAG_ALT.  */
1745     char result[100];
1746     int retval =
1747       my_snprintf (result, sizeof (result), "%#.Le %d", 1.75L, 33, 44, 55);
1748     ASSERT (strcmp (result, "2.e+00 33") == 0);
1749     ASSERT (retval == strlen (result));
1750   }
1751
1752   { /* FLAG_ALT.  */
1753     char result[100];
1754     int retval =
1755       my_snprintf (result, sizeof (result), "%#.Le %d", 9.75L, 33, 44, 55);
1756     ASSERT (strcmp (result, "1.e+01 33") == 0);
1757     ASSERT (retval == strlen (result));
1758   }
1759
1760   { /* FLAG_ZERO with finite number.  */
1761     char result[100];
1762     int retval =
1763       my_snprintf (result, sizeof (result), "%015Le %d", 1234.0L, 33, 44, 55);
1764     ASSERT (strcmp (result, "0001.234000e+03 33") == 0);
1765     ASSERT (retval == strlen (result));
1766   }
1767
1768   { /* FLAG_ZERO with infinite number.  */
1769     char result[100];
1770     int retval =
1771       my_snprintf (result, sizeof (result), "%015Le %d", -1.0L / 0.0L, 33, 44, 55);
1772     ASSERT (strcmp (result, "           -inf 33") == 0
1773             || strcmp (result, "      -infinity 33") == 0);
1774     ASSERT (retval == strlen (result));
1775   }
1776
1777   { /* FLAG_ZERO with NaN.  */
1778     static long double zero = 0.0L;
1779     char result[100];
1780     int retval =
1781       my_snprintf (result, sizeof (result), "%015Le %d", zero / zero, 33, 44, 55);
1782     ASSERT (strcmp (result, "            nan 33") == 0);
1783     ASSERT (retval == strlen (result));
1784   }
1785
1786   { /* Precision.  */
1787     char result[100];
1788     int retval =
1789       my_snprintf (result, sizeof (result), "%.Le %d", 1234.0L, 33, 44, 55);
1790     ASSERT (strcmp (result, "1e+03 33") == 0);
1791     ASSERT (retval == strlen (result));
1792   }
1793
1794   /* Test the support of the %g format directive.  */
1795
1796   { /* A positive number.  */
1797     char result[100];
1798     int retval =
1799       my_snprintf (result, sizeof (result), "%g %d", 12.75, 33, 44, 55);
1800     ASSERT (strcmp (result, "12.75 33") == 0);
1801     ASSERT (retval == strlen (result));
1802   }
1803
1804   { /* A larger positive number.  */
1805     char result[100];
1806     int retval =
1807       my_snprintf (result, sizeof (result), "%g %d", 1234567.0, 33, 44, 55);
1808     ASSERT (strcmp (result, "1.23457e+06 33") == 0);
1809     ASSERT (retval == strlen (result));
1810   }
1811
1812   { /* Small and large positive numbers.  */
1813     static struct { double value; const char *string; } data[] =
1814       {
1815         { 1.234321234321234e-37, "1.23432e-37" },
1816         { 1.234321234321234e-36, "1.23432e-36" },
1817         { 1.234321234321234e-35, "1.23432e-35" },
1818         { 1.234321234321234e-34, "1.23432e-34" },
1819         { 1.234321234321234e-33, "1.23432e-33" },
1820         { 1.234321234321234e-32, "1.23432e-32" },
1821         { 1.234321234321234e-31, "1.23432e-31" },
1822         { 1.234321234321234e-30, "1.23432e-30" },
1823         { 1.234321234321234e-29, "1.23432e-29" },
1824         { 1.234321234321234e-28, "1.23432e-28" },
1825         { 1.234321234321234e-27, "1.23432e-27" },
1826         { 1.234321234321234e-26, "1.23432e-26" },
1827         { 1.234321234321234e-25, "1.23432e-25" },
1828         { 1.234321234321234e-24, "1.23432e-24" },
1829         { 1.234321234321234e-23, "1.23432e-23" },
1830         { 1.234321234321234e-22, "1.23432e-22" },
1831         { 1.234321234321234e-21, "1.23432e-21" },
1832         { 1.234321234321234e-20, "1.23432e-20" },
1833         { 1.234321234321234e-19, "1.23432e-19" },
1834         { 1.234321234321234e-18, "1.23432e-18" },
1835         { 1.234321234321234e-17, "1.23432e-17" },
1836         { 1.234321234321234e-16, "1.23432e-16" },
1837         { 1.234321234321234e-15, "1.23432e-15" },
1838         { 1.234321234321234e-14, "1.23432e-14" },
1839         { 1.234321234321234e-13, "1.23432e-13" },
1840         { 1.234321234321234e-12, "1.23432e-12" },
1841         { 1.234321234321234e-11, "1.23432e-11" },
1842         { 1.234321234321234e-10, "1.23432e-10" },
1843         { 1.234321234321234e-9, "1.23432e-09" },
1844         { 1.234321234321234e-8, "1.23432e-08" },
1845         { 1.234321234321234e-7, "1.23432e-07" },
1846         { 1.234321234321234e-6, "1.23432e-06" },
1847         { 1.234321234321234e-5, "1.23432e-05" },
1848         { 1.234321234321234e-4, "0.000123432" },
1849         { 1.234321234321234e-3, "0.00123432" },
1850         { 1.234321234321234e-2, "0.0123432" },
1851         { 1.234321234321234e-1, "0.123432" },
1852         { 1.234321234321234, "1.23432" },
1853         { 1.234321234321234e1, "12.3432" },
1854         { 1.234321234321234e2, "123.432" },
1855         { 1.234321234321234e3, "1234.32" },
1856         { 1.234321234321234e4, "12343.2" },
1857         { 1.234321234321234e5, "123432" },
1858         { 1.234321234321234e6, "1.23432e+06" },
1859         { 1.234321234321234e7, "1.23432e+07" },
1860         { 1.234321234321234e8, "1.23432e+08" },
1861         { 1.234321234321234e9, "1.23432e+09" },
1862         { 1.234321234321234e10, "1.23432e+10" },
1863         { 1.234321234321234e11, "1.23432e+11" },
1864         { 1.234321234321234e12, "1.23432e+12" },
1865         { 1.234321234321234e13, "1.23432e+13" },
1866         { 1.234321234321234e14, "1.23432e+14" },
1867         { 1.234321234321234e15, "1.23432e+15" },
1868         { 1.234321234321234e16, "1.23432e+16" },
1869         { 1.234321234321234e17, "1.23432e+17" },
1870         { 1.234321234321234e18, "1.23432e+18" },
1871         { 1.234321234321234e19, "1.23432e+19" },
1872         { 1.234321234321234e20, "1.23432e+20" },
1873         { 1.234321234321234e21, "1.23432e+21" },
1874         { 1.234321234321234e22, "1.23432e+22" },
1875         { 1.234321234321234e23, "1.23432e+23" },
1876         { 1.234321234321234e24, "1.23432e+24" },
1877         { 1.234321234321234e25, "1.23432e+25" },
1878         { 1.234321234321234e26, "1.23432e+26" },
1879         { 1.234321234321234e27, "1.23432e+27" },
1880         { 1.234321234321234e28, "1.23432e+28" },
1881         { 1.234321234321234e29, "1.23432e+29" },
1882         { 1.234321234321234e30, "1.23432e+30" },
1883         { 1.234321234321234e31, "1.23432e+31" },
1884         { 1.234321234321234e32, "1.23432e+32" },
1885         { 1.234321234321234e33, "1.23432e+33" },
1886         { 1.234321234321234e34, "1.23432e+34" },
1887         { 1.234321234321234e35, "1.23432e+35" },
1888         { 1.234321234321234e36, "1.23432e+36" }
1889       };
1890     size_t k;
1891     for (k = 0; k < SIZEOF (data); k++)
1892       {
1893         char result[100];
1894         int retval =
1895           my_snprintf (result, sizeof (result), "%g", data[k].value);
1896         ASSERT (strmatch (data[k].string, result));
1897         ASSERT (retval == strlen (result));
1898       }
1899   }
1900
1901   { /* A negative number.  */
1902     char result[100];
1903     int retval =
1904       my_snprintf (result, sizeof (result), "%g %d", -0.03125, 33, 44, 55);
1905     ASSERT (strcmp (result, "-0.03125 33") == 0);
1906     ASSERT (retval == strlen (result));
1907   }
1908
1909   { /* Positive zero.  */
1910     char result[100];
1911     int retval =
1912       my_snprintf (result, sizeof (result), "%g %d", 0.0, 33, 44, 55);
1913     ASSERT (strcmp (result, "0 33") == 0);
1914     ASSERT (retval == strlen (result));
1915   }
1916
1917   { /* Negative zero.  */
1918     char result[100];
1919     int retval =
1920       my_snprintf (result, sizeof (result), "%g %d", -0.0, 33, 44, 55);
1921     ASSERT (strcmp (result, "-0 33") == 0);
1922     ASSERT (retval == strlen (result));
1923   }
1924
1925   { /* Positive infinity.  */
1926     char result[100];
1927     int retval =
1928       my_snprintf (result, sizeof (result), "%g %d", 1.0 / 0.0, 33, 44, 55);
1929     ASSERT (strcmp (result, "inf 33") == 0
1930             || strcmp (result, "infinity 33") == 0);
1931     ASSERT (retval == strlen (result));
1932   }
1933
1934   { /* Negative infinity.  */
1935     char result[100];
1936     int retval =
1937       my_snprintf (result, sizeof (result), "%g %d", -1.0 / 0.0, 33, 44, 55);
1938     ASSERT (strcmp (result, "-inf 33") == 0
1939             || strcmp (result, "-infinity 33") == 0);
1940     ASSERT (retval == strlen (result));
1941   }
1942
1943   { /* NaN.  */
1944     char result[100];
1945     int retval =
1946       my_snprintf (result, sizeof (result), "%g %d", NaN (), 33, 44, 55);
1947     ASSERT (strcmp (result, "nan 33") == 0);
1948     ASSERT (retval == strlen (result));
1949   }
1950
1951   { /* Width.  */
1952     char result[100];
1953     int retval =
1954       my_snprintf (result, sizeof (result), "%10g %d", 1.75, 33, 44, 55);
1955     ASSERT (strcmp (result, "      1.75 33") == 0);
1956     ASSERT (retval == strlen (result));
1957   }
1958
1959   { /* FLAG_LEFT.  */
1960     char result[100];
1961     int retval =
1962       my_snprintf (result, sizeof (result), "%-10g %d", 1.75, 33, 44, 55);
1963     ASSERT (strcmp (result, "1.75       33") == 0);
1964     ASSERT (retval == strlen (result));
1965   }
1966
1967   { /* FLAG_SHOWSIGN.  */
1968     char result[100];
1969     int retval =
1970       my_snprintf (result, sizeof (result), "%+g %d", 1.75, 33, 44, 55);
1971     ASSERT (strcmp (result, "+1.75 33") == 0);
1972     ASSERT (retval == strlen (result));
1973   }
1974
1975   { /* FLAG_SPACE.  */
1976     char result[100];
1977     int retval =
1978       my_snprintf (result, sizeof (result), "% g %d", 1.75, 33, 44, 55);
1979     ASSERT (strcmp (result, " 1.75 33") == 0);
1980     ASSERT (retval == strlen (result));
1981   }
1982
1983   { /* FLAG_ALT.  */
1984     char result[100];
1985     int retval =
1986       my_snprintf (result, sizeof (result), "%#g %d", 1.75, 33, 44, 55);
1987     ASSERT (strcmp (result, "1.75000 33") == 0);
1988     ASSERT (retval == strlen (result));
1989   }
1990
1991   { /* FLAG_ALT.  */
1992     char result[100];
1993     int retval =
1994       my_snprintf (result, sizeof (result), "%#.g %d", 1.75, 33, 44, 55);
1995     ASSERT (strcmp (result, "2. 33") == 0);
1996     ASSERT (retval == strlen (result));
1997   }
1998
1999   { /* FLAG_ALT.  */
2000     char result[100];
2001     int retval =
2002       my_snprintf (result, sizeof (result), "%#.g %d", 9.75, 33, 44, 55);
2003     ASSERT (strcmp (result, "1.e+01 33") == 0);
2004     ASSERT (retval == strlen (result));
2005   }
2006
2007   { /* FLAG_ZERO with finite number.  */
2008     char result[100];
2009     int retval =
2010       my_snprintf (result, sizeof (result), "%010g %d", 1234.0, 33, 44, 55);
2011     ASSERT (strcmp (result, "0000001234 33") == 0);
2012     ASSERT (retval == strlen (result));
2013   }
2014
2015   { /* FLAG_ZERO with infinite number.  */
2016     char result[100];
2017     int retval =
2018       my_snprintf (result, sizeof (result), "%015g %d", -1.0 / 0.0, 33, 44, 55);
2019     ASSERT (strcmp (result, "           -inf 33") == 0
2020             || strcmp (result, "      -infinity 33") == 0);
2021     ASSERT (retval == strlen (result));
2022   }
2023
2024   { /* FLAG_ZERO with NaN.  */
2025     char result[100];
2026     int retval =
2027       my_snprintf (result, sizeof (result), "%015g %d", NaN (), 33, 44, 55);
2028     ASSERT (strcmp (result, "            nan 33") == 0);
2029     ASSERT (retval == strlen (result));
2030   }
2031
2032   { /* Precision.  */
2033     char result[100];
2034     int retval =
2035       my_snprintf (result, sizeof (result), "%.g %d", 1234.0, 33, 44, 55);
2036     ASSERT (strcmp (result, "1e+03 33") == 0);
2037     ASSERT (retval == strlen (result));
2038   }
2039
2040   { /* A positive number.  */
2041     char result[100];
2042     int retval =
2043       my_snprintf (result, sizeof (result), "%Lg %d", 12.75L, 33, 44, 55);
2044     ASSERT (strcmp (result, "12.75 33") == 0);
2045     ASSERT (retval == strlen (result));
2046   }
2047
2048   { /* A larger positive number.  */
2049     char result[100];
2050     int retval =
2051       my_snprintf (result, sizeof (result), "%Lg %d", 1234567.0L, 33, 44, 55);
2052     ASSERT (strcmp (result, "1.23457e+06 33") == 0);
2053     ASSERT (retval == strlen (result));
2054   }
2055
2056   { /* Small and large positive numbers.  */
2057     static struct { long double value; const char *string; } data[] =
2058       {
2059         { 1.234321234321234e-37L, "1.23432e-37" },
2060         { 1.234321234321234e-36L, "1.23432e-36" },
2061         { 1.234321234321234e-35L, "1.23432e-35" },
2062         { 1.234321234321234e-34L, "1.23432e-34" },
2063         { 1.234321234321234e-33L, "1.23432e-33" },
2064         { 1.234321234321234e-32L, "1.23432e-32" },
2065         { 1.234321234321234e-31L, "1.23432e-31" },
2066         { 1.234321234321234e-30L, "1.23432e-30" },
2067         { 1.234321234321234e-29L, "1.23432e-29" },
2068         { 1.234321234321234e-28L, "1.23432e-28" },
2069         { 1.234321234321234e-27L, "1.23432e-27" },
2070         { 1.234321234321234e-26L, "1.23432e-26" },
2071         { 1.234321234321234e-25L, "1.23432e-25" },
2072         { 1.234321234321234e-24L, "1.23432e-24" },
2073         { 1.234321234321234e-23L, "1.23432e-23" },
2074         { 1.234321234321234e-22L, "1.23432e-22" },
2075         { 1.234321234321234e-21L, "1.23432e-21" },
2076         { 1.234321234321234e-20L, "1.23432e-20" },
2077         { 1.234321234321234e-19L, "1.23432e-19" },
2078         { 1.234321234321234e-18L, "1.23432e-18" },
2079         { 1.234321234321234e-17L, "1.23432e-17" },
2080         { 1.234321234321234e-16L, "1.23432e-16" },
2081         { 1.234321234321234e-15L, "1.23432e-15" },
2082         { 1.234321234321234e-14L, "1.23432e-14" },
2083         { 1.234321234321234e-13L, "1.23432e-13" },
2084         { 1.234321234321234e-12L, "1.23432e-12" },
2085         { 1.234321234321234e-11L, "1.23432e-11" },
2086         { 1.234321234321234e-10L, "1.23432e-10" },
2087         { 1.234321234321234e-9L, "1.23432e-09" },
2088         { 1.234321234321234e-8L, "1.23432e-08" },
2089         { 1.234321234321234e-7L, "1.23432e-07" },
2090         { 1.234321234321234e-6L, "1.23432e-06" },
2091         { 1.234321234321234e-5L, "1.23432e-05" },
2092         { 1.234321234321234e-4L, "0.000123432" },
2093         { 1.234321234321234e-3L, "0.00123432" },
2094         { 1.234321234321234e-2L, "0.0123432" },
2095         { 1.234321234321234e-1L, "0.123432" },
2096         { 1.234321234321234L, "1.23432" },
2097         { 1.234321234321234e1L, "12.3432" },
2098         { 1.234321234321234e2L, "123.432" },
2099         { 1.234321234321234e3L, "1234.32" },
2100         { 1.234321234321234e4L, "12343.2" },
2101         { 1.234321234321234e5L, "123432" },
2102         { 1.234321234321234e6L, "1.23432e+06" },
2103         { 1.234321234321234e7L, "1.23432e+07" },
2104         { 1.234321234321234e8L, "1.23432e+08" },
2105         { 1.234321234321234e9L, "1.23432e+09" },
2106         { 1.234321234321234e10L, "1.23432e+10" },
2107         { 1.234321234321234e11L, "1.23432e+11" },
2108         { 1.234321234321234e12L, "1.23432e+12" },
2109         { 1.234321234321234e13L, "1.23432e+13" },
2110         { 1.234321234321234e14L, "1.23432e+14" },
2111         { 1.234321234321234e15L, "1.23432e+15" },
2112         { 1.234321234321234e16L, "1.23432e+16" },
2113         { 1.234321234321234e17L, "1.23432e+17" },
2114         { 1.234321234321234e18L, "1.23432e+18" },
2115         { 1.234321234321234e19L, "1.23432e+19" },
2116         { 1.234321234321234e20L, "1.23432e+20" },
2117         { 1.234321234321234e21L, "1.23432e+21" },
2118         { 1.234321234321234e22L, "1.23432e+22" },
2119         { 1.234321234321234e23L, "1.23432e+23" },
2120         { 1.234321234321234e24L, "1.23432e+24" },
2121         { 1.234321234321234e25L, "1.23432e+25" },
2122         { 1.234321234321234e26L, "1.23432e+26" },
2123         { 1.234321234321234e27L, "1.23432e+27" },
2124         { 1.234321234321234e28L, "1.23432e+28" },
2125         { 1.234321234321234e29L, "1.23432e+29" },
2126         { 1.234321234321234e30L, "1.23432e+30" },
2127         { 1.234321234321234e31L, "1.23432e+31" },
2128         { 1.234321234321234e32L, "1.23432e+32" },
2129         { 1.234321234321234e33L, "1.23432e+33" },
2130         { 1.234321234321234e34L, "1.23432e+34" },
2131         { 1.234321234321234e35L, "1.23432e+35" },
2132         { 1.234321234321234e36L, "1.23432e+36" }
2133       };
2134     size_t k;
2135     for (k = 0; k < SIZEOF (data); k++)
2136       {
2137         char result[100];
2138         int retval =
2139           my_snprintf (result, sizeof (result), "%Lg", data[k].value);
2140         ASSERT (strmatch (data[k].string, result));
2141         ASSERT (retval == strlen (result));
2142       }
2143   }
2144
2145   { /* A negative number.  */
2146     char result[100];
2147     int retval =
2148       my_snprintf (result, sizeof (result), "%Lg %d", -0.03125L, 33, 44, 55);
2149     ASSERT (strcmp (result, "-0.03125 33") == 0);
2150     ASSERT (retval == strlen (result));
2151   }
2152
2153   { /* Positive zero.  */
2154     char result[100];
2155     int retval =
2156       my_snprintf (result, sizeof (result), "%Lg %d", 0.0L, 33, 44, 55);
2157     ASSERT (strcmp (result, "0 33") == 0);
2158     ASSERT (retval == strlen (result));
2159   }
2160
2161   { /* Negative zero.  */
2162     char result[100];
2163     int retval =
2164       my_snprintf (result, sizeof (result), "%Lg %d", -0.0L, 33, 44, 55);
2165     ASSERT (strcmp (result, "-0 33") == 0);
2166     ASSERT (retval == strlen (result));
2167   }
2168
2169   { /* Positive infinity.  */
2170     char result[100];
2171     int retval =
2172       my_snprintf (result, sizeof (result), "%Lg %d", 1.0L / 0.0L, 33, 44, 55);
2173     ASSERT (strcmp (result, "inf 33") == 0
2174             || strcmp (result, "infinity 33") == 0);
2175     ASSERT (retval == strlen (result));
2176   }
2177
2178   { /* Negative infinity.  */
2179     char result[100];
2180     int retval =
2181       my_snprintf (result, sizeof (result), "%Lg %d", -1.0L / 0.0L, 33, 44, 55);
2182     ASSERT (strcmp (result, "-inf 33") == 0
2183             || strcmp (result, "-infinity 33") == 0);
2184     ASSERT (retval == strlen (result));
2185   }
2186
2187   { /* NaN.  */
2188     static long double zero = 0.0L;
2189     char result[100];
2190     int retval =
2191       my_snprintf (result, sizeof (result), "%Lg %d", zero / zero, 33, 44, 55);
2192     ASSERT (strcmp (result, "nan 33") == 0);
2193     ASSERT (retval == strlen (result));
2194   }
2195
2196   { /* Width.  */
2197     char result[100];
2198     int retval =
2199       my_snprintf (result, sizeof (result), "%10Lg %d", 1.75L, 33, 44, 55);
2200     ASSERT (strcmp (result, "      1.75 33") == 0);
2201     ASSERT (retval == strlen (result));
2202   }
2203
2204   { /* FLAG_LEFT.  */
2205     char result[100];
2206     int retval =
2207       my_snprintf (result, sizeof (result), "%-10Lg %d", 1.75L, 33, 44, 55);
2208     ASSERT (strcmp (result, "1.75       33") == 0);
2209     ASSERT (retval == strlen (result));
2210   }
2211
2212   { /* FLAG_SHOWSIGN.  */
2213     char result[100];
2214     int retval =
2215       my_snprintf (result, sizeof (result), "%+Lg %d", 1.75L, 33, 44, 55);
2216     ASSERT (strcmp (result, "+1.75 33") == 0);
2217     ASSERT (retval == strlen (result));
2218   }
2219
2220   { /* FLAG_SPACE.  */
2221     char result[100];
2222     int retval =
2223       my_snprintf (result, sizeof (result), "% Lg %d", 1.75L, 33, 44, 55);
2224     ASSERT (strcmp (result, " 1.75 33") == 0);
2225     ASSERT (retval == strlen (result));
2226   }
2227
2228   { /* FLAG_ALT.  */
2229     char result[100];
2230     int retval =
2231       my_snprintf (result, sizeof (result), "%#Lg %d", 1.75L, 33, 44, 55);
2232     ASSERT (strcmp (result, "1.75000 33") == 0);
2233     ASSERT (retval == strlen (result));
2234   }
2235
2236   { /* FLAG_ALT.  */
2237     char result[100];
2238     int retval =
2239       my_snprintf (result, sizeof (result), "%#.Lg %d", 1.75L, 33, 44, 55);
2240     ASSERT (strcmp (result, "2. 33") == 0);
2241     ASSERT (retval == strlen (result));
2242   }
2243
2244   { /* FLAG_ALT.  */
2245     char result[100];
2246     int retval =
2247       my_snprintf (result, sizeof (result), "%#.Lg %d", 9.75L, 33, 44, 55);
2248     ASSERT (strcmp (result, "1.e+01 33") == 0);
2249     ASSERT (retval == strlen (result));
2250   }
2251
2252   { /* FLAG_ZERO with finite number.  */
2253     char result[100];
2254     int retval =
2255       my_snprintf (result, sizeof (result), "%010Lg %d", 1234.0L, 33, 44, 55);
2256     ASSERT (strcmp (result, "0000001234 33") == 0);
2257     ASSERT (retval == strlen (result));
2258   }
2259
2260   { /* FLAG_ZERO with infinite number.  */
2261     char result[100];
2262     int retval =
2263       my_snprintf (result, sizeof (result), "%015Lg %d", -1.0L / 0.0L, 33, 44, 55);
2264     ASSERT (strcmp (result, "           -inf 33") == 0
2265             || strcmp (result, "      -infinity 33") == 0);
2266     ASSERT (retval == strlen (result));
2267   }
2268
2269   { /* FLAG_ZERO with NaN.  */
2270     static long double zero = 0.0L;
2271     char result[100];
2272     int retval =
2273       my_snprintf (result, sizeof (result), "%015Lg %d", zero / zero, 33, 44, 55);
2274     ASSERT (strcmp (result, "            nan 33") == 0);
2275     ASSERT (retval == strlen (result));
2276   }
2277
2278   { /* Precision.  */
2279     char result[100];
2280     int retval =
2281       my_snprintf (result, sizeof (result), "%.Lg %d", 1234.0L, 33, 44, 55);
2282     ASSERT (strcmp (result, "1e+03 33") == 0);
2283     ASSERT (retval == strlen (result));
2284   }
2285
2286   /* Test the support of the %n format directive.  */
2287
2288   {
2289     int count = -1;
2290     char result[100];
2291     int retval =
2292       my_snprintf (result, sizeof (result), "%d %n", 123, &count, 33, 44, 55);
2293     ASSERT (strcmp (result, "123 ") == 0);
2294     ASSERT (retval == strlen (result));
2295     ASSERT (count == 4);
2296   }
2297
2298   /* Test the support of the POSIX/XSI format strings with positions.  */
2299
2300   {
2301     char result[100];
2302     int retval =
2303       my_snprintf (result, sizeof (result), "%2$d %1$d", 33, 55);
2304     ASSERT (strcmp (result, "55 33") == 0);
2305     ASSERT (retval == strlen (result));
2306   }
2307
2308   /* Test the support of the grouping flag.  */
2309
2310   {
2311     char result[100];
2312     int retval =
2313       my_snprintf (result, sizeof (result), "%'d %d", 1234567, 99);
2314     ASSERT (result[strlen (result) - 1] == '9');
2315     ASSERT (retval == strlen (result));
2316   }
2317 }