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