tests: fix 'invalid path dir' error
[gnulib.git] / m4 / printf.m4
blob5b4a50bae15c395600df308129a204e974b7fcf8
1 # printf.m4 serial 55
2 dnl Copyright (C) 2003, 2007-2017 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
7 dnl Test whether the *printf family of functions supports the 'j', 'z', 't',
8 dnl 'L' size specifiers. (ISO C99, POSIX:2001)
9 dnl Result is gl_cv_func_printf_sizes_c99.
11 AC_DEFUN([gl_PRINTF_SIZES_C99],
13   AC_REQUIRE([AC_PROG_CC])
14   AC_REQUIRE([gl_AC_HEADER_STDINT_H])
15   AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
16   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
17   AC_CACHE_CHECK([whether printf supports size specifiers as in C99],
18     [gl_cv_func_printf_sizes_c99],
19     [
20       AC_RUN_IFELSE(
21         [AC_LANG_SOURCE([[
22 #include <stddef.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include <sys/types.h>
26 #if HAVE_STDINT_H_WITH_UINTMAX
27 # include <stdint.h>
28 #endif
29 #if HAVE_INTTYPES_H_WITH_UINTMAX
30 # include <inttypes.h>
31 #endif
32 static char buf[100];
33 int main ()
35   int result = 0;
36 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
37   buf[0] = '\0';
38   if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
39       || strcmp (buf, "12345671 33") != 0)
40     result |= 1;
41 #else
42   result |= 1;
43 #endif
44   buf[0] = '\0';
45   if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
46       || strcmp (buf, "12345672 33") != 0)
47     result |= 2;
48   buf[0] = '\0';
49   if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
50       || strcmp (buf, "12345673 33") != 0)
51     result |= 4;
52   buf[0] = '\0';
53   if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
54       || strcmp (buf, "1.5 33") != 0)
55     result |= 8;
56   return result;
57 }]])],
58         [gl_cv_func_printf_sizes_c99=yes],
59         [gl_cv_func_printf_sizes_c99=no],
60         [
61          case "$host_os" in
62 changequote(,)dnl
63                                  # Guess yes on glibc systems.
64            *-gnu*)               gl_cv_func_printf_sizes_c99="guessing yes";;
65                                  # Guess yes on FreeBSD >= 5.
66            freebsd[1-4].*)       gl_cv_func_printf_sizes_c99="guessing no";;
67            freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
68                                  # Guess yes on Mac OS X >= 10.3.
69            darwin[1-6].*)        gl_cv_func_printf_sizes_c99="guessing no";;
70            darwin*)              gl_cv_func_printf_sizes_c99="guessing yes";;
71                                  # Guess yes on OpenBSD >= 3.9.
72            openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
73                                  gl_cv_func_printf_sizes_c99="guessing no";;
74            openbsd*)             gl_cv_func_printf_sizes_c99="guessing yes";;
75                                  # Guess yes on Solaris >= 2.10.
76            solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
77            solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
78                                  # Guess yes on NetBSD >= 3.
79            netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
80                                  gl_cv_func_printf_sizes_c99="guessing no";;
81            netbsd*)              gl_cv_func_printf_sizes_c99="guessing yes";;
82 changequote([,])dnl
83                                  # Guess yes on MSVC, no on mingw.
84            mingw*)               AC_EGREP_CPP([Known], [
85 #ifdef _MSC_VER
86  Known
87 #endif
88                                    ],
89                                    [gl_cv_func_printf_sizes_c99="guessing yes"],
90                                    [gl_cv_func_printf_sizes_c99="guessing no"])
91                                  ;;
92                                  # If we don't know, assume the worst.
93            *)                    gl_cv_func_printf_sizes_c99="guessing no";;
94          esac
95         ])
96     ])
99 dnl Test whether the *printf family of functions supports 'long double'
100 dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
101 dnl Result is gl_cv_func_printf_long_double.
103 AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
105   AC_REQUIRE([AC_PROG_CC])
106   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
107   AC_CACHE_CHECK([whether printf supports 'long double' arguments],
108     [gl_cv_func_printf_long_double],
109     [
110       AC_RUN_IFELSE(
111         [AC_LANG_SOURCE([[
112 #include <stdio.h>
113 #include <string.h>
114 static char buf[10000];
115 int main ()
117   int result = 0;
118   buf[0] = '\0';
119   if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
120       || strcmp (buf, "1.750000 33") != 0)
121     result |= 1;
122   buf[0] = '\0';
123   if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
124       || strcmp (buf, "1.750000e+00 33") != 0)
125     result |= 2;
126   buf[0] = '\0';
127   if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
128       || strcmp (buf, "1.75 33") != 0)
129     result |= 4;
130   return result;
131 }]])],
132         [gl_cv_func_printf_long_double=yes],
133         [gl_cv_func_printf_long_double=no],
134         [case "$host_os" in
135            beos*)  gl_cv_func_printf_long_double="guessing no";;
136                    # Guess yes on MSVC, no on mingw.
137            mingw*) AC_EGREP_CPP([Known], [
138 #ifdef _MSC_VER
139  Known
140 #endif
141                      ],
142                      [gl_cv_func_printf_long_double="guessing yes"],
143                      [gl_cv_func_printf_long_double="guessing no"])
144                    ;;
145            *)      gl_cv_func_printf_long_double="guessing yes";;
146          esac
147         ])
148     ])
151 dnl Test whether the *printf family of functions supports infinite and NaN
152 dnl 'double' arguments and negative zero arguments in the %f, %e, %g
153 dnl directives. (ISO C99, POSIX:2001)
154 dnl Result is gl_cv_func_printf_infinite.
156 AC_DEFUN([gl_PRINTF_INFINITE],
158   AC_REQUIRE([AC_PROG_CC])
159   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
160   AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
161     [gl_cv_func_printf_infinite],
162     [
163       AC_RUN_IFELSE(
164         [AC_LANG_SOURCE([[
165 #include <stdio.h>
166 #include <string.h>
167 static int
168 strisnan (const char *string, size_t start_index, size_t end_index)
170   if (start_index < end_index)
171     {
172       if (string[start_index] == '-')
173         start_index++;
174       if (start_index + 3 <= end_index
175           && memcmp (string + start_index, "nan", 3) == 0)
176         {
177           start_index += 3;
178           if (start_index == end_index
179               || (string[start_index] == '(' && string[end_index - 1] == ')'))
180             return 1;
181         }
182     }
183   return 0;
185 static int
186 have_minus_zero ()
188   static double plus_zero = 0.0;
189   double minus_zero = - plus_zero;
190   return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
192 static char buf[10000];
193 static double zero = 0.0;
194 int main ()
196   int result = 0;
197   if (sprintf (buf, "%f", 1.0 / zero) < 0
198       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
199     result |= 1;
200   if (sprintf (buf, "%f", -1.0 / zero) < 0
201       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
202     result |= 1;
203   if (sprintf (buf, "%f", zero / zero) < 0
204       || !strisnan (buf, 0, strlen (buf)))
205     result |= 2;
206   if (sprintf (buf, "%e", 1.0 / zero) < 0
207       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
208     result |= 4;
209   if (sprintf (buf, "%e", -1.0 / zero) < 0
210       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
211     result |= 4;
212   if (sprintf (buf, "%e", zero / zero) < 0
213       || !strisnan (buf, 0, strlen (buf)))
214     result |= 8;
215   if (sprintf (buf, "%g", 1.0 / zero) < 0
216       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
217     result |= 16;
218   if (sprintf (buf, "%g", -1.0 / zero) < 0
219       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
220     result |= 16;
221   if (sprintf (buf, "%g", zero / zero) < 0
222       || !strisnan (buf, 0, strlen (buf)))
223     result |= 32;
224   /* This test fails on HP-UX 10.20.  */
225   if (have_minus_zero ())
226     if (sprintf (buf, "%g", - zero) < 0
227         || strcmp (buf, "-0") != 0)
228     result |= 64;
229   return result;
230 }]])],
231         [gl_cv_func_printf_infinite=yes],
232         [gl_cv_func_printf_infinite=no],
233         [
234          case "$host_os" in
235 changequote(,)dnl
236                                  # Guess yes on glibc systems.
237            *-gnu*)               gl_cv_func_printf_infinite="guessing yes";;
238                                  # Guess yes on FreeBSD >= 6.
239            freebsd[1-5].*)       gl_cv_func_printf_infinite="guessing no";;
240            freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
241                                  # Guess yes on Mac OS X >= 10.3.
242            darwin[1-6].*)        gl_cv_func_printf_infinite="guessing no";;
243            darwin*)              gl_cv_func_printf_infinite="guessing yes";;
244                                  # Guess yes on HP-UX >= 11.
245            hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
246            hpux*)                gl_cv_func_printf_infinite="guessing yes";;
247                                  # Guess yes on NetBSD >= 3.
248            netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
249                                  gl_cv_func_printf_infinite="guessing no";;
250            netbsd*)              gl_cv_func_printf_infinite="guessing yes";;
251                                  # Guess yes on BeOS.
252            beos*)                gl_cv_func_printf_infinite="guessing yes";;
253 changequote([,])dnl
254                                  # Guess yes on MSVC, no on mingw.
255            mingw*)               AC_EGREP_CPP([Known], [
256 #ifdef _MSC_VER
257  Known
258 #endif
259                                    ],
260                                    [gl_cv_func_printf_infinite="guessing yes"],
261                                    [gl_cv_func_printf_infinite="guessing no"])
262                                  ;;
263                                  # If we don't know, assume the worst.
264            *)                    gl_cv_func_printf_infinite="guessing no";;
265          esac
266         ])
267     ])
270 dnl Test whether the *printf family of functions supports infinite and NaN
271 dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
272 dnl Result is gl_cv_func_printf_infinite_long_double.
274 AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
276   AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
277   AC_REQUIRE([AC_PROG_CC])
278   AC_REQUIRE([gl_BIGENDIAN])
279   AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
280   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
281   dnl The user can set or unset the variable gl_printf_safe to indicate
282   dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
283   if test -n "$gl_printf_safe"; then
284     AC_DEFINE([CHECK_PRINTF_SAFE], [1],
285       [Define if you wish *printf() functions that have a safe handling of
286        non-IEEE-754 'long double' values.])
287   fi
288   case "$gl_cv_func_printf_long_double" in
289     *yes)
290       AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
291         [gl_cv_func_printf_infinite_long_double],
292         [
293           AC_RUN_IFELSE(
294             [AC_LANG_SOURCE([[
295 ]GL_NOCRASH[
296 #include <float.h>
297 #include <stdio.h>
298 #include <string.h>
299 static int
300 strisnan (const char *string, size_t start_index, size_t end_index)
302   if (start_index < end_index)
303     {
304       if (string[start_index] == '-')
305         start_index++;
306       if (start_index + 3 <= end_index
307           && memcmp (string + start_index, "nan", 3) == 0)
308         {
309           start_index += 3;
310           if (start_index == end_index
311               || (string[start_index] == '(' && string[end_index - 1] == ')'))
312             return 1;
313         }
314     }
315   return 0;
317 static char buf[10000];
318 static long double zeroL = 0.0L;
319 int main ()
321   int result = 0;
322   nocrash_init();
323   if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
324       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
325     result |= 1;
326   if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
327       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
328     result |= 1;
329   if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
330       || !strisnan (buf, 0, strlen (buf)))
331     result |= 1;
332   if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
333       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
334     result |= 1;
335   if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
336       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
337     result |= 1;
338   if (sprintf (buf, "%Le", zeroL / zeroL) < 0
339       || !strisnan (buf, 0, strlen (buf)))
340     result |= 1;
341   if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
342       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
343     result |= 1;
344   if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
345       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
346     result |= 1;
347   if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
348       || !strisnan (buf, 0, strlen (buf)))
349     result |= 1;
350 #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_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
351 /* Representation of an 80-bit 'long double' as an initializer for a sequence
352    of 'unsigned int' words.  */
353 # ifdef WORDS_BIGENDIAN
354 #  define LDBL80_WORDS(exponent,manthi,mantlo) \
355      { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
356        ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16),   \
357        (unsigned int) (mantlo) << 16                                        \
358      }
359 # else
360 #  define LDBL80_WORDS(exponent,manthi,mantlo) \
361      { mantlo, manthi, exponent }
362 # endif
363   { /* Quiet NaN.  */
364     static union { unsigned int word[4]; long double value; } x =
365       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
366     if (sprintf (buf, "%Lf", x.value) < 0
367         || !strisnan (buf, 0, strlen (buf)))
368       result |= 2;
369     if (sprintf (buf, "%Le", x.value) < 0
370         || !strisnan (buf, 0, strlen (buf)))
371       result |= 2;
372     if (sprintf (buf, "%Lg", x.value) < 0
373         || !strisnan (buf, 0, strlen (buf)))
374       result |= 2;
375   }
376   {
377     /* Signalling NaN.  */
378     static union { unsigned int word[4]; long double value; } x =
379       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
380     if (sprintf (buf, "%Lf", x.value) < 0
381         || !strisnan (buf, 0, strlen (buf)))
382       result |= 2;
383     if (sprintf (buf, "%Le", x.value) < 0
384         || !strisnan (buf, 0, strlen (buf)))
385       result |= 2;
386     if (sprintf (buf, "%Lg", x.value) < 0
387         || !strisnan (buf, 0, strlen (buf)))
388       result |= 2;
389   }
390   { /* Pseudo-NaN.  */
391     static union { unsigned int word[4]; long double value; } x =
392       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
393     if (sprintf (buf, "%Lf", x.value) <= 0)
394       result |= 4;
395     if (sprintf (buf, "%Le", x.value) <= 0)
396       result |= 4;
397     if (sprintf (buf, "%Lg", x.value) <= 0)
398       result |= 4;
399   }
400   { /* Pseudo-Infinity.  */
401     static union { unsigned int word[4]; long double value; } x =
402       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
403     if (sprintf (buf, "%Lf", x.value) <= 0)
404       result |= 8;
405     if (sprintf (buf, "%Le", x.value) <= 0)
406       result |= 8;
407     if (sprintf (buf, "%Lg", x.value) <= 0)
408       result |= 8;
409   }
410   { /* Pseudo-Zero.  */
411     static union { unsigned int word[4]; long double value; } x =
412       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
413     if (sprintf (buf, "%Lf", x.value) <= 0)
414       result |= 16;
415     if (sprintf (buf, "%Le", x.value) <= 0)
416       result |= 16;
417     if (sprintf (buf, "%Lg", x.value) <= 0)
418       result |= 16;
419   }
420   { /* Unnormalized number.  */
421     static union { unsigned int word[4]; long double value; } x =
422       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
423     if (sprintf (buf, "%Lf", x.value) <= 0)
424       result |= 32;
425     if (sprintf (buf, "%Le", x.value) <= 0)
426       result |= 32;
427     if (sprintf (buf, "%Lg", x.value) <= 0)
428       result |= 32;
429   }
430   { /* Pseudo-Denormal.  */
431     static union { unsigned int word[4]; long double value; } x =
432       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
433     if (sprintf (buf, "%Lf", x.value) <= 0)
434       result |= 64;
435     if (sprintf (buf, "%Le", x.value) <= 0)
436       result |= 64;
437     if (sprintf (buf, "%Lg", x.value) <= 0)
438       result |= 64;
439   }
440 #endif
441   return result;
442 }]])],
443             [gl_cv_func_printf_infinite_long_double=yes],
444             [gl_cv_func_printf_infinite_long_double=no],
445             [case "$host_cpu" in
446                                      # Guess no on ia64, x86_64, i386.
447                ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
448                *)
449                  case "$host_os" in
450 changequote(,)dnl
451                                          # Guess yes on glibc systems.
452                    *-gnu*)               gl_cv_func_printf_infinite_long_double="guessing yes";;
453                                          # Guess yes on FreeBSD >= 6.
454                    freebsd[1-5].*)       gl_cv_func_printf_infinite_long_double="guessing no";;
455                    freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
456                                          # Guess yes on HP-UX >= 11.
457                    hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
458                    hpux*)                gl_cv_func_printf_infinite_long_double="guessing yes";;
459 changequote([,])dnl
460                                          # Guess yes on MSVC, no on mingw.
461                    mingw*)               AC_EGREP_CPP([Known], [
462 #ifdef _MSC_VER
463  Known
464 #endif
465                                            ],
466                                            [gl_cv_func_printf_infinite_long_double="guessing yes"],
467                                            [gl_cv_func_printf_infinite_long_double="guessing no"])
468                                          ;;
469                                          # If we don't know, assume the worst.
470                    *)                    gl_cv_func_printf_infinite_long_double="guessing no";;
471                  esac
472                  ;;
473              esac
474             ])
475         ])
476       ;;
477     *)
478       gl_cv_func_printf_infinite_long_double="irrelevant"
479       ;;
480   esac
483 dnl Test whether the *printf family of functions supports the 'a' and 'A'
484 dnl conversion specifier for hexadecimal output of floating-point numbers.
485 dnl (ISO C99, POSIX:2001)
486 dnl Result is gl_cv_func_printf_directive_a.
488 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
490   AC_REQUIRE([AC_PROG_CC])
491   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
492   AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
493     [gl_cv_func_printf_directive_a],
494     [
495       AC_RUN_IFELSE(
496         [AC_LANG_SOURCE([[
497 #include <stdio.h>
498 #include <string.h>
499 static char buf[100];
500 static double zero = 0.0;
501 int main ()
503   int result = 0;
504   if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
505       || (strcmp (buf, "0x1.922p+1 33") != 0
506           && strcmp (buf, "0x3.244p+0 33") != 0
507           && strcmp (buf, "0x6.488p-1 33") != 0
508           && strcmp (buf, "0xc.91p-2 33") != 0))
509     result |= 1;
510   if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
511       || (strcmp (buf, "-0X1.922P+1 33") != 0
512           && strcmp (buf, "-0X3.244P+0 33") != 0
513           && strcmp (buf, "-0X6.488P-1 33") != 0
514           && strcmp (buf, "-0XC.91P-2 33") != 0))
515     result |= 2;
516   /* This catches a FreeBSD 6.1 bug: it doesn't round.  */
517   if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
518       || (strcmp (buf, "0x1.83p+0 33") != 0
519           && strcmp (buf, "0x3.05p-1 33") != 0
520           && strcmp (buf, "0x6.0ap-2 33") != 0
521           && strcmp (buf, "0xc.14p-3 33") != 0))
522     result |= 4;
523   /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round.  */
524   if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0
525       || (strcmp (buf, "0x2p+0 33") != 0
526           && strcmp (buf, "0x3p-1 33") != 0
527           && strcmp (buf, "0x6p-2 33") != 0
528           && strcmp (buf, "0xcp-3 33") != 0))
529     result |= 4;
530   /* This catches a FreeBSD 6.1 bug.  See
531      <https://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
532   if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0
533       || buf[0] == '0')
534     result |= 8;
535   /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug.  */
536   if (sprintf (buf, "%.1a", 1.999) < 0
537       || (strcmp (buf, "0x1.0p+1") != 0
538           && strcmp (buf, "0x2.0p+0") != 0
539           && strcmp (buf, "0x4.0p-1") != 0
540           && strcmp (buf, "0x8.0p-2") != 0))
541     result |= 16;
542   /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a
543      glibc 2.4 bug <https://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
544   if (sprintf (buf, "%.1La", 1.999L) < 0
545       || (strcmp (buf, "0x1.0p+1") != 0
546           && strcmp (buf, "0x2.0p+0") != 0
547           && strcmp (buf, "0x4.0p-1") != 0
548           && strcmp (buf, "0x8.0p-2") != 0))
549     result |= 32;
550   return result;
551 }]])],
552         [gl_cv_func_printf_directive_a=yes],
553         [gl_cv_func_printf_directive_a=no],
554         [
555          case "$host_os" in
556                                  # Guess yes on glibc >= 2.5 systems.
557            *-gnu*)
558              AC_EGREP_CPP([BZ2908], [
559                #include <features.h>
560                #ifdef __GNU_LIBRARY__
561                 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
562                  BZ2908
563                 #endif
564                #endif
565                ],
566                [gl_cv_func_printf_directive_a="guessing yes"],
567                [gl_cv_func_printf_directive_a="guessing no"])
568              ;;
569                                  # Guess no on native Windows.
570            mingw*)               gl_cv_func_printf_directive_a="guessing no";;
571                                  # If we don't know, assume the worst.
572            *)                    gl_cv_func_printf_directive_a="guessing no";;
573          esac
574         ])
575     ])
578 dnl Test whether the *printf family of functions supports the %F format
579 dnl directive. (ISO C99, POSIX:2001)
580 dnl Result is gl_cv_func_printf_directive_f.
582 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
584   AC_REQUIRE([AC_PROG_CC])
585   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
586   AC_CACHE_CHECK([whether printf supports the 'F' directive],
587     [gl_cv_func_printf_directive_f],
588     [
589       AC_RUN_IFELSE(
590         [AC_LANG_SOURCE([[
591 #include <stdio.h>
592 #include <string.h>
593 static char buf[100];
594 static double zero = 0.0;
595 int main ()
597   int result = 0;
598   if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
599       || strcmp (buf, "1234567.000000 33") != 0)
600     result |= 1;
601   if (sprintf (buf, "%F", 1.0 / zero) < 0
602       || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
603     result |= 2;
604   /* This catches a Cygwin 1.5.x bug.  */
605   if (sprintf (buf, "%.F", 1234.0) < 0
606       || strcmp (buf, "1234") != 0)
607     result |= 4;
608   return result;
609 }]])],
610         [gl_cv_func_printf_directive_f=yes],
611         [gl_cv_func_printf_directive_f=no],
612         [
613          case "$host_os" in
614 changequote(,)dnl
615                                  # Guess yes on glibc systems.
616            *-gnu*)               gl_cv_func_printf_directive_f="guessing yes";;
617                                  # Guess yes on FreeBSD >= 6.
618            freebsd[1-5].*)       gl_cv_func_printf_directive_f="guessing no";;
619            freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
620                                  # Guess yes on Mac OS X >= 10.3.
621            darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
622            darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
623                                  # Guess yes on Solaris >= 2.10.
624            solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";;
625            solaris*)             gl_cv_func_printf_directive_f="guessing no";;
626 changequote([,])dnl
627                                  # Guess yes on MSVC, no on mingw.
628            mingw*)               AC_EGREP_CPP([Known], [
629 #ifdef _MSC_VER
630  Known
631 #endif
632                                    ],
633                                    [gl_cv_func_printf_directive_f="guessing yes"],
634                                    [gl_cv_func_printf_directive_f="guessing no"])
635                                  ;;
636                                  # If we don't know, assume the worst.
637            *)                    gl_cv_func_printf_directive_f="guessing no";;
638          esac
639         ])
640     ])
643 dnl Test whether the *printf family of functions supports the %n format
644 dnl directive. (ISO C99, POSIX:2001)
645 dnl Result is gl_cv_func_printf_directive_n.
647 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
649   AC_REQUIRE([AC_PROG_CC])
650   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
651   AC_CACHE_CHECK([whether printf supports the 'n' directive],
652     [gl_cv_func_printf_directive_n],
653     [
654       AC_RUN_IFELSE(
655         [AC_LANG_SOURCE([[
656 #include <stdio.h>
657 #include <stdlib.h>
658 #include <string.h>
659 #ifdef _MSC_VER
660 /* See page about "Parameter Validation" on msdn.microsoft.com.  */
661 static void cdecl
662 invalid_parameter_handler (const wchar_t *expression,
663                            const wchar_t *function,
664                            const wchar_t *file, unsigned int line,
665                            uintptr_t dummy)
667   exit (1);
669 #endif
670 static char fmtstring[10];
671 static char buf[100];
672 int main ()
674   int count = -1;
675 #ifdef _MSC_VER
676   _set_invalid_parameter_handler (invalid_parameter_handler);
677 #endif
678   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
679      support %n in format strings in read-only memory but not in writable
680      memory.  */
681   strcpy (fmtstring, "%d %n");
682   if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
683       || strcmp (buf, "123 ") != 0
684       || count != 4)
685     return 1;
686   return 0;
687 }]])],
688         [gl_cv_func_printf_directive_n=yes],
689         [gl_cv_func_printf_directive_n=no],
690         [case "$host_os" in
691                    # Guess no on native Windows.
692            mingw*) gl_cv_func_printf_directive_n="guessing no";;
693            *)      gl_cv_func_printf_directive_n="guessing yes";;
694          esac
695         ])
696     ])
699 dnl Test whether the *printf family of functions supports the %ls format
700 dnl directive and in particular, when a precision is specified, whether
701 dnl the functions stop converting the wide string argument when the number
702 dnl of bytes that have been produced by this conversion equals or exceeds
703 dnl the precision.
704 dnl Result is gl_cv_func_printf_directive_ls.
706 AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
708   AC_REQUIRE([AC_PROG_CC])
709   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
710   AC_CACHE_CHECK([whether printf supports the 'ls' directive],
711     [gl_cv_func_printf_directive_ls],
712     [
713       AC_RUN_IFELSE(
714         [AC_LANG_SOURCE([[
715 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
716    <wchar.h>.
717    BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
718    included before <wchar.h>.  */
719 #include <stddef.h>
720 #include <stdio.h>
721 #include <time.h>
722 #include <wchar.h>
723 #include <string.h>
724 int main ()
726   int result = 0;
727   char buf[100];
728   /* Test whether %ls works at all.
729      This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
730      Cygwin 1.5.  */
731   {
732     static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
733     buf[0] = '\0';
734     if (sprintf (buf, "%ls", wstring) < 0
735         || strcmp (buf, "abc") != 0)
736       result |= 1;
737   }
738   /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
739      assertion failure inside libc), but not on OpenBSD 4.0.  */
740   {
741     static const wchar_t wstring[] = { 'a', 0 };
742     buf[0] = '\0';
743     if (sprintf (buf, "%ls", wstring) < 0
744         || strcmp (buf, "a") != 0)
745       result |= 2;
746   }
747   /* Test whether precisions in %ls are supported as specified in ISO C 99
748      section 7.19.6.1:
749        "If a precision is specified, no more than that many bytes are written
750         (including shift sequences, if any), and the array shall contain a
751         null wide character if, to equal the multibyte character sequence
752         length given by the precision, the function would need to access a
753         wide character one past the end of the array."
754      This test fails on Solaris 10.  */
755   {
756     static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
757     buf[0] = '\0';
758     if (sprintf (buf, "%.2ls", wstring) < 0
759         || strcmp (buf, "ab") != 0)
760       result |= 8;
761   }
762   return result;
763 }]])],
764         [gl_cv_func_printf_directive_ls=yes],
765         [gl_cv_func_printf_directive_ls=no],
766         [
767 changequote(,)dnl
768          case "$host_os" in
769            openbsd*)       gl_cv_func_printf_directive_ls="guessing no";;
770            irix*)          gl_cv_func_printf_directive_ls="guessing no";;
771            solaris*)       gl_cv_func_printf_directive_ls="guessing no";;
772            cygwin*)        gl_cv_func_printf_directive_ls="guessing no";;
773            beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";;
774                            # Guess yes on native Windows.
775            mingw*)         gl_cv_func_printf_directive_ls="guessing yes";;
776            *)              gl_cv_func_printf_directive_ls="guessing yes";;
777          esac
778 changequote([,])dnl
779         ])
780     ])
783 dnl Test whether the *printf family of functions supports POSIX/XSI format
784 dnl strings with positions. (POSIX:2001)
785 dnl Result is gl_cv_func_printf_positions.
787 AC_DEFUN([gl_PRINTF_POSITIONS],
789   AC_REQUIRE([AC_PROG_CC])
790   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
791   AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
792     [gl_cv_func_printf_positions],
793     [
794       AC_RUN_IFELSE(
795         [AC_LANG_SOURCE([[
796 #include <stdio.h>
797 #include <string.h>
798 /* The string "%2$d %1$d", with dollar characters protected from the shell's
799    dollar expansion (possibly an autoconf bug).  */
800 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
801 static char buf[100];
802 int main ()
804   sprintf (buf, format, 33, 55);
805   return (strcmp (buf, "55 33") != 0);
806 }]])],
807         [gl_cv_func_printf_positions=yes],
808         [gl_cv_func_printf_positions=no],
809         [
810 changequote(,)dnl
811          case "$host_os" in
812            netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
813                          gl_cv_func_printf_positions="guessing no";;
814            beos*)        gl_cv_func_printf_positions="guessing no";;
815                          # Guess no on native Windows.
816            mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
817            *)            gl_cv_func_printf_positions="guessing yes";;
818          esac
819 changequote([,])dnl
820         ])
821     ])
824 dnl Test whether the *printf family of functions supports POSIX/XSI format
825 dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
826 dnl Result is gl_cv_func_printf_flag_grouping.
828 AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
830   AC_REQUIRE([AC_PROG_CC])
831   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
832   AC_CACHE_CHECK([whether printf supports the grouping flag],
833     [gl_cv_func_printf_flag_grouping],
834     [
835       AC_RUN_IFELSE(
836         [AC_LANG_SOURCE([[
837 #include <stdio.h>
838 #include <string.h>
839 static char buf[100];
840 int main ()
842   if (sprintf (buf, "%'d %d", 1234567, 99) < 0
843       || buf[strlen (buf) - 1] != '9')
844     return 1;
845   return 0;
846 }]])],
847         [gl_cv_func_printf_flag_grouping=yes],
848         [gl_cv_func_printf_flag_grouping=no],
849         [
850 changequote(,)dnl
851          case "$host_os" in
852            cygwin*)      gl_cv_func_printf_flag_grouping="guessing no";;
853            netbsd*)      gl_cv_func_printf_flag_grouping="guessing no";;
854                          # Guess no on native Windows.
855            mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
856            *)            gl_cv_func_printf_flag_grouping="guessing yes";;
857          esac
858 changequote([,])dnl
859         ])
860     ])
863 dnl Test whether the *printf family of functions supports the - flag correctly.
864 dnl (ISO C99.) See
865 dnl <https://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html>
866 dnl Result is gl_cv_func_printf_flag_leftadjust.
868 AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
870   AC_REQUIRE([AC_PROG_CC])
871   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
872   AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
873     [gl_cv_func_printf_flag_leftadjust],
874     [
875       AC_RUN_IFELSE(
876         [AC_LANG_SOURCE([[
877 #include <stdio.h>
878 #include <string.h>
879 static char buf[100];
880 int main ()
882   /* Check that a '-' flag is not annihilated by a negative width.  */
883   if (sprintf (buf, "a%-*sc", -3, "b") < 0
884       || strcmp (buf, "ab  c") != 0)
885     return 1;
886   return 0;
887 }]])],
888         [gl_cv_func_printf_flag_leftadjust=yes],
889         [gl_cv_func_printf_flag_leftadjust=no],
890         [
891 changequote(,)dnl
892          case "$host_os" in
893                     # Guess yes on HP-UX 11.
894            hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
895                     # Guess no on HP-UX 10 and older.
896            hpux*)   gl_cv_func_printf_flag_leftadjust="guessing no";;
897                     # Guess yes on native Windows.
898            mingw*)  gl_cv_func_printf_flag_leftadjust="guessing yes";;
899                     # Guess yes otherwise.
900            *)       gl_cv_func_printf_flag_leftadjust="guessing yes";;
901          esac
902 changequote([,])dnl
903         ])
904     ])
907 dnl Test whether the *printf family of functions supports padding of non-finite
908 dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
909 dnl <https://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
910 dnl Result is gl_cv_func_printf_flag_zero.
912 AC_DEFUN([gl_PRINTF_FLAG_ZERO],
914   AC_REQUIRE([AC_PROG_CC])
915   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
916   AC_CACHE_CHECK([whether printf supports the zero flag correctly],
917     [gl_cv_func_printf_flag_zero],
918     [
919       AC_RUN_IFELSE(
920         [AC_LANG_SOURCE([[
921 #include <stdio.h>
922 #include <string.h>
923 static char buf[100];
924 static double zero = 0.0;
925 int main ()
927   if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
928       || (strcmp (buf, "       inf") != 0
929           && strcmp (buf, "  infinity") != 0))
930     return 1;
931   return 0;
932 }]])],
933         [gl_cv_func_printf_flag_zero=yes],
934         [gl_cv_func_printf_flag_zero=no],
935         [
936 changequote(,)dnl
937          case "$host_os" in
938                    # Guess yes on glibc systems.
939            *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
940                    # Guess yes on BeOS.
941            beos*)  gl_cv_func_printf_flag_zero="guessing yes";;
942                    # Guess no on native Windows.
943            mingw*) gl_cv_func_printf_flag_zero="guessing no";;
944                    # If we don't know, assume the worst.
945            *)      gl_cv_func_printf_flag_zero="guessing no";;
946          esac
947 changequote([,])dnl
948         ])
949     ])
952 dnl Test whether the *printf family of functions supports large precisions.
953 dnl On mingw, precisions larger than 512 are treated like 512, in integer,
954 dnl floating-point or pointer output. On Solaris 10/x86, precisions larger
955 dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC,
956 dnl precisions larger than 510 in floating-point output yield wrong results.
957 dnl On AIX 7.1, precisions larger than 998 in floating-point output yield
958 dnl wrong results. On BeOS, precisions larger than 1044 crash the program.
959 dnl Result is gl_cv_func_printf_precision.
961 AC_DEFUN([gl_PRINTF_PRECISION],
963   AC_REQUIRE([AC_PROG_CC])
964   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
965   AC_CACHE_CHECK([whether printf supports large precisions],
966     [gl_cv_func_printf_precision],
967     [
968       AC_RUN_IFELSE(
969         [AC_LANG_SOURCE([[
970 #include <stdio.h>
971 #include <string.h>
972 static char buf[5000];
973 int main ()
975   int result = 0;
976 #ifdef __BEOS__
977   /* On BeOS, this would crash and show a dialog box.  Avoid the crash.  */
978   return 1;
979 #endif
980   if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
981     result |= 1;
982   if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
983     result |= 2;
984   if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
985       || buf[0] != '1')
986     result |= 4;
987   if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
988       || buf[0] != '1')
989     result |= 4;
990   return result;
991 }]])],
992         [gl_cv_func_printf_precision=yes],
993         [gl_cv_func_printf_precision=no],
994         [
995 changequote(,)dnl
996          case "$host_os" in
997            # Guess no only on Solaris, native Windows, and BeOS systems.
998            solaris*)     gl_cv_func_printf_precision="guessing no" ;;
999            mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
1000            beos*)        gl_cv_func_printf_precision="guessing no" ;;
1001            *)            gl_cv_func_printf_precision="guessing yes" ;;
1002          esac
1003 changequote([,])dnl
1004         ])
1005     ])
1008 dnl Test whether the *printf family of functions recovers gracefully in case
1009 dnl of an out-of-memory condition, or whether it crashes the entire program.
1010 dnl Result is gl_cv_func_printf_enomem.
1012 AC_DEFUN([gl_PRINTF_ENOMEM],
1014   AC_REQUIRE([AC_PROG_CC])
1015   AC_REQUIRE([gl_MULTIARCH])
1016   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1017   AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
1018     [gl_cv_func_printf_enomem],
1019     [
1020       gl_cv_func_printf_enomem="guessing no"
1021       if test "$cross_compiling" = no; then
1022         if test $APPLE_UNIVERSAL_BUILD = 0; then
1023           AC_LANG_CONFTEST([AC_LANG_SOURCE([
1024 ]GL_NOCRASH[
1025 changequote(,)dnl
1026 #include <stdio.h>
1027 #include <sys/types.h>
1028 #include <sys/time.h>
1029 #include <sys/resource.h>
1030 #include <errno.h>
1031 int main()
1033   struct rlimit limit;
1034   int ret;
1035   nocrash_init ();
1036   /* Some printf implementations allocate temporary space with malloc.  */
1037   /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
1038 #ifdef RLIMIT_DATA
1039   if (getrlimit (RLIMIT_DATA, &limit) < 0)
1040     return 77;
1041   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
1042     limit.rlim_max = 5000000;
1043   limit.rlim_cur = limit.rlim_max;
1044   if (setrlimit (RLIMIT_DATA, &limit) < 0)
1045     return 77;
1046 #endif
1047   /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
1048 #ifdef RLIMIT_AS
1049   if (getrlimit (RLIMIT_AS, &limit) < 0)
1050     return 77;
1051   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
1052     limit.rlim_max = 5000000;
1053   limit.rlim_cur = limit.rlim_max;
1054   if (setrlimit (RLIMIT_AS, &limit) < 0)
1055     return 77;
1056 #endif
1057   /* Some printf implementations allocate temporary space on the stack.  */
1058 #ifdef RLIMIT_STACK
1059   if (getrlimit (RLIMIT_STACK, &limit) < 0)
1060     return 77;
1061   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
1062     limit.rlim_max = 5000000;
1063   limit.rlim_cur = limit.rlim_max;
1064   if (setrlimit (RLIMIT_STACK, &limit) < 0)
1065     return 77;
1066 #endif
1067   ret = printf ("%.5000000f", 1.0);
1068   return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
1070 changequote([,])dnl
1071           ])])
1072           if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
1073             (./conftest 2>&AS_MESSAGE_LOG_FD
1074              result=$?
1075              _AS_ECHO_LOG([\$? = $result])
1076              if test $result != 0 && test $result != 77; then result=1; fi
1077              exit $result
1078             ) >/dev/null 2>/dev/null
1079             case $? in
1080               0) gl_cv_func_printf_enomem="yes" ;;
1081               77) gl_cv_func_printf_enomem="guessing no" ;;
1082               *) gl_cv_func_printf_enomem="no" ;;
1083             esac
1084           else
1085             gl_cv_func_printf_enomem="guessing no"
1086           fi
1087           rm -fr conftest*
1088         else
1089           dnl A universal build on Apple Mac OS X platforms.
1090           dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
1091           dnl But we need a configuration result that is valid in both modes.
1092           gl_cv_func_printf_enomem="guessing no"
1093         fi
1094       fi
1095       if test "$gl_cv_func_printf_enomem" = "guessing no"; then
1096 changequote(,)dnl
1097         case "$host_os" in
1098                     # Guess yes on glibc systems.
1099           *-gnu*)   gl_cv_func_printf_enomem="guessing yes";;
1100                     # Guess yes on Solaris.
1101           solaris*) gl_cv_func_printf_enomem="guessing yes";;
1102                     # Guess yes on AIX.
1103           aix*)     gl_cv_func_printf_enomem="guessing yes";;
1104                     # Guess yes on HP-UX/hppa.
1105           hpux*)    case "$host_cpu" in
1106                       hppa*) gl_cv_func_printf_enomem="guessing yes";;
1107                       *)     gl_cv_func_printf_enomem="guessing no";;
1108                     esac
1109                     ;;
1110                     # Guess yes on IRIX.
1111           irix*)    gl_cv_func_printf_enomem="guessing yes";;
1112                     # Guess yes on OSF/1.
1113           osf*)     gl_cv_func_printf_enomem="guessing yes";;
1114                     # Guess yes on BeOS.
1115           beos*)    gl_cv_func_printf_enomem="guessing yes";;
1116                     # Guess yes on Haiku.
1117           haiku*)   gl_cv_func_printf_enomem="guessing yes";;
1118                     # If we don't know, assume the worst.
1119           *)        gl_cv_func_printf_enomem="guessing no";;
1120         esac
1121 changequote([,])dnl
1122       fi
1123     ])
1126 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
1127 dnl Result is ac_cv_func_snprintf.
1129 AC_DEFUN([gl_SNPRINTF_PRESENCE],
1131   AC_CHECK_FUNCS_ONCE([snprintf])
1134 dnl Test whether the string produced by the snprintf function is always NUL
1135 dnl terminated. (ISO C99, POSIX:2001)
1136 dnl Result is gl_cv_func_snprintf_truncation_c99.
1138 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
1140   AC_REQUIRE([AC_PROG_CC])
1141   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1142   AC_REQUIRE([gl_SNPRINTF_PRESENCE])
1143   AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
1144     [gl_cv_func_snprintf_truncation_c99],
1145     [
1146       AC_RUN_IFELSE(
1147         [AC_LANG_SOURCE([[
1148 #include <stdio.h>
1149 #include <string.h>
1150 #if HAVE_SNPRINTF
1151 # define my_snprintf snprintf
1152 #else
1153 # include <stdarg.h>
1154 static int my_snprintf (char *buf, int size, const char *format, ...)
1156   va_list args;
1157   int ret;
1158   va_start (args, format);
1159   ret = vsnprintf (buf, size, format, args);
1160   va_end (args);
1161   return ret;
1163 #endif
1164 static char buf[100];
1165 int main ()
1167   strcpy (buf, "ABCDEF");
1168   my_snprintf (buf, 3, "%d %d", 4567, 89);
1169   if (memcmp (buf, "45\0DEF", 6) != 0)
1170     return 1;
1171   return 0;
1172 }]])],
1173         [gl_cv_func_snprintf_truncation_c99=yes],
1174         [gl_cv_func_snprintf_truncation_c99=no],
1175         [
1176 changequote(,)dnl
1177          case "$host_os" in
1178                                  # Guess yes on glibc systems.
1179            *-gnu*)               gl_cv_func_snprintf_truncation_c99="guessing yes";;
1180                                  # Guess yes on FreeBSD >= 5.
1181            freebsd[1-4].*)       gl_cv_func_snprintf_truncation_c99="guessing no";;
1182            freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1183                                  # Guess yes on Mac OS X >= 10.3.
1184            darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
1185            darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
1186                                  # Guess yes on OpenBSD >= 3.9.
1187            openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1188                                  gl_cv_func_snprintf_truncation_c99="guessing no";;
1189            openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
1190                                  # Guess yes on Solaris >= 2.6.
1191            solaris2.[0-5] | solaris2.[0-5].*)
1192                                  gl_cv_func_snprintf_truncation_c99="guessing no";;
1193            solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
1194                                  # Guess yes on AIX >= 4.
1195            aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
1196            aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
1197                                  # Guess yes on HP-UX >= 11.
1198            hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1199            hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
1200                                  # Guess yes on IRIX >= 6.5.
1201            irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
1202                                  # Guess yes on OSF/1 >= 5.
1203            osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
1204            osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
1205                                  # Guess yes on NetBSD >= 3.
1206            netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1207                                  gl_cv_func_snprintf_truncation_c99="guessing no";;
1208            netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
1209                                  # Guess yes on BeOS.
1210            beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
1211                                  # Guess no on native Windows.
1212            mingw*)               gl_cv_func_snprintf_truncation_c99="guessing no";;
1213                                  # If we don't know, assume the worst.
1214            *)                    gl_cv_func_snprintf_truncation_c99="guessing no";;
1215          esac
1216 changequote([,])dnl
1217         ])
1218     ])
1221 dnl Test whether the return value of the snprintf function is the number
1222 dnl of bytes (excluding the terminating NUL) that would have been produced
1223 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
1224 dnl For example, this test program fails on IRIX 6.5:
1225 dnl     ---------------------------------------------------------------------
1226 dnl     #include <stdio.h>
1227 dnl     int main()
1228 dnl     {
1229 dnl       static char buf[8];
1230 dnl       int retval = snprintf (buf, 3, "%d", 12345);
1231 dnl       return retval >= 0 && retval < 3;
1232 dnl     }
1233 dnl     ---------------------------------------------------------------------
1234 dnl Result is gl_cv_func_snprintf_retval_c99.
1236 AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99],
1238   AC_REQUIRE([AC_PROG_CC])
1239   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1240   AC_REQUIRE([gl_SNPRINTF_PRESENCE])
1241   AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
1242     [gl_cv_func_snprintf_retval_c99],
1243     [
1244       AC_RUN_IFELSE(
1245         [AC_LANG_SOURCE([[
1246 #include <stdio.h>
1247 #include <string.h>
1248 #if HAVE_SNPRINTF
1249 # define my_snprintf snprintf
1250 #else
1251 # include <stdarg.h>
1252 static int my_snprintf (char *buf, int size, const char *format, ...)
1254   va_list args;
1255   int ret;
1256   va_start (args, format);
1257   ret = vsnprintf (buf, size, format, args);
1258   va_end (args);
1259   return ret;
1261 #endif
1262 static char buf[100];
1263 int main ()
1265   strcpy (buf, "ABCDEF");
1266   if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
1267     return 1;
1268   if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
1269     return 2;
1270   if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
1271     return 3;
1272   return 0;
1273 }]])],
1274         [gl_cv_func_snprintf_retval_c99=yes],
1275         [gl_cv_func_snprintf_retval_c99=no],
1276         [case "$host_os" in
1277 changequote(,)dnl
1278                                  # Guess yes on glibc systems.
1279            *-gnu*)               gl_cv_func_snprintf_retval_c99="guessing yes";;
1280                                  # Guess yes on FreeBSD >= 5.
1281            freebsd[1-4].*)       gl_cv_func_snprintf_retval_c99="guessing no";;
1282            freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1283                                  # Guess yes on Mac OS X >= 10.3.
1284            darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
1285            darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
1286                                  # Guess yes on OpenBSD >= 3.9.
1287            openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1288                                  gl_cv_func_snprintf_retval_c99="guessing no";;
1289            openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
1290                                  # Guess yes on Solaris >= 2.10.
1291            solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
1292            solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
1293                                  # Guess yes on AIX >= 4.
1294            aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
1295            aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
1296                                  # Guess yes on NetBSD >= 3.
1297            netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1298                                  gl_cv_func_snprintf_retval_c99="guessing no";;
1299            netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
1300                                  # Guess yes on BeOS.
1301            beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
1302 changequote([,])dnl
1303                                  # Guess yes on MSVC, no on mingw.
1304            mingw*)               AC_EGREP_CPP([Known], [
1305 #ifdef _MSC_VER
1306  Known
1307 #endif
1308                                    ],
1309                                    [gl_cv_func_snprintf_retval_c99="guessing yes"],
1310                                    [gl_cv_func_snprintf_retval_c99="guessing no"])
1311                                  ;;
1312                                  # If we don't know, assume the worst.
1313            *)                    gl_cv_func_snprintf_retval_c99="guessing no";;
1314          esac
1315         ])
1316     ])
1319 dnl Test whether the snprintf function supports the %n format directive
1320 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1321 dnl Result is gl_cv_func_snprintf_directive_n.
1323 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1325   AC_REQUIRE([AC_PROG_CC])
1326   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1327   AC_REQUIRE([gl_SNPRINTF_PRESENCE])
1328   AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1329     [gl_cv_func_snprintf_directive_n],
1330     [
1331       AC_RUN_IFELSE(
1332         [AC_LANG_SOURCE([[
1333 #include <stdio.h>
1334 #include <string.h>
1335 #if HAVE_SNPRINTF
1336 # define my_snprintf snprintf
1337 #else
1338 # include <stdarg.h>
1339 static int my_snprintf (char *buf, int size, const char *format, ...)
1341   va_list args;
1342   int ret;
1343   va_start (args, format);
1344   ret = vsnprintf (buf, size, format, args);
1345   va_end (args);
1346   return ret;
1348 #endif
1349 static char fmtstring[10];
1350 static char buf[100];
1351 int main ()
1353   int count = -1;
1354   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
1355      support %n in format strings in read-only memory but not in writable
1356      memory.  */
1357   strcpy (fmtstring, "%d %n");
1358   my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1359   if (count != 6)
1360     return 1;
1361   return 0;
1362 }]])],
1363         [gl_cv_func_snprintf_directive_n=yes],
1364         [gl_cv_func_snprintf_directive_n=no],
1365         [
1366 changequote(,)dnl
1367          case "$host_os" in
1368                                  # Guess yes on glibc systems.
1369            *-gnu*)               gl_cv_func_snprintf_directive_n="guessing yes";;
1370                                  # Guess yes on FreeBSD >= 5.
1371            freebsd[1-4].*)       gl_cv_func_snprintf_directive_n="guessing no";;
1372            freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1373                                  # Guess yes on Mac OS X >= 10.3.
1374            darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
1375            darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1376                                  # Guess yes on Solaris >= 2.6.
1377            solaris2.[0-5] | solaris2.[0-5].*)
1378                                  gl_cv_func_snprintf_directive_n="guessing no";;
1379            solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
1380                                  # Guess yes on AIX >= 4.
1381            aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1382            aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1383                                  # Guess yes on IRIX >= 6.5.
1384            irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
1385                                  # Guess yes on OSF/1 >= 5.
1386            osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1387            osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1388                                  # Guess yes on NetBSD >= 3.
1389            netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1390                                  gl_cv_func_snprintf_directive_n="guessing no";;
1391            netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1392                                  # Guess yes on BeOS.
1393            beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
1394                                  # Guess no on native Windows.
1395            mingw*)               gl_cv_func_snprintf_directive_n="guessing no";;
1396                                  # If we don't know, assume the worst.
1397            *)                    gl_cv_func_snprintf_directive_n="guessing no";;
1398          esac
1399 changequote([,])dnl
1400         ])
1401     ])
1404 dnl Test whether the snprintf function, when passed a size = 1, writes any
1405 dnl output without bounds in this case, behaving like sprintf. This is the
1406 dnl case on Linux libc5.
1407 dnl Result is gl_cv_func_snprintf_size1.
1409 AC_DEFUN([gl_SNPRINTF_SIZE1],
1411   AC_REQUIRE([AC_PROG_CC])
1412   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1413   AC_REQUIRE([gl_SNPRINTF_PRESENCE])
1414   AC_CACHE_CHECK([whether snprintf respects a size of 1],
1415     [gl_cv_func_snprintf_size1],
1416     [
1417       AC_RUN_IFELSE(
1418         [AC_LANG_SOURCE([[
1419 #include <stdio.h>
1420 #if HAVE_SNPRINTF
1421 # define my_snprintf snprintf
1422 #else
1423 # include <stdarg.h>
1424 static int my_snprintf (char *buf, int size, const char *format, ...)
1426   va_list args;
1427   int ret;
1428   va_start (args, format);
1429   ret = vsnprintf (buf, size, format, args);
1430   va_end (args);
1431   return ret;
1433 #endif
1434 int main()
1436   static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1437   my_snprintf (buf, 1, "%d", 12345);
1438   return buf[1] != 'E';
1439 }]])],
1440         [gl_cv_func_snprintf_size1=yes],
1441         [gl_cv_func_snprintf_size1=no],
1442         [case "$host_os" in
1443                    # Guess yes on native Windows.
1444            mingw*) gl_cv_func_snprintf_size1="guessing yes" ;;
1445            *)      gl_cv_func_snprintf_size1="guessing yes" ;;
1446          esac
1447         ])
1448     ])
1451 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1452 dnl output. (ISO C99, POSIX:2001)
1453 dnl For example, snprintf nevertheless writes a NUL byte in this case
1454 dnl on OSF/1 5.1:
1455 dnl     ---------------------------------------------------------------------
1456 dnl     #include <stdio.h>
1457 dnl     int main()
1458 dnl     {
1459 dnl       static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1460 dnl       snprintf (buf, 0, "%d", 12345);
1461 dnl       return buf[0] != 'D';
1462 dnl     }
1463 dnl     ---------------------------------------------------------------------
1464 dnl And vsnprintf writes any output without bounds in this case, behaving like
1465 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1466 dnl     ---------------------------------------------------------------------
1467 dnl     #include <stdarg.h>
1468 dnl     #include <stdio.h>
1469 dnl     static int my_snprintf (char *buf, int size, const char *format, ...)
1470 dnl     {
1471 dnl       va_list args;
1472 dnl       int ret;
1473 dnl       va_start (args, format);
1474 dnl       ret = vsnprintf (buf, size, format, args);
1475 dnl       va_end (args);
1476 dnl       return ret;
1477 dnl     }
1478 dnl     int main()
1479 dnl     {
1480 dnl       static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1481 dnl       my_snprintf (buf, 0, "%d", 12345);
1482 dnl       return buf[0] != 'D';
1483 dnl     }
1484 dnl     ---------------------------------------------------------------------
1485 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1487 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1489   AC_REQUIRE([AC_PROG_CC])
1490   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1491   AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1492     [gl_cv_func_vsnprintf_zerosize_c99],
1493     [
1494       AC_RUN_IFELSE(
1495         [AC_LANG_SOURCE([[
1496 #include <stdarg.h>
1497 #include <stdio.h>
1498 static int my_snprintf (char *buf, int size, const char *format, ...)
1500   va_list args;
1501   int ret;
1502   va_start (args, format);
1503   ret = vsnprintf (buf, size, format, args);
1504   va_end (args);
1505   return ret;
1507 int main()
1509   static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1510   my_snprintf (buf, 0, "%d", 12345);
1511   return buf[0] != 'D';
1512 }]])],
1513         [gl_cv_func_vsnprintf_zerosize_c99=yes],
1514         [gl_cv_func_vsnprintf_zerosize_c99=no],
1515         [
1516 changequote(,)dnl
1517          case "$host_os" in
1518                                  # Guess yes on glibc systems.
1519            *-gnu*)               gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1520                                  # Guess yes on FreeBSD >= 5.
1521            freebsd[1-4].*)       gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1522            freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1523                                  # Guess yes on Mac OS X >= 10.3.
1524            darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1525            darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1526                                  # Guess yes on Cygwin.
1527            cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1528                                  # Guess yes on Solaris >= 2.6.
1529            solaris2.[0-5] | solaris2.[0-5].*)
1530                                  gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1531            solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1532                                  # Guess yes on AIX >= 4.
1533            aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1534            aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1535                                  # Guess yes on IRIX >= 6.5.
1536            irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1537                                  # Guess yes on NetBSD >= 3.
1538            netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1539                                  gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1540            netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1541                                  # Guess yes on BeOS.
1542            beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1543                                  # Guess yes on native Windows.
1544            mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1545                                  # If we don't know, assume the worst.
1546            *)                    gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1547          esac
1548 changequote([,])dnl
1549         ])
1550     ])
1553 dnl The results of these tests on various platforms are:
1555 dnl 1 = gl_PRINTF_SIZES_C99
1556 dnl 2 = gl_PRINTF_LONG_DOUBLE
1557 dnl 3 = gl_PRINTF_INFINITE
1558 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1559 dnl 5 = gl_PRINTF_DIRECTIVE_A
1560 dnl 6 = gl_PRINTF_DIRECTIVE_F
1561 dnl 7 = gl_PRINTF_DIRECTIVE_N
1562 dnl 8 = gl_PRINTF_DIRECTIVE_LS
1563 dnl 9 = gl_PRINTF_POSITIONS
1564 dnl 10 = gl_PRINTF_FLAG_GROUPING
1565 dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
1566 dnl 12 = gl_PRINTF_FLAG_ZERO
1567 dnl 13 = gl_PRINTF_PRECISION
1568 dnl 14 = gl_PRINTF_ENOMEM
1569 dnl 15 = gl_SNPRINTF_PRESENCE
1570 dnl 16 = gl_SNPRINTF_TRUNCATION_C99
1571 dnl 17 = gl_SNPRINTF_RETVAL_C99
1572 dnl 18 = gl_SNPRINTF_DIRECTIVE_N
1573 dnl 19 = gl_SNPRINTF_SIZE1
1574 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
1576 dnl 1 = checking whether printf supports size specifiers as in C99...
1577 dnl 2 = checking whether printf supports 'long double' arguments...
1578 dnl 3 = checking whether printf supports infinite 'double' arguments...
1579 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1580 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1581 dnl 6 = checking whether printf supports the 'F' directive...
1582 dnl 7 = checking whether printf supports the 'n' directive...
1583 dnl 8 = checking whether printf supports the 'ls' directive...
1584 dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
1585 dnl 10 = checking whether printf supports the grouping flag...
1586 dnl 11 = checking whether printf supports the left-adjust flag correctly...
1587 dnl 12 = checking whether printf supports the zero flag correctly...
1588 dnl 13 = checking whether printf supports large precisions...
1589 dnl 14 = checking whether printf survives out-of-memory conditions...
1590 dnl 15 = checking for snprintf...
1591 dnl 16 = checking whether snprintf truncates the result as in C99...
1592 dnl 17 = checking whether snprintf returns a byte count as in C99...
1593 dnl 18 = checking whether snprintf fully supports the 'n' directive...
1594 dnl 19 = checking whether snprintf respects a size of 1...
1595 dnl 20 = checking whether vsnprintf respects a zero size as in C99...
1597 dnl . = yes, # = no.
1599 dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
1600 dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
1601 dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
1602 dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
1603 dnl   Mac OS X 10.5.8                .  .  .  #  #  .  .  .  .  .  .  #  .  .  .  .  .  .  .  .
1604 dnl   Mac OS X 10.3.9                .  .  .  .  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
1605 dnl   OpenBSD 3.9, 4.0               .  .  #  #  #  #  .  #  .  #  .  #  .  #  .  .  .  .  .  .
1606 dnl   Cygwin 1.7.0 (2009)            .  .  .  #  .  .  .  ?  .  .  .  .  .  ?  .  .  .  .  .  .
1607 dnl   Cygwin 1.5.25 (2008)           .  .  .  #  #  .  .  #  .  .  .  .  .  #  .  .  .  .  .  .
1608 dnl   Cygwin 1.5.19 (2006)           #  .  .  #  #  #  .  #  .  #  .  #  #  #  .  .  .  .  .  .
1609 dnl   Solaris 11 2011-11             .  .  #  #  #  .  .  #  .  .  .  #  .  .  .  .  .  .  .  .
1610 dnl   Solaris 10                     .  .  #  #  #  .  .  #  .  .  .  #  #  .  .  .  .  .  .  .
1611 dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  #  .  .  .  #  #  .  .  .  #  .  .  .
1612 dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  #  .  .  .  #  .  .  #  #  #  #  #  #
1613 dnl   AIX 7.1                        .  .  #  #  #  .  .  .  .  .  .  #  #  .  .  .  .  .  .  .
1614 dnl   AIX 5.2                        .  .  #  #  #  .  .  .  .  .  .  #  .  .  .  .  .  .  .  .
1615 dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  .  .  #  .  .  .  .  #  .  .  .
1616 dnl   HP-UX 11.31                    .  .  .  .  #  .  .  .  .  .  .  #  .  .  .  .  #  #  .  .
1617 dnl   HP-UX 11.{00,11,23}            #  .  .  .  #  #  .  .  .  .  .  #  .  .  .  .  #  #  .  #
1618 dnl   HP-UX 10.20                    #  .  #  .  #  #  .  ?  .  .  #  #  .  .  .  .  #  #  ?  #
1619 dnl   IRIX 6.5                       #  .  #  #  #  #  .  #  .  .  .  #  .  .  .  .  #  .  .  .
1620 dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  .  .  #  .  .  .  .  #  .  .  #
1621 dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  .  .  #  .  .  #  #  #  #  #  #
1622 dnl   NetBSD 5.0                     .  .  .  #  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
1623 dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  ?  .  ?  ?  ?  ?  ?  .  .  .  ?  ?  ?
1624 dnl   NetBSD 3.0                     .  .  .  .  #  #  .  ?  #  #  ?  #  .  #  .  .  .  .  .  .
1625 dnl   Haiku                          .  .  .  #  #  #  .  #  .  .  .  .  .  ?  .  .  ?  .  .  .
1626 dnl   BeOS                           #  #  .  #  #  #  .  ?  #  .  ?  .  #  ?  .  .  ?  .  .  .
1627 dnl   old mingw / msvcrt             #  #  #  #  #  #  .  .  #  #  .  #  #  ?  .  #  #  #  .  .
1628 dnl   MSVC 9                         #  #  #  #  #  #  #  .  #  #  .  #  #  ?  #  #  #  #  .  .
1629 dnl   mingw 2009-2011                .  #  .  #  .  .  .  .  #  #  .  .  .  ?  .  .  .  .  .  .
1630 dnl   mingw-w64 2011                 #  #  #  #  #  #  .  .  #  #  .  #  #  ?  .  #  #  #  .  .