Guess that printf on Haiku survives out-of-memory conditions.
[gnulib.git] / m4 / printf.m4
1 # printf.m4 serial 24
2 dnl Copyright (C) 2003, 2007-2008 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.
6
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.
10
11 AC_DEFUN([gl_PRINTF_SIZES_C99],
12 [
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_TRY_RUN([
21 #include <stddef.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <sys/types.h>
25 #if HAVE_STDINT_H_WITH_UINTMAX
26 # include <stdint.h>
27 #endif
28 #if HAVE_INTTYPES_H_WITH_UINTMAX
29 # include <inttypes.h>
30 #endif
31 static char buf[100];
32 int main ()
33 {
34 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
35   buf[0] = '\0';
36   if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
37       || strcmp (buf, "12345671 33") != 0)
38     return 1;
39 #endif
40   buf[0] = '\0';
41   if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
42       || strcmp (buf, "12345672 33") != 0)
43     return 1;
44   buf[0] = '\0';
45   if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
46       || strcmp (buf, "12345673 33") != 0)
47     return 1;
48   buf[0] = '\0';
49   if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
50       || strcmp (buf, "1.5 33") != 0)
51     return 1;
52   return 0;
53 }], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no],
54       [
55 changequote(,)dnl
56        case "$host_os" in
57                                # Guess yes on glibc systems.
58          *-gnu*)               gl_cv_func_printf_sizes_c99="guessing yes";;
59                                # Guess yes on FreeBSD >= 5.
60          freebsd[1-4]*)        gl_cv_func_printf_sizes_c99="guessing no";;
61          freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
62                                # Guess yes on MacOS X >= 10.3.
63          darwin[1-6].*)        gl_cv_func_printf_sizes_c99="guessing no";;
64          darwin*)              gl_cv_func_printf_sizes_c99="guessing yes";;
65                                # Guess yes on OpenBSD >= 3.9.
66          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
67                                gl_cv_func_printf_sizes_c99="guessing no";;
68          openbsd*)             gl_cv_func_printf_sizes_c99="guessing yes";;
69                                # Guess yes on Solaris >= 2.10.
70          solaris2.[0-9]*)      gl_cv_func_printf_sizes_c99="guessing no";;
71          solaris*)             gl_cv_func_printf_sizes_c99="guessing yes";;
72                                # Guess yes on NetBSD >= 3.
73          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
74                                gl_cv_func_printf_sizes_c99="guessing no";;
75          netbsd*)              gl_cv_func_printf_sizes_c99="guessing yes";;
76                                # If we don't know, assume the worst.
77          *)                    gl_cv_func_printf_sizes_c99="guessing no";;
78        esac
79 changequote([,])dnl
80       ])
81     ])
82 ])
83
84 dnl Test whether the *printf family of functions supports 'long double'
85 dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
86 dnl Result is gl_cv_func_printf_long_double.
87
88 AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
89 [
90   AC_REQUIRE([AC_PROG_CC])
91   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
92   AC_CACHE_CHECK([whether printf supports 'long double' arguments],
93     [gl_cv_func_printf_long_double],
94     [
95       AC_TRY_RUN([
96 #include <stdio.h>
97 #include <string.h>
98 static char buf[10000];
99 int main ()
100 {
101   buf[0] = '\0';
102   if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
103       || strcmp (buf, "1.750000 33") != 0)
104     return 1;
105   buf[0] = '\0';
106   if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
107       || strcmp (buf, "1.750000e+00 33") != 0)
108     return 1;
109   buf[0] = '\0';
110   if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
111       || strcmp (buf, "1.75 33") != 0)
112     return 1;
113   return 0;
114 }], [gl_cv_func_printf_long_double=yes], [gl_cv_func_printf_long_double=no],
115       [
116 changequote(,)dnl
117        case "$host_os" in
118          beos*)        gl_cv_func_printf_long_double="guessing no";;
119          mingw* | pw*) gl_cv_func_printf_long_double="guessing no";;
120          *)            gl_cv_func_printf_long_double="guessing yes";;
121        esac
122 changequote([,])dnl
123       ])
124     ])
125 ])
126
127 dnl Test whether the *printf family of functions supports infinite and NaN
128 dnl 'double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
129 dnl Result is gl_cv_func_printf_infinite.
130
131 AC_DEFUN([gl_PRINTF_INFINITE],
132 [
133   AC_REQUIRE([AC_PROG_CC])
134   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
135   AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
136     [gl_cv_func_printf_infinite],
137     [
138       AC_TRY_RUN([
139 #include <stdio.h>
140 #include <string.h>
141 static int
142 strisnan (const char *string, size_t start_index, size_t end_index)
143 {
144   if (start_index < end_index)
145     {
146       if (string[start_index] == '-')
147         start_index++;
148       if (start_index + 3 <= end_index
149           && memcmp (string + start_index, "nan", 3) == 0)
150         {
151           start_index += 3;
152           if (start_index == end_index
153               || (string[start_index] == '(' && string[end_index - 1] == ')'))
154             return 1;
155         }
156     }
157   return 0;
158 }
159 static char buf[10000];
160 static double zero = 0.0;
161 int main ()
162 {
163   if (sprintf (buf, "%f", 1.0 / 0.0) < 0
164       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
165     return 1;
166   if (sprintf (buf, "%f", -1.0 / 0.0) < 0
167       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
168     return 1;
169   if (sprintf (buf, "%f", zero / zero) < 0
170       || !strisnan (buf, 0, strlen (buf)))
171     return 1;
172   if (sprintf (buf, "%e", 1.0 / 0.0) < 0
173       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
174     return 1;
175   if (sprintf (buf, "%e", -1.0 / 0.0) < 0
176       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
177     return 1;
178   if (sprintf (buf, "%e", zero / zero) < 0
179       || !strisnan (buf, 0, strlen (buf)))
180     return 1;
181   if (sprintf (buf, "%g", 1.0 / 0.0) < 0
182       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
183     return 1;
184   if (sprintf (buf, "%g", -1.0 / 0.0) < 0
185       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
186     return 1;
187   if (sprintf (buf, "%g", zero / zero) < 0
188       || !strisnan (buf, 0, strlen (buf)))
189     return 1;
190   return 0;
191 }], [gl_cv_func_printf_infinite=yes], [gl_cv_func_printf_infinite=no],
192       [
193 changequote(,)dnl
194        case "$host_os" in
195                                # Guess yes on glibc systems.
196          *-gnu*)               gl_cv_func_printf_infinite="guessing yes";;
197                                # Guess yes on FreeBSD >= 6.
198          freebsd[1-5]*)        gl_cv_func_printf_infinite="guessing no";;
199          freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
200                                # Guess yes on MacOS X >= 10.3.
201          darwin[1-6].*)        gl_cv_func_printf_infinite="guessing no";;
202          darwin*)              gl_cv_func_printf_infinite="guessing yes";;
203                                # Guess yes on HP-UX >= 11.
204          hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
205          hpux*)                gl_cv_func_printf_infinite="guessing yes";;
206                                # Guess yes on NetBSD >= 3.
207          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
208                                gl_cv_func_printf_infinite="guessing no";;
209          netbsd*)              gl_cv_func_printf_infinite="guessing yes";;
210                                # Guess yes on BeOS.
211          beos*)                gl_cv_func_printf_infinite="guessing yes";;
212                                # If we don't know, assume the worst.
213          *)                    gl_cv_func_printf_infinite="guessing no";;
214        esac
215 changequote([,])dnl
216       ])
217     ])
218 ])
219
220 dnl Test whether the *printf family of functions supports infinite and NaN
221 dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
222 dnl Result is gl_cv_func_printf_infinite_long_double.
223
224 AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
225 [
226   AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
227   AC_REQUIRE([AC_PROG_CC])
228   AC_REQUIRE([AC_C_BIGENDIAN])
229   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
230   dnl The user can set or unset the variable gl_printf_safe to indicate
231   dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
232   if test -n "$gl_printf_safe"; then
233     AC_DEFINE([CHECK_PRINTF_SAFE], 1,
234       [Define if you wish *printf() functions that have a safe handling of
235        non-IEEE-754 'long double' values.])
236   fi
237   case "$gl_cv_func_printf_long_double" in
238     *yes)
239       AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
240         [gl_cv_func_printf_infinite_long_double],
241         [
242           AC_TRY_RUN([
243 ]GL_NOCRASH[
244 #include <float.h>
245 #include <stdio.h>
246 #include <string.h>
247 static int
248 strisnan (const char *string, size_t start_index, size_t end_index)
249 {
250   if (start_index < end_index)
251     {
252       if (string[start_index] == '-')
253         start_index++;
254       if (start_index + 3 <= end_index
255           && memcmp (string + start_index, "nan", 3) == 0)
256         {
257           start_index += 3;
258           if (start_index == end_index
259               || (string[start_index] == '(' && string[end_index - 1] == ')'))
260             return 1;
261         }
262     }
263   return 0;
264 }
265 static char buf[10000];
266 static long double zeroL = 0.0L;
267 int main ()
268 {
269   nocrash_init();
270   if (sprintf (buf, "%Lf", 1.0L / 0.0L) < 0
271       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
272     return 1;
273   if (sprintf (buf, "%Lf", -1.0L / 0.0L) < 0
274       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
275     return 1;
276   if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
277       || !strisnan (buf, 0, strlen (buf)))
278     return 1;
279   if (sprintf (buf, "%Le", 1.0L / 0.0L) < 0
280       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
281     return 1;
282   if (sprintf (buf, "%Le", -1.0L / 0.0L) < 0
283       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
284     return 1;
285   if (sprintf (buf, "%Le", zeroL / zeroL) < 0
286       || !strisnan (buf, 0, strlen (buf)))
287     return 1;
288   if (sprintf (buf, "%Lg", 1.0L / 0.0L) < 0
289       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
290     return 1;
291   if (sprintf (buf, "%Lg", -1.0L / 0.0L) < 0
292       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
293     return 1;
294   if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
295       || !strisnan (buf, 0, strlen (buf)))
296     return 1;
297 #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_))
298 /* Representation of an 80-bit 'long double' as an initializer for a sequence
299    of 'unsigned int' words.  */
300 # ifdef WORDS_BIGENDIAN
301 #  define LDBL80_WORDS(exponent,manthi,mantlo) \
302      { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
303        ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16),    \
304        (unsigned int) (mantlo) << 16                                        \
305      }
306 # else
307 #  define LDBL80_WORDS(exponent,manthi,mantlo) \
308      { mantlo, manthi, exponent }
309 # endif
310   { /* Quiet NaN.  */
311     static union { unsigned int word[4]; long double value; } x =
312       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
313     if (sprintf (buf, "%Lf", x.value) < 0
314         || !strisnan (buf, 0, strlen (buf)))
315       return 1;
316     if (sprintf (buf, "%Le", x.value) < 0
317         || !strisnan (buf, 0, strlen (buf)))
318       return 1;
319     if (sprintf (buf, "%Lg", x.value) < 0
320         || !strisnan (buf, 0, strlen (buf)))
321       return 1;
322   }
323   {
324     /* Signalling NaN.  */
325     static union { unsigned int word[4]; long double value; } x =
326       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
327     if (sprintf (buf, "%Lf", x.value) < 0
328         || !strisnan (buf, 0, strlen (buf)))
329       return 1;
330     if (sprintf (buf, "%Le", x.value) < 0
331         || !strisnan (buf, 0, strlen (buf)))
332       return 1;
333     if (sprintf (buf, "%Lg", x.value) < 0
334         || !strisnan (buf, 0, strlen (buf)))
335       return 1;
336   }
337   { /* Pseudo-NaN.  */
338     static union { unsigned int word[4]; long double value; } x =
339       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
340     if (sprintf (buf, "%Lf", x.value) < 0
341         || !strisnan (buf, 0, strlen (buf)))
342       return 1;
343     if (sprintf (buf, "%Le", x.value) < 0
344         || !strisnan (buf, 0, strlen (buf)))
345       return 1;
346     if (sprintf (buf, "%Lg", x.value) < 0
347         || !strisnan (buf, 0, strlen (buf)))
348       return 1;
349   }
350   { /* Pseudo-Infinity.  */
351     static union { unsigned int word[4]; long double value; } x =
352       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
353     if (sprintf (buf, "%Lf", x.value) < 0
354         || !strisnan (buf, 0, strlen (buf)))
355       return 1;
356     if (sprintf (buf, "%Le", x.value) < 0
357         || !strisnan (buf, 0, strlen (buf)))
358       return 1;
359     if (sprintf (buf, "%Lg", x.value) < 0
360         || !strisnan (buf, 0, strlen (buf)))
361       return 1;
362   }
363   { /* Pseudo-Zero.  */
364     static union { unsigned int word[4]; long double value; } x =
365       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
366     if (sprintf (buf, "%Lf", x.value) < 0
367         || !strisnan (buf, 0, strlen (buf)))
368       return 1;
369     if (sprintf (buf, "%Le", x.value) < 0
370         || !strisnan (buf, 0, strlen (buf)))
371       return 1;
372     if (sprintf (buf, "%Lg", x.value) < 0
373         || !strisnan (buf, 0, strlen (buf)))
374       return 1;
375   }
376   { /* Unnormalized number.  */
377     static union { unsigned int word[4]; long double value; } x =
378       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
379     if (sprintf (buf, "%Lf", x.value) < 0
380         || !strisnan (buf, 0, strlen (buf)))
381       return 1;
382     if (sprintf (buf, "%Le", x.value) < 0
383         || !strisnan (buf, 0, strlen (buf)))
384       return 1;
385     if (sprintf (buf, "%Lg", x.value) < 0
386         || !strisnan (buf, 0, strlen (buf)))
387       return 1;
388   }
389   { /* Pseudo-Denormal.  */
390     static union { unsigned int word[4]; long double value; } x =
391       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
392     if (sprintf (buf, "%Lf", x.value) < 0
393         || !strisnan (buf, 0, strlen (buf)))
394       return 1;
395     if (sprintf (buf, "%Le", x.value) < 0
396         || !strisnan (buf, 0, strlen (buf)))
397       return 1;
398     if (sprintf (buf, "%Lg", x.value) < 0
399         || !strisnan (buf, 0, strlen (buf)))
400       return 1;
401   }
402 #endif
403   return 0;
404 }],
405           [gl_cv_func_printf_infinite_long_double=yes],
406           [gl_cv_func_printf_infinite_long_double=no],
407           [
408 changequote(,)dnl
409            case "$host_cpu" in
410                                    # Guess no on ia64, x86_64, i386.
411              ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
412              *)
413                case "$host_os" in
414                                        # Guess yes on glibc systems.
415                  *-gnu*)               gl_cv_func_printf_infinite_long_double="guessing yes";;
416                                        # Guess yes on FreeBSD >= 6.
417                  freebsd[1-5]*)        gl_cv_func_printf_infinite_long_double="guessing no";;
418                  freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
419                                        # Guess yes on MacOS X >= 10.3.
420                  darwin[1-6].*)        gl_cv_func_printf_infinite_long_double="guessing no";;
421                  darwin*)              gl_cv_func_printf_infinite_long_double="guessing yes";;
422                                        # Guess yes on HP-UX >= 11.
423                  hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
424                  hpux*)                gl_cv_func_printf_infinite_long_double="guessing yes";;
425                                        # Guess yes on NetBSD >= 3.
426                  netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
427                                        gl_cv_func_printf_infinite_long_double="guessing no";;
428                  netbsd*)              gl_cv_func_printf_infinite_long_double="guessing yes";;
429                                        # If we don't know, assume the worst.
430                  *)                    gl_cv_func_printf_infinite_long_double="guessing no";;
431                esac
432                ;;
433            esac
434 changequote([,])dnl
435           ])
436         ])
437       ;;
438     *)
439       gl_cv_func_printf_infinite_long_double="irrelevant"
440       ;;
441   esac
442 ])
443
444 dnl Test whether the *printf family of functions supports the 'a' and 'A'
445 dnl conversion specifier for hexadecimal output of floating-point numbers.
446 dnl (ISO C99, POSIX:2001)
447 dnl Result is gl_cv_func_printf_directive_a.
448
449 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
450 [
451   AC_REQUIRE([AC_PROG_CC])
452   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
453   AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
454     [gl_cv_func_printf_directive_a],
455     [
456       AC_TRY_RUN([
457 #include <stdio.h>
458 #include <string.h>
459 static char buf[100];
460 int main ()
461 {
462   if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
463       || (strcmp (buf, "0x1.922p+1 33") != 0
464           && strcmp (buf, "0x3.244p+0 33") != 0
465           && strcmp (buf, "0x6.488p-1 33") != 0
466           && strcmp (buf, "0xc.91p-2 33") != 0))
467     return 1;
468   if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
469       || (strcmp (buf, "-0X1.922P+1 33") != 0
470           && strcmp (buf, "-0X3.244P+0 33") != 0
471           && strcmp (buf, "-0X6.488P-1 33") != 0
472           && strcmp (buf, "-0XC.91P-2 33") != 0))
473     return 1;
474   /* This catches a FreeBSD 6.1 bug: it doesn't round.  */
475   if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
476       || (strcmp (buf, "0x1.83p+0 33") != 0
477           && strcmp (buf, "0x3.05p-1 33") != 0
478           && strcmp (buf, "0x6.0ap-2 33") != 0
479           && strcmp (buf, "0xc.14p-3 33") != 0))
480     return 1;
481   /* This catches a FreeBSD 6.1 bug.  See
482      <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
483   if (sprintf (buf, "%010a %d", 1.0 / 0.0, 33, 44, 55) < 0
484       || buf[0] == '0')
485     return 1;
486   /* This catches a MacOS X 10.3.9 (Darwin 7.9) bug.  */
487   if (sprintf (buf, "%.1a", 1.999) < 0
488       || (strcmp (buf, "0x1.0p+1") != 0
489           && strcmp (buf, "0x2.0p+0") != 0
490           && strcmp (buf, "0x4.0p-1") != 0
491           && strcmp (buf, "0x8.0p-2") != 0))
492     return 1;
493   /* This catches the same MacOS X 10.3.9 (Darwin 7.9) bug and also a
494      glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
495   if (sprintf (buf, "%.1La", 1.999L) < 0
496       || (strcmp (buf, "0x1.0p+1") != 0
497           && strcmp (buf, "0x2.0p+0") != 0
498           && strcmp (buf, "0x4.0p-1") != 0
499           && strcmp (buf, "0x8.0p-2") != 0))
500     return 1;
501   return 0;
502 }], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no],
503       [
504        case "$host_os" in
505                                # Guess yes on glibc >= 2.5 systems.
506          *-gnu*)
507            AC_EGREP_CPP([BZ2908], [
508              #include <features.h>
509              #ifdef __GNU_LIBRARY__
510               #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)
511                BZ2908
512               #endif
513              #endif
514              ],
515              [gl_cv_func_printf_directive_a="guessing yes"],
516              [gl_cv_func_printf_directive_a="guessing no"])
517            ;;
518                                # If we don't know, assume the worst.
519          *)                    gl_cv_func_printf_directive_a="guessing no";;
520        esac
521       ])
522     ])
523 ])
524
525 dnl Test whether the *printf family of functions supports the %F format
526 dnl directive. (ISO C99, POSIX:2001)
527 dnl Result is gl_cv_func_printf_directive_f.
528
529 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
530 [
531   AC_REQUIRE([AC_PROG_CC])
532   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
533   AC_CACHE_CHECK([whether printf supports the 'F' directive],
534     [gl_cv_func_printf_directive_f],
535     [
536       AC_TRY_RUN([
537 #include <stdio.h>
538 #include <string.h>
539 static char buf[100];
540 int main ()
541 {
542   if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
543       || strcmp (buf, "1234567.000000 33") != 0)
544     return 1;
545   if (sprintf (buf, "%F", 1.0 / 0.0) < 0
546       || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
547     return 1;
548   /* This catches a Cygwin 2007 bug.  */
549   if (sprintf (buf, "%.F", 1234.0) < 0
550       || strcmp (buf, "1234") != 0)
551     return 1;
552   return 0;
553 }], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no],
554       [
555 changequote(,)dnl
556        case "$host_os" in
557                                # Guess yes on glibc systems.
558          *-gnu*)               gl_cv_func_printf_directive_f="guessing yes";;
559                                # Guess yes on FreeBSD >= 6.
560          freebsd[1-5]*)        gl_cv_func_printf_directive_f="guessing no";;
561          freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
562                                # Guess yes on MacOS X >= 10.3.
563          darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
564          darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
565                                # Guess yes on Solaris >= 2.10.
566          solaris2.[0-9]*)      gl_cv_func_printf_directive_f="guessing no";;
567          solaris*)             gl_cv_func_printf_directive_f="guessing yes";;
568                                # If we don't know, assume the worst.
569          *)                    gl_cv_func_printf_directive_f="guessing no";;
570        esac
571 changequote([,])dnl
572       ])
573     ])
574 ])
575
576 dnl Test whether the *printf family of functions supports the %n format
577 dnl directive. (ISO C99, POSIX:2001)
578 dnl Result is gl_cv_func_printf_directive_n.
579
580 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
581 [
582   AC_REQUIRE([AC_PROG_CC])
583   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
584   AC_CACHE_CHECK([whether printf supports the 'n' directive],
585     [gl_cv_func_printf_directive_n],
586     [
587       AC_TRY_RUN([
588 #include <stdio.h>
589 #include <string.h>
590 static char fmtstring[10];
591 static char buf[100];
592 int main ()
593 {
594   int count = -1;
595   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
596      support %n in format strings in read-only memory but not in writable
597      memory.  */
598   strcpy (fmtstring, "%d %n");
599   if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
600       || strcmp (buf, "123 ") != 0
601       || count != 4)
602     return 1;
603   return 0;
604 }], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no],
605       [
606 changequote(,)dnl
607        case "$host_os" in
608          *)     gl_cv_func_printf_directive_n="guessing yes";;
609        esac
610 changequote([,])dnl
611       ])
612     ])
613 ])
614
615 dnl Test whether the *printf family of functions supports POSIX/XSI format
616 dnl strings with positions. (POSIX:2001)
617 dnl Result is gl_cv_func_printf_positions.
618
619 AC_DEFUN([gl_PRINTF_POSITIONS],
620 [
621   AC_REQUIRE([AC_PROG_CC])
622   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
623   AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
624     [gl_cv_func_printf_positions],
625     [
626       AC_TRY_RUN([
627 #include <stdio.h>
628 #include <string.h>
629 /* The string "%2$d %1$d", with dollar characters protected from the shell's
630    dollar expansion (possibly an autoconf bug).  */
631 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
632 static char buf[100];
633 int main ()
634 {
635   sprintf (buf, format, 33, 55);
636   return (strcmp (buf, "55 33") != 0);
637 }], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no],
638       [
639 changequote(,)dnl
640        case "$host_os" in
641          netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
642                        gl_cv_func_printf_positions="guessing no";;
643          beos*)        gl_cv_func_printf_positions="guessing no";;
644          mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
645          *)            gl_cv_func_printf_positions="guessing yes";;
646        esac
647 changequote([,])dnl
648       ])
649     ])
650 ])
651
652 dnl Test whether the *printf family of functions supports POSIX/XSI format
653 dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
654 dnl Result is gl_cv_func_printf_flag_grouping.
655
656 AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
657 [
658   AC_REQUIRE([AC_PROG_CC])
659   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
660   AC_CACHE_CHECK([whether printf supports the grouping flag],
661     [gl_cv_func_printf_flag_grouping],
662     [
663       AC_TRY_RUN([
664 #include <stdio.h>
665 #include <string.h>
666 static char buf[100];
667 int main ()
668 {
669   if (sprintf (buf, "%'d %d", 1234567, 99) < 0
670       || buf[strlen (buf) - 1] != '9')
671     return 1;
672   return 0;
673 }], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no],
674       [
675 changequote(,)dnl
676        case "$host_os" in
677          cygwin*)      gl_cv_func_printf_flag_grouping="guessing no";;
678          netbsd*)      gl_cv_func_printf_flag_grouping="guessing no";;
679          mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
680          *)            gl_cv_func_printf_flag_grouping="guessing yes";;
681        esac
682 changequote([,])dnl
683       ])
684     ])
685 ])
686
687 dnl Test whether the *printf family of functions supports the - flag correctly.
688 dnl (ISO C99.) See
689 dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html>
690 dnl Result is gl_cv_func_printf_flag_leftadjust.
691
692 AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
693 [
694   AC_REQUIRE([AC_PROG_CC])
695   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
696   AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
697     [gl_cv_func_printf_flag_leftadjust],
698     [
699       AC_TRY_RUN([
700 #include <stdio.h>
701 #include <string.h>
702 static char buf[100];
703 int main ()
704 {
705   /* Check that a '-' flag is not annihilated by a negative width.  */
706   if (sprintf (buf, "a%-*sc", -3, "b") < 0
707       || strcmp (buf, "ab  c") != 0)
708     return 1;
709   return 0;
710 }],
711         [gl_cv_func_printf_flag_leftadjust=yes],
712         [gl_cv_func_printf_flag_leftadjust=no],
713         [
714 changequote(,)dnl
715          case "$host_os" in
716                     # Guess yes on HP-UX 11.
717            hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
718                     # Guess no on HP-UX 10 and older.
719            hpux*)   gl_cv_func_printf_flag_leftadjust="guessing no";;
720                     # Guess yes otherwise.
721            *)       gl_cv_func_printf_flag_leftadjust="guessing yes";;
722          esac
723 changequote([,])dnl
724         ])
725     ])
726 ])
727
728 dnl Test whether the *printf family of functions supports padding of non-finite
729 dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
730 dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
731 dnl Result is gl_cv_func_printf_flag_zero.
732
733 AC_DEFUN([gl_PRINTF_FLAG_ZERO],
734 [
735   AC_REQUIRE([AC_PROG_CC])
736   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
737   AC_CACHE_CHECK([whether printf supports the zero flag correctly],
738     [gl_cv_func_printf_flag_zero],
739     [
740       AC_TRY_RUN([
741 #include <stdio.h>
742 #include <string.h>
743 static char buf[100];
744 int main ()
745 {
746   if (sprintf (buf, "%010f", 1.0 / 0.0, 33, 44, 55) < 0
747       || (strcmp (buf, "       inf") != 0
748           && strcmp (buf, "  infinity") != 0))
749     return 1;
750   return 0;
751 }], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no],
752       [
753 changequote(,)dnl
754        case "$host_os" in
755                  # Guess yes on glibc systems.
756          *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
757                  # Guess yes on BeOS.
758          beos*)  gl_cv_func_printf_flag_zero="guessing yes";;
759                  # If we don't know, assume the worst.
760          *)      gl_cv_func_printf_flag_zero="guessing no";;
761        esac
762 changequote([,])dnl
763       ])
764     ])
765 ])
766
767 dnl Test whether the *printf family of functions supports large precisions.
768 dnl On mingw, precisions larger than 512 are treated like 512, in integer,
769 dnl floating-point or pointer output. On BeOS, precisions larger than 1044
770 dnl crash the program.
771 dnl Result is gl_cv_func_printf_precision.
772
773 AC_DEFUN([gl_PRINTF_PRECISION],
774 [
775   AC_REQUIRE([AC_PROG_CC])
776   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
777   AC_CACHE_CHECK([whether printf supports large precisions],
778     [gl_cv_func_printf_precision],
779     [
780       AC_TRY_RUN([
781 #include <stdio.h>
782 #include <string.h>
783 static char buf[5000];
784 int main ()
785 {
786 #ifdef __BEOS__
787   /* On BeOS, this would crash and show a dialog box.  Avoid the crash.  */
788   return 1;
789 #endif
790   if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
791     return 1;
792   return 0;
793 }], [gl_cv_func_printf_precision=yes], [gl_cv_func_printf_precision=no],
794       [
795 changequote(,)dnl
796        case "$host_os" in
797          # Guess no only on native Win32 and BeOS systems.
798          mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
799          beos*)        gl_cv_func_printf_precision="guessing no" ;;
800          *)            gl_cv_func_printf_precision="guessing yes" ;;
801        esac
802 changequote([,])dnl
803       ])
804     ])
805 ])
806
807 dnl Test whether the *printf family of functions recovers gracefully in case
808 dnl of an out-of-memory condition, or whether it crashes the entire program.
809 dnl Result is gl_cv_func_printf_enomem.
810
811 AC_DEFUN([gl_PRINTF_ENOMEM],
812 [
813   AC_REQUIRE([AC_PROG_CC])
814   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
815   AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
816     [gl_cv_func_printf_enomem],
817     [
818       gl_cv_func_printf_enomem="guessing no"
819       if test "$cross_compiling" = no; then
820         AC_LANG_CONFTEST([AC_LANG_SOURCE([
821 ]GL_NOCRASH[
822 changequote(,)dnl
823 #include <stdio.h>
824 #include <sys/types.h>
825 #include <sys/time.h>
826 #include <sys/resource.h>
827 #include <errno.h>
828 int main()
829 {
830   struct rlimit limit;
831   int ret;
832   nocrash_init ();
833   /* Some printf implementations allocate temporary space with malloc.  */
834   /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
835 #ifdef RLIMIT_DATA
836   if (getrlimit (RLIMIT_DATA, &limit) < 0)
837     return 77;
838   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
839     limit.rlim_max = 5000000;
840   limit.rlim_cur = limit.rlim_max;
841   if (setrlimit (RLIMIT_DATA, &limit) < 0)
842     return 77;
843 #endif
844   /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
845 #ifdef RLIMIT_AS
846   if (getrlimit (RLIMIT_AS, &limit) < 0)
847     return 77;
848   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
849     limit.rlim_max = 5000000;
850   limit.rlim_cur = limit.rlim_max;
851   if (setrlimit (RLIMIT_AS, &limit) < 0)
852     return 77;
853 #endif
854   /* Some printf implementations allocate temporary space on the stack.  */
855 #ifdef RLIMIT_STACK
856   if (getrlimit (RLIMIT_STACK, &limit) < 0)
857     return 77;
858   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
859     limit.rlim_max = 5000000;
860   limit.rlim_cur = limit.rlim_max;
861   if (setrlimit (RLIMIT_STACK, &limit) < 0)
862     return 77;
863 #endif
864   ret = printf ("%.5000000f", 1.0);
865   return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
866 }
867 changequote([,])dnl
868           ])])
869         if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
870           (./conftest
871            result=$?
872            if test $result != 0 && test $result != 77; then result=1; fi
873            exit $result
874           ) >/dev/null 2>/dev/null
875           case $? in
876             0) gl_cv_func_printf_enomem="yes" ;;
877             77) gl_cv_func_printf_enomem="guessing no" ;;
878             *) gl_cv_func_printf_enomem="no" ;;
879           esac
880         else
881           gl_cv_func_printf_enomem="guessing no"
882         fi
883         rm -fr conftest*
884       fi
885       if test "$gl_cv_func_printf_enomem" = "guessing no"; then
886 changequote(,)dnl
887         case "$host_os" in
888                     # Guess yes on glibc systems.
889           *-gnu*)   gl_cv_func_printf_enomem="guessing yes";;
890                     # Guess yes on Solaris.
891           solaris*) gl_cv_func_printf_enomem="guessing yes";;
892                     # Guess yes on AIX.
893           aix*)     gl_cv_func_printf_enomem="guessing yes";;
894                     # Guess yes on HP-UX/hppa.
895           hpux*)    case "$host_cpu" in
896                       hppa*) gl_cv_func_printf_enomem="guessing yes";;
897                       *)     gl_cv_func_printf_enomem="guessing no";;
898                     esac
899                     ;;
900                     # Guess yes on IRIX.
901           irix*)    gl_cv_func_printf_enomem="guessing yes";;
902                     # Guess yes on OSF/1.
903           osf*)     gl_cv_func_printf_enomem="guessing yes";;
904                     # Guess yes on BeOS.
905           beos*)    gl_cv_func_printf_enomem="guessing yes";;
906                     # Guess yes on Haiku.
907           haiku*)   gl_cv_func_printf_enomem="guessing yes";;
908                     # If we don't know, assume the worst.
909           *)        gl_cv_func_printf_enomem="guessing no";;
910         esac
911 changequote([,])dnl
912       fi
913     ])
914 ])
915
916 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
917 dnl Result is ac_cv_func_snprintf.
918
919 AC_DEFUN([gl_SNPRINTF_PRESENCE],
920 [
921   AC_CHECK_FUNCS_ONCE([snprintf])
922 ])
923
924 dnl Test whether the string produced by the snprintf function is always NUL
925 dnl terminated. (ISO C99, POSIX:2001)
926 dnl Result is gl_cv_func_snprintf_truncation_c99.
927
928 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
929 [
930   AC_REQUIRE([AC_PROG_CC])
931   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
932   AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
933     [gl_cv_func_snprintf_truncation_c99],
934     [
935       AC_TRY_RUN([
936 #include <stdio.h>
937 #include <string.h>
938 static char buf[100];
939 int main ()
940 {
941   strcpy (buf, "ABCDEF");
942   snprintf (buf, 3, "%d %d", 4567, 89);
943   if (memcmp (buf, "45\0DEF", 6) != 0)
944     return 1;
945   return 0;
946 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
947       [
948 changequote(,)dnl
949        case "$host_os" in
950                                # Guess yes on glibc systems.
951          *-gnu*)               gl_cv_func_snprintf_truncation_c99="guessing yes";;
952                                # Guess yes on FreeBSD >= 5.
953          freebsd[1-4]*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
954          freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
955                                # Guess yes on MacOS X >= 10.3.
956          darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
957          darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
958                                # Guess yes on OpenBSD >= 3.9.
959          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
960                                gl_cv_func_snprintf_truncation_c99="guessing no";;
961          openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
962                                # Guess yes on Solaris >= 2.6.
963          solaris2.[0-5]*)      gl_cv_func_snprintf_truncation_c99="guessing no";;
964          solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
965                                # Guess yes on AIX >= 4.
966          aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
967          aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
968                                # Guess yes on HP-UX >= 11.
969          hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
970          hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
971                                # Guess yes on IRIX >= 6.5.
972          irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
973                                # Guess yes on OSF/1 >= 5.
974          osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
975          osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
976                                # Guess yes on NetBSD >= 3.
977          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
978                                gl_cv_func_snprintf_truncation_c99="guessing no";;
979          netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
980                                # Guess yes on BeOS.
981          beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
982                                # If we don't know, assume the worst.
983          *)                    gl_cv_func_snprintf_truncation_c99="guessing no";;
984        esac
985 changequote([,])dnl
986       ])
987     ])
988 ])
989
990 dnl Test whether the return value of the snprintf function is the number
991 dnl of bytes (excluding the terminating NUL) that would have been produced
992 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
993 dnl For example, this test program fails on IRIX 6.5:
994 dnl     ---------------------------------------------------------------------
995 dnl     #include <stdio.h>
996 dnl     int main()
997 dnl     {
998 dnl       static char buf[8];
999 dnl       int retval = snprintf (buf, 3, "%d", 12345);
1000 dnl       return retval >= 0 && retval < 3;
1001 dnl     }
1002 dnl     ---------------------------------------------------------------------
1003 dnl Result is gl_cv_func_snprintf_retval_c99.
1004
1005 AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
1006 [
1007   AC_REQUIRE([AC_PROG_CC])
1008   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1009   AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
1010     [gl_cv_func_snprintf_retval_c99],
1011     [
1012       AC_TRY_RUN([
1013 #include <stdio.h>
1014 #include <string.h>
1015 static char buf[100];
1016 int main ()
1017 {
1018   strcpy (buf, "ABCDEF");
1019   if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
1020     return 1;
1021   return 0;
1022 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
1023       [
1024 changequote(,)dnl
1025        case "$host_os" in
1026                                # Guess yes on glibc systems.
1027          *-gnu*)               gl_cv_func_snprintf_retval_c99="guessing yes";;
1028                                # Guess yes on FreeBSD >= 5.
1029          freebsd[1-4]*)        gl_cv_func_snprintf_retval_c99="guessing no";;
1030          freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1031                                # Guess yes on MacOS X >= 10.3.
1032          darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
1033          darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
1034                                # Guess yes on OpenBSD >= 3.9.
1035          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1036                                gl_cv_func_snprintf_retval_c99="guessing no";;
1037          openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
1038                                # Guess yes on Solaris >= 2.6.
1039          solaris2.[0-5]*)      gl_cv_func_snprintf_retval_c99="guessing no";;
1040          solaris*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
1041                                # Guess yes on AIX >= 4.
1042          aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
1043          aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
1044                                # Guess yes on NetBSD >= 3.
1045          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1046                                gl_cv_func_snprintf_retval_c99="guessing no";;
1047          netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
1048                                # Guess yes on BeOS.
1049          beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
1050                                # If we don't know, assume the worst.
1051          *)                    gl_cv_func_snprintf_retval_c99="guessing no";;
1052        esac
1053 changequote([,])dnl
1054       ])
1055     ])
1056 ])
1057
1058 dnl Test whether the snprintf function supports the %n format directive
1059 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1060 dnl Result is gl_cv_func_snprintf_directive_n.
1061
1062 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1063 [
1064   AC_REQUIRE([AC_PROG_CC])
1065   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1066   AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1067     [gl_cv_func_snprintf_directive_n],
1068     [
1069       AC_TRY_RUN([
1070 #include <stdio.h>
1071 #include <string.h>
1072 static char fmtstring[10];
1073 static char buf[100];
1074 int main ()
1075 {
1076   int count = -1;
1077   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
1078      support %n in format strings in read-only memory but not in writable
1079      memory.  */
1080   strcpy (fmtstring, "%d %n");
1081   snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1082   if (count != 6)
1083     return 1;
1084   return 0;
1085 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
1086       [
1087 changequote(,)dnl
1088        case "$host_os" in
1089                                # Guess yes on glibc systems.
1090          *-gnu*)               gl_cv_func_snprintf_directive_n="guessing yes";;
1091                                # Guess yes on FreeBSD >= 5.
1092          freebsd[1-4]*)        gl_cv_func_snprintf_directive_n="guessing no";;
1093          freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1094                                # Guess yes on MacOS X >= 10.3.
1095          darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
1096          darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1097                                # Guess yes on Solaris >= 2.6.
1098          solaris2.[0-5]*)      gl_cv_func_snprintf_directive_n="guessing no";;
1099          solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
1100                                # Guess yes on AIX >= 4.
1101          aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1102          aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1103                                # Guess yes on IRIX >= 6.5.
1104          irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
1105                                # Guess yes on OSF/1 >= 5.
1106          osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1107          osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1108                                # Guess yes on NetBSD >= 3.
1109          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1110                                gl_cv_func_snprintf_directive_n="guessing no";;
1111          netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1112                                # Guess yes on BeOS.
1113          beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
1114                                # If we don't know, assume the worst.
1115          *)                    gl_cv_func_snprintf_directive_n="guessing no";;
1116        esac
1117 changequote([,])dnl
1118       ])
1119     ])
1120 ])
1121
1122 dnl Test whether the snprintf function, when passed a size = 1, writes any
1123 dnl output without bounds in this case, behaving like sprintf. This is the
1124 dnl case on Linux libc5.
1125 dnl Result is gl_cv_func_snprintf_size1.
1126
1127 AC_DEFUN([gl_SNPRINTF_SIZE1],
1128 [
1129   AC_REQUIRE([AC_PROG_CC])
1130   AC_CACHE_CHECK([whether snprintf respects a size of 1],
1131     [gl_cv_func_snprintf_size1],
1132     [
1133       AC_TRY_RUN([
1134 #include <stdio.h>
1135 int main()
1136 {
1137   static char buf[8] = "DEADBEEF";
1138   snprintf (buf, 1, "%d", 12345);
1139   return buf[1] != 'E';
1140 }],
1141       [gl_cv_func_snprintf_size1=yes],
1142       [gl_cv_func_snprintf_size1=no],
1143       [gl_cv_func_snprintf_size1="guessing yes"])
1144     ])
1145 ])
1146
1147 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1148 dnl output. (ISO C99, POSIX:2001)
1149 dnl For example, snprintf nevertheless writes a NUL byte in this case
1150 dnl on OSF/1 5.1:
1151 dnl     ---------------------------------------------------------------------
1152 dnl     #include <stdio.h>
1153 dnl     int main()
1154 dnl     {
1155 dnl       static char buf[8] = "DEADBEEF";
1156 dnl       snprintf (buf, 0, "%d", 12345);
1157 dnl       return buf[0] != 'D';
1158 dnl     }
1159 dnl     ---------------------------------------------------------------------
1160 dnl And vsnprintf writes any output without bounds in this case, behaving like
1161 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1162 dnl     ---------------------------------------------------------------------
1163 dnl     #include <stdarg.h>
1164 dnl     #include <stdio.h>
1165 dnl     static int my_snprintf (char *buf, int size, const char *format, ...)
1166 dnl     {
1167 dnl       va_list args;
1168 dnl       int ret;
1169 dnl       va_start (args, format);
1170 dnl       ret = vsnprintf (buf, size, format, args);
1171 dnl       va_end (args);
1172 dnl       return ret;
1173 dnl     }
1174 dnl     int main()
1175 dnl     {
1176 dnl       static char buf[8] = "DEADBEEF";
1177 dnl       my_snprintf (buf, 0, "%d", 12345);
1178 dnl       return buf[0] != 'D';
1179 dnl     }
1180 dnl     ---------------------------------------------------------------------
1181 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1182
1183 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1184 [
1185   AC_REQUIRE([AC_PROG_CC])
1186   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1187   AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1188     [gl_cv_func_vsnprintf_zerosize_c99],
1189     [
1190       AC_TRY_RUN([
1191 #include <stdarg.h>
1192 #include <stdio.h>
1193 static int my_snprintf (char *buf, int size, const char *format, ...)
1194 {
1195   va_list args;
1196   int ret;
1197   va_start (args, format);
1198   ret = vsnprintf (buf, size, format, args);
1199   va_end (args);
1200   return ret;
1201 }
1202 int main()
1203 {
1204   static char buf[8] = "DEADBEEF";
1205   my_snprintf (buf, 0, "%d", 12345);
1206   return buf[0] != 'D';
1207 }],
1208       [gl_cv_func_vsnprintf_zerosize_c99=yes],
1209       [gl_cv_func_vsnprintf_zerosize_c99=no],
1210       [
1211 changequote(,)dnl
1212        case "$host_os" in
1213                                # Guess yes on glibc systems.
1214          *-gnu*)               gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1215                                # Guess yes on FreeBSD >= 5.
1216          freebsd[1-4]*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1217          freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1218                                # Guess yes on MacOS X >= 10.3.
1219          darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1220          darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1221                                # Guess yes on Cygwin.
1222          cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1223                                # Guess yes on Solaris >= 2.6.
1224          solaris2.[0-5]*)      gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1225          solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1226                                # Guess yes on AIX >= 4.
1227          aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1228          aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1229                                # Guess yes on IRIX >= 6.5.
1230          irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1231                                # Guess yes on NetBSD >= 3.
1232          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1233                                gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1234          netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1235                                # Guess yes on BeOS.
1236          beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1237                                # Guess yes on mingw.
1238          mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1239                                # If we don't know, assume the worst.
1240          *)                    gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1241        esac
1242 changequote([,])dnl
1243       ])
1244     ])
1245 ])
1246
1247 dnl The results of these tests on various platforms are:
1248 dnl
1249 dnl 1 = gl_PRINTF_SIZES_C99
1250 dnl 2 = gl_PRINTF_LONG_DOUBLE
1251 dnl 3 = gl_PRINTF_INFINITE
1252 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1253 dnl 5 = gl_PRINTF_DIRECTIVE_A
1254 dnl 6 = gl_PRINTF_DIRECTIVE_F
1255 dnl 7 = gl_PRINTF_DIRECTIVE_N
1256 dnl 8 = gl_PRINTF_POSITIONS
1257 dnl 9 = gl_PRINTF_FLAG_GROUPING
1258 dnl 10 = gl_PRINTF_FLAG_LEFTADJUST
1259 dnl 11 = gl_PRINTF_FLAG_ZERO
1260 dnl 12 = gl_PRINTF_PRECISION
1261 dnl 13 = gl_PRINTF_ENOMEM
1262 dnl 14 = gl_SNPRINTF_PRESENCE
1263 dnl 15 = gl_SNPRINTF_TRUNCATION_C99
1264 dnl 16 = gl_SNPRINTF_RETVAL_C99
1265 dnl 17 = gl_SNPRINTF_DIRECTIVE_N
1266 dnl 18 = gl_SNPRINTF_SIZE1
1267 dnl 19 = gl_VSNPRINTF_ZEROSIZE_C99
1268 dnl
1269 dnl 1 = checking whether printf supports size specifiers as in C99...
1270 dnl 2 = checking whether printf supports 'long double' arguments...
1271 dnl 3 = checking whether printf supports infinite 'double' arguments...
1272 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1273 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1274 dnl 6 = checking whether printf supports the 'F' directive...
1275 dnl 7 = checking whether printf supports the 'n' directive...
1276 dnl 8 = checking whether printf supports POSIX/XSI format strings with positions...
1277 dnl 9 = checking whether printf supports the grouping flag...
1278 dnl 10 = checking whether printf supports the left-adjust flag correctly...
1279 dnl 11 = checking whether printf supports the zero flag correctly...
1280 dnl 12 = checking whether printf supports large precisions...
1281 dnl 13 = checking whether printf survives out-of-memory conditions...
1282 dnl 14 = checking for snprintf...
1283 dnl 15 = checking whether snprintf truncates the result as in C99...
1284 dnl 16 = checking whether snprintf returns a byte count as in C99...
1285 dnl 17 = checking whether snprintf fully supports the 'n' directive...
1286 dnl 18 = checking whether snprintf respects a size of 1...
1287 dnl 19 = checking whether vsnprintf respects a zero size as in C99...
1288 dnl
1289 dnl . = yes, # = no.
1290 dnl
1291 dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
1292 dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
1293 dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  .  .  .  .  .  .
1294 dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  .  #  .  #  .  .  .  .  .  .
1295 dnl   MacOS X 10.3.9                 .  .  .  .  #  .  .  .  .  .  #  .  #  .  .  .  .  .  .
1296 dnl   OpenBSD 3.9, 4.0               .  .  #  #  #  #  .  .  #  .  #  .  #  .  .  .  .  .  .
1297 dnl   Cygwin 2007 (= Cygwin 1.5.24)  .  .  .  .  #  #  .  .  .  ?  #  ?  ?  .  .  .  .  .  .
1298 dnl   Cygwin 2006 (= Cygwin 1.5.19)  #  .  .  .  #  #  .  .  #  ?  #  ?  ?  .  .  .  .  .  .
1299 dnl   Solaris 10                     .  .  #  #  #  .  .  .  .  .  #  .  .  .  .  .  .  .  .
1300 dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  .  .  .  #  .  .  .  .  .  .  .  .
1301 dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  .  .  .  #  .  .  #  #  #  #  #  #
1302 dnl   AIX 5.2                        .  .  #  #  #  .  .  .  .  .  #  .  .  .  .  .  .  .  .
1303 dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  .  #  .  .  .  .  .  .  .  .
1304 dnl   HP-UX 11.31                    .  .  .  .  #  .  .  .  .  .  #  .  .  .  .  #  #  .  .
1305 dnl   HP-UX 11.{00,11,23}            #  .  .  .  #  #  .  .  .  .  #  .  .  .  .  #  #  .  #
1306 dnl   HP-UX 10.20                    #  .  .  .  #  #  .  .  .  #  #  .  .  .  .  #  #  ?  #
1307 dnl   IRIX 6.5                       #  .  #  #  #  #  .  .  .  .  #  .  .  .  .  #  .  .  .
1308 dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  .  #  .  .  .  .  #  .  .  #
1309 dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  .  #  .  .  #  #  #  #  #  #
1310 dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  .  ?  ?  ?  ?  ?  .  .  .  ?  ?  ?
1311 dnl   NetBSD 3.0                     .  .  .  .  #  #  .  #  #  ?  #  .  #  .  .  .  .  .  .
1312 dnl   Haiku                          .  .  .  #  #  #  .  .  .  .  .  .  ?  .  .  .  .  .  .
1313 dnl   BeOS                           #  #  .  #  #  #  .  #  .  ?  .  #  ?  .  .  .  .  .  .
1314 dnl   mingw                          #  #  #  #  #  #  .  #  #  .  #  #  ?  .  #  #  #  .  .