Avoid a crash of a configure test on some x86_64 systems.
[pspp] / m4 / printf.m4
1 # printf.m4 serial 21
2 dnl Copyright (C) 2003, 2007 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 padding of non-finite
688 dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
689 dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
690 dnl Result is gl_cv_func_printf_flag_zero.
691
692 AC_DEFUN([gl_PRINTF_FLAG_ZERO],
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 zero flag correctly],
697     [gl_cv_func_printf_flag_zero],
698     [
699       AC_TRY_RUN([
700 #include <stdio.h>
701 #include <string.h>
702 static char buf[100];
703 int main ()
704 {
705   if (sprintf (buf, "%010f", 1.0 / 0.0, 33, 44, 55) < 0
706       || (strcmp (buf, "       inf") != 0
707           && strcmp (buf, "  infinity") != 0))
708     return 1;
709   return 0;
710 }], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no],
711       [
712 changequote(,)dnl
713        case "$host_os" in
714                  # Guess yes on glibc systems.
715          *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
716                  # Guess yes on BeOS.
717          beos*)  gl_cv_func_printf_flag_zero="guessing yes";;
718                  # If we don't know, assume the worst.
719          *)      gl_cv_func_printf_flag_zero="guessing no";;
720        esac
721 changequote([,])dnl
722       ])
723     ])
724 ])
725
726 dnl Test whether the *printf family of functions supports large precisions.
727 dnl On mingw, precisions larger than 512 are treated like 512, in integer,
728 dnl floating-point or pointer output. On BeOS, precisions larger than 1044
729 dnl crash the program.
730 dnl Result is gl_cv_func_printf_precision.
731
732 AC_DEFUN([gl_PRINTF_PRECISION],
733 [
734   AC_REQUIRE([AC_PROG_CC])
735   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
736   AC_CACHE_CHECK([whether printf supports large precisions],
737     [gl_cv_func_printf_precision],
738     [
739       AC_TRY_RUN([
740 #include <stdio.h>
741 #include <string.h>
742 static char buf[5000];
743 int main ()
744 {
745 #ifdef __BEOS__
746   /* On BeOS, this would crash and show a dialog box.  Avoid the crash.  */
747   return 1;
748 #endif
749   if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
750     return 1;
751   return 0;
752 }], [gl_cv_func_printf_precision=yes], [gl_cv_func_printf_precision=no],
753       [
754 changequote(,)dnl
755        case "$host_os" in
756          # Guess no only on native Win32 and BeOS systems.
757          mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
758          beos*)        gl_cv_func_printf_precision="guessing no" ;;
759          *)            gl_cv_func_printf_precision="guessing yes" ;;
760        esac
761 changequote([,])dnl
762       ])
763     ])
764 ])
765
766 dnl Test whether the *printf family of functions recovers gracefully in case
767 dnl of an out-of-memory condition, or whether it crashes the entire program.
768 dnl Result is gl_cv_func_printf_enomem.
769
770 AC_DEFUN([gl_PRINTF_ENOMEM],
771 [
772   AC_REQUIRE([AC_PROG_CC])
773   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
774   AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
775     [gl_cv_func_printf_enomem],
776     [
777       if test "$cross_compiling" = no; then
778         AC_LANG_CONFTEST([AC_LANG_SOURCE([
779 ]GL_NOCRASH[
780 changequote(,)dnl
781 #include <stdio.h>
782 #include <sys/types.h>
783 #include <sys/time.h>
784 #include <sys/resource.h>
785 #include <errno.h>
786 int main()
787 {
788   struct rlimit limit;
789   int ret;
790   nocrash_init ();
791   /* Some printf implementations allocate temporary space with malloc.  */
792   /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
793 #ifdef RLIMIT_DATA
794   if (getrlimit (RLIMIT_DATA, &limit) < 0)
795     return 77;
796   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
797     limit.rlim_max = 5000000;
798   limit.rlim_cur = limit.rlim_max;
799   if (setrlimit (RLIMIT_DATA, &limit) < 0)
800     return 77;
801 #endif
802   /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
803 #ifdef RLIMIT_AS
804   if (getrlimit (RLIMIT_AS, &limit) < 0)
805     return 77;
806   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
807     limit.rlim_max = 5000000;
808   limit.rlim_cur = limit.rlim_max;
809   if (setrlimit (RLIMIT_AS, &limit) < 0)
810     return 77;
811 #endif
812   /* Some printf implementations allocate temporary space on the stack.  */
813 #ifdef RLIMIT_STACK
814   if (getrlimit (RLIMIT_STACK, &limit) < 0)
815     return 77;
816   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
817     limit.rlim_max = 5000000;
818   limit.rlim_cur = limit.rlim_max;
819   if (setrlimit (RLIMIT_STACK, &limit) < 0)
820     return 77;
821 #endif
822   ret = printf ("%.5000000f", 1.0);
823   return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
824 }
825 changequote([,])dnl
826           ])])
827         if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
828           (./conftest
829            result=$?
830            if test $result != 0 && test $result != 77; then result=1; fi
831            exit $result
832           ) >/dev/null 2>/dev/null
833           case $? in
834             0) gl_cv_func_printf_enomem="yes" ;;
835             77) gl_cv_func_printf_enomem="guessing no" ;;
836             *) gl_cv_func_printf_enomem="no" ;;
837           esac
838         else
839           gl_cv_func_printf_enomem="guessing no"
840         fi
841         rm -fr conftest*
842       else
843 changequote(,)dnl
844         case "$host_os" in
845                     # Guess yes on glibc systems.
846           *-gnu*)   gl_cv_func_printf_enomem="guessing yes";;
847                     # Guess yes on Solaris.
848           solaris*) gl_cv_func_printf_enomem="guessing yes";;
849                     # Guess yes on AIX.
850           aix*)     gl_cv_func_printf_enomem="guessing yes";;
851                     # Guess yes on HP-UX/hppa.
852           hpux*)    case "$host_cpu" in
853                       hppa*) gl_cv_func_printf_enomem="guessing yes";;
854                       *)     gl_cv_func_printf_enomem="guessing no";;
855                     esac
856                     ;;
857                     # Guess yes on IRIX.
858           irix*)    gl_cv_func_printf_enomem="guessing yes";;
859                     # Guess yes on OSF/1.
860           osf*)     gl_cv_func_printf_enomem="guessing yes";;
861                     # Guess yes on BeOS.
862           beos*)    gl_cv_func_printf_enomem="guessing yes";;
863                     # If we don't know, assume the worst.
864           *)        gl_cv_func_printf_enomem="guessing no";;
865         esac
866 changequote([,])dnl
867       fi
868     ])
869 ])
870
871 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
872 dnl Result is ac_cv_func_snprintf.
873
874 AC_DEFUN([gl_SNPRINTF_PRESENCE],
875 [
876   AC_CHECK_FUNCS_ONCE([snprintf])
877 ])
878
879 dnl Test whether the string produced by the snprintf function is always NUL
880 dnl terminated. (ISO C99, POSIX:2001)
881 dnl Result is gl_cv_func_snprintf_truncation_c99.
882
883 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
884 [
885   AC_REQUIRE([AC_PROG_CC])
886   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
887   AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
888     [gl_cv_func_snprintf_truncation_c99],
889     [
890       AC_TRY_RUN([
891 #include <stdio.h>
892 #include <string.h>
893 static char buf[100];
894 int main ()
895 {
896   strcpy (buf, "ABCDEF");
897   snprintf (buf, 3, "%d %d", 4567, 89);
898   if (memcmp (buf, "45\0DEF", 6) != 0)
899     return 1;
900   return 0;
901 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
902       [
903 changequote(,)dnl
904        case "$host_os" in
905                                # Guess yes on glibc systems.
906          *-gnu*)               gl_cv_func_snprintf_truncation_c99="guessing yes";;
907                                # Guess yes on FreeBSD >= 5.
908          freebsd[1-4]*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
909          freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
910                                # Guess yes on MacOS X >= 10.3.
911          darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
912          darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
913                                # Guess yes on OpenBSD >= 3.9.
914          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
915                                gl_cv_func_snprintf_truncation_c99="guessing no";;
916          openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
917                                # Guess yes on Solaris >= 2.6.
918          solaris2.[0-5]*)      gl_cv_func_snprintf_truncation_c99="guessing no";;
919          solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
920                                # Guess yes on AIX >= 4.
921          aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
922          aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
923                                # Guess yes on HP-UX >= 11.
924          hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
925          hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
926                                # Guess yes on IRIX >= 6.5.
927          irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
928                                # Guess yes on OSF/1 >= 5.
929          osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
930          osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
931                                # Guess yes on NetBSD >= 3.
932          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
933                                gl_cv_func_snprintf_truncation_c99="guessing no";;
934          netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
935                                # Guess yes on BeOS.
936          beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
937                                # If we don't know, assume the worst.
938          *)                    gl_cv_func_snprintf_truncation_c99="guessing no";;
939        esac
940 changequote([,])dnl
941       ])
942     ])
943 ])
944
945 dnl Test whether the return value of the snprintf function is the number
946 dnl of bytes (excluding the terminating NUL) that would have been produced
947 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
948 dnl For example, this test program fails on IRIX 6.5:
949 dnl     ---------------------------------------------------------------------
950 dnl     #include <stdio.h>
951 dnl     int main()
952 dnl     {
953 dnl       static char buf[8];
954 dnl       int retval = snprintf (buf, 3, "%d", 12345);
955 dnl       return retval >= 0 && retval < 3;
956 dnl     }
957 dnl     ---------------------------------------------------------------------
958 dnl Result is gl_cv_func_snprintf_retval_c99.
959
960 AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
961 [
962   AC_REQUIRE([AC_PROG_CC])
963   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
964   AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
965     [gl_cv_func_snprintf_retval_c99],
966     [
967       AC_TRY_RUN([
968 #include <stdio.h>
969 #include <string.h>
970 static char buf[100];
971 int main ()
972 {
973   strcpy (buf, "ABCDEF");
974   if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
975     return 1;
976   return 0;
977 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
978       [
979 changequote(,)dnl
980        case "$host_os" in
981                                # Guess yes on glibc systems.
982          *-gnu*)               gl_cv_func_snprintf_retval_c99="guessing yes";;
983                                # Guess yes on FreeBSD >= 5.
984          freebsd[1-4]*)        gl_cv_func_snprintf_retval_c99="guessing no";;
985          freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
986                                # Guess yes on MacOS X >= 10.3.
987          darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
988          darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
989                                # Guess yes on OpenBSD >= 3.9.
990          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
991                                gl_cv_func_snprintf_retval_c99="guessing no";;
992          openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
993                                # Guess yes on Solaris >= 2.6.
994          solaris2.[0-5]*)      gl_cv_func_snprintf_retval_c99="guessing no";;
995          solaris*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
996                                # Guess yes on AIX >= 4.
997          aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
998          aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
999                                # Guess yes on NetBSD >= 3.
1000          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1001                                gl_cv_func_snprintf_retval_c99="guessing no";;
1002          netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
1003                                # Guess yes on BeOS.
1004          beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
1005                                # If we don't know, assume the worst.
1006          *)                    gl_cv_func_snprintf_retval_c99="guessing no";;
1007        esac
1008 changequote([,])dnl
1009       ])
1010     ])
1011 ])
1012
1013 dnl Test whether the snprintf function supports the %n format directive
1014 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1015 dnl Result is gl_cv_func_snprintf_directive_n.
1016
1017 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1018 [
1019   AC_REQUIRE([AC_PROG_CC])
1020   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1021   AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1022     [gl_cv_func_snprintf_directive_n],
1023     [
1024       AC_TRY_RUN([
1025 #include <stdio.h>
1026 #include <string.h>
1027 static char fmtstring[10];
1028 static char buf[100];
1029 int main ()
1030 {
1031   int count = -1;
1032   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
1033      support %n in format strings in read-only memory but not in writable
1034      memory.  */
1035   strcpy (fmtstring, "%d %n");
1036   snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1037   if (count != 6)
1038     return 1;
1039   return 0;
1040 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
1041       [
1042 changequote(,)dnl
1043        case "$host_os" in
1044                                # Guess yes on glibc systems.
1045          *-gnu*)               gl_cv_func_snprintf_directive_n="guessing yes";;
1046                                # Guess yes on FreeBSD >= 5.
1047          freebsd[1-4]*)        gl_cv_func_snprintf_directive_n="guessing no";;
1048          freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1049                                # Guess yes on MacOS X >= 10.3.
1050          darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
1051          darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1052                                # Guess yes on Solaris >= 2.6.
1053          solaris2.[0-5]*)      gl_cv_func_snprintf_directive_n="guessing no";;
1054          solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
1055                                # Guess yes on AIX >= 4.
1056          aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1057          aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1058                                # Guess yes on IRIX >= 6.5.
1059          irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
1060                                # Guess yes on OSF/1 >= 5.
1061          osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1062          osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1063                                # Guess yes on NetBSD >= 3.
1064          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1065                                gl_cv_func_snprintf_directive_n="guessing no";;
1066          netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1067                                # Guess yes on BeOS.
1068          beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
1069                                # If we don't know, assume the worst.
1070          *)                    gl_cv_func_snprintf_directive_n="guessing no";;
1071        esac
1072 changequote([,])dnl
1073       ])
1074     ])
1075 ])
1076
1077 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1078 dnl output. (ISO C99, POSIX:2001)
1079 dnl For example, snprintf nevertheless writes a NUL byte in this case
1080 dnl on OSF/1 5.1:
1081 dnl     ---------------------------------------------------------------------
1082 dnl     #include <stdio.h>
1083 dnl     int main()
1084 dnl     {
1085 dnl       static char buf[8] = "DEADBEEF";
1086 dnl       snprintf (buf, 0, "%d", 12345);
1087 dnl       return buf[0] != 'D';
1088 dnl     }
1089 dnl     ---------------------------------------------------------------------
1090 dnl And vsnprintf writes any output without bounds in this case, behaving like
1091 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1092 dnl     ---------------------------------------------------------------------
1093 dnl     #include <stdarg.h>
1094 dnl     #include <stdio.h>
1095 dnl     static int my_snprintf (char *buf, int size, const char *format, ...)
1096 dnl     {
1097 dnl       va_list args;
1098 dnl       int ret;
1099 dnl       va_start (args, format);
1100 dnl       ret = vsnprintf (buf, size, format, args);
1101 dnl       va_end (args);
1102 dnl       return ret;
1103 dnl     }
1104 dnl     int main()
1105 dnl     {
1106 dnl       static char buf[8] = "DEADBEEF";
1107 dnl       my_snprintf (buf, 0, "%d", 12345);
1108 dnl       return buf[0] != 'D';
1109 dnl     }
1110 dnl     ---------------------------------------------------------------------
1111 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1112
1113 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1114 [
1115   AC_REQUIRE([AC_PROG_CC])
1116   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1117   AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1118     [gl_cv_func_vsnprintf_zerosize_c99],
1119     [
1120       AC_TRY_RUN([
1121 #include <stdarg.h>
1122 #include <stdio.h>
1123 static int my_snprintf (char *buf, int size, const char *format, ...)
1124 {
1125   va_list args;
1126   int ret;
1127   va_start (args, format);
1128   ret = vsnprintf (buf, size, format, args);
1129   va_end (args);
1130   return ret;
1131 }
1132 int main()
1133 {
1134   static char buf[8] = "DEADBEEF";
1135   my_snprintf (buf, 0, "%d", 12345);
1136   return buf[0] != 'D';
1137 }],
1138       [gl_cv_func_vsnprintf_zerosize_c99=yes],
1139       [gl_cv_func_vsnprintf_zerosize_c99=no],
1140       [
1141 changequote(,)dnl
1142        case "$host_os" in
1143                                # Guess yes on glibc systems.
1144          *-gnu*)               gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1145                                # Guess yes on FreeBSD >= 5.
1146          freebsd[1-4]*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1147          freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1148                                # Guess yes on MacOS X >= 10.3.
1149          darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1150          darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1151                                # Guess yes on Cygwin.
1152          cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1153                                # Guess yes on Solaris >= 2.6.
1154          solaris2.[0-5]*)      gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1155          solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1156                                # Guess yes on AIX >= 4.
1157          aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1158          aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1159                                # Guess yes on IRIX >= 6.5.
1160          irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1161                                # Guess yes on NetBSD >= 3.
1162          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1163                                gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1164          netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1165                                # Guess yes on BeOS.
1166          beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1167                                # Guess yes on mingw.
1168          mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1169                                # If we don't know, assume the worst.
1170          *)                    gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1171        esac
1172 changequote([,])dnl
1173       ])
1174     ])
1175 ])
1176
1177 dnl The results of these tests on various platforms are:
1178 dnl
1179 dnl 1 = gl_PRINTF_SIZES_C99
1180 dnl 2 = gl_PRINTF_LONG_DOUBLE
1181 dnl 3 = gl_PRINTF_INFINITE
1182 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1183 dnl 5 = gl_PRINTF_DIRECTIVE_A
1184 dnl 6 = gl_PRINTF_DIRECTIVE_F
1185 dnl 7 = gl_PRINTF_DIRECTIVE_N
1186 dnl 8 = gl_PRINTF_POSITIONS
1187 dnl 9 = gl_PRINTF_FLAG_GROUPING
1188 dnl 10 = gl_PRINTF_FLAG_ZERO
1189 dnl 11 = gl_PRINTF_PRECISION
1190 dnl 12 = gl_PRINTF_ENOMEM
1191 dnl 13 = gl_SNPRINTF_PRESENCE
1192 dnl 14 = gl_SNPRINTF_TRUNCATION_C99
1193 dnl 15 = gl_SNPRINTF_RETVAL_C99
1194 dnl 16 = gl_SNPRINTF_DIRECTIVE_N
1195 dnl 17 = gl_VSNPRINTF_ZEROSIZE_C99
1196 dnl
1197 dnl 1 = checking whether printf supports size specifiers as in C99...
1198 dnl 2 = checking whether printf supports 'long double' arguments...
1199 dnl 3 = checking whether printf supports infinite 'double' arguments...
1200 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1201 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1202 dnl 6 = checking whether printf supports the 'F' directive...
1203 dnl 7 = checking whether printf supports the 'n' directive...
1204 dnl 8 = checking whether printf supports POSIX/XSI format strings with positions...
1205 dnl 9 = checking whether printf supports the grouping flag...
1206 dnl 10 = checking whether printf supports the zero flag correctly...
1207 dnl 11 = checking whether printf supports large precisions...
1208 dnl 12 = checking whether printf survives out-of-memory conditions...
1209 dnl 13 = checking for snprintf...
1210 dnl 14 = checking whether snprintf truncates the result as in C99...
1211 dnl 15 = checking whether snprintf returns a byte count as in C99...
1212 dnl 16 = checking whether snprintf fully supports the 'n' directive...
1213 dnl 17 = checking whether vsnprintf respects a zero size as in C99...
1214 dnl
1215 dnl . = yes, # = no.
1216 dnl
1217 dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17
1218 dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
1219 dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  .  .  .  .
1220 dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  #  .  #  .  .  .  .  .
1221 dnl   MacOS X 10.3.9                 .  .  .  .  #  .  .  .  .  #  .  #  .  .  .  .  .
1222 dnl   OpenBSD 3.9, 4.0               .  ?  ?  ?  #  ?  .  .  ?  ?  ?  ?  .  .  .  ?  ?
1223 dnl   Cygwin 2007 (= Cygwin 1.5.24)  .  .  .  .  #  #  .  .  .  #  ?  ?  .  .  .  .  .
1224 dnl   Cygwin 2006 (= Cygwin 1.5.19)  #  .  .  .  #  #  .  .  #  #  ?  ?  .  .  .  .  .
1225 dnl   Solaris 10                     .  .  #  #  #  .  .  .  .  #  .  .  .  .  .  .  .
1226 dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  .  .  #  .  .  .  .  .  .  .
1227 dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  .  .  #  .  .  #  #  #  #  #
1228 dnl   AIX 5.2                        .  .  #  #  #  .  .  .  .  #  .  .  .  .  .  .  .
1229 dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  #  .  .  .  .  .  .  .
1230 dnl   HP-UX 11.31                    .  .  .  .  #  .  .  .  .  #  .  .  .  .  #  #  .
1231 dnl   HP-UX 10.20, 11.{00,11,23}     #  .  .  .  #  #  .  .  .  #  .  .  .  .  #  #  #
1232 dnl   IRIX 6.5                       #  .  #  #  #  #  .  .  .  #  .  .  .  .  #  .  .
1233 dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  #  .  .  .  .  #  .  #
1234 dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  #  .  .  #  #  #  #  #
1235 dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  .  ?  ?  ?  ?  .  .  .  ?  ?
1236 dnl   NetBSD 3.0                     .  .  .  .  #  #  .  #  #  #  .  #  .  .  .  .  .
1237 dnl   BeOS                           #  #  .  #  #  #  .  #  .  .  #  ?  .  .  .  .  .
1238 dnl   mingw                          #  #  #  #  #  #  .  #  #  #  #  ?  .  #  #  #  .