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