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