Fix *printf behaviour in out-of-memory situations on MacOS X and *BSD.
[gnulib.git] / m4 / printf.m4
1 # printf.m4 serial 18
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 #include <float.h>
244 #include <stdio.h>
245 #include <string.h>
246 static int
247 strisnan (const char *string, size_t start_index, size_t end_index)
248 {
249   if (start_index < end_index)
250     {
251       if (string[start_index] == '-')
252         start_index++;
253       if (start_index + 3 <= end_index
254           && memcmp (string + start_index, "nan", 3) == 0)
255         {
256           start_index += 3;
257           if (start_index == end_index
258               || (string[start_index] == '(' && string[end_index - 1] == ')'))
259             return 1;
260         }
261     }
262   return 0;
263 }
264 static char buf[10000];
265 static long double zeroL = 0.0L;
266 int main ()
267 {
268   if (sprintf (buf, "%Lf", 1.0L / 0.0L) < 0
269       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
270     return 1;
271   if (sprintf (buf, "%Lf", -1.0L / 0.0L) < 0
272       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
273     return 1;
274   if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
275       || !strisnan (buf, 0, strlen (buf)))
276     return 1;
277   if (sprintf (buf, "%Le", 1.0L / 0.0L) < 0
278       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
279     return 1;
280   if (sprintf (buf, "%Le", -1.0L / 0.0L) < 0
281       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
282     return 1;
283   if (sprintf (buf, "%Le", zeroL / zeroL) < 0
284       || !strisnan (buf, 0, strlen (buf)))
285     return 1;
286   if (sprintf (buf, "%Lg", 1.0L / 0.0L) < 0
287       || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
288     return 1;
289   if (sprintf (buf, "%Lg", -1.0L / 0.0L) < 0
290       || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
291     return 1;
292   if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
293       || !strisnan (buf, 0, strlen (buf)))
294     return 1;
295 #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_))
296 /* Representation of an 80-bit 'long double' as an initializer for a sequence
297    of 'unsigned int' words.  */
298 # ifdef WORDS_BIGENDIAN
299 #  define LDBL80_WORDS(exponent,manthi,mantlo) \
300      { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
301        ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16),    \
302        (unsigned int) (mantlo) << 16                                        \
303      }
304 # else
305 #  define LDBL80_WORDS(exponent,manthi,mantlo) \
306      { mantlo, manthi, exponent }
307 # endif
308   { /* Quiet NaN.  */
309     static union { unsigned int word[4]; long double value; } x =
310       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
311     if (sprintf (buf, "%Lf", x.value) < 0
312         || !strisnan (buf, 0, strlen (buf)))
313       return 1;
314     if (sprintf (buf, "%Le", x.value) < 0
315         || !strisnan (buf, 0, strlen (buf)))
316       return 1;
317     if (sprintf (buf, "%Lg", x.value) < 0
318         || !strisnan (buf, 0, strlen (buf)))
319       return 1;
320   }
321   {
322     /* Signalling NaN.  */
323     static union { unsigned int word[4]; long double value; } x =
324       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
325     if (sprintf (buf, "%Lf", x.value) < 0
326         || !strisnan (buf, 0, strlen (buf)))
327       return 1;
328     if (sprintf (buf, "%Le", x.value) < 0
329         || !strisnan (buf, 0, strlen (buf)))
330       return 1;
331     if (sprintf (buf, "%Lg", x.value) < 0
332         || !strisnan (buf, 0, strlen (buf)))
333       return 1;
334   }
335   { /* Pseudo-NaN.  */
336     static union { unsigned int word[4]; long double value; } x =
337       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
338     if (sprintf (buf, "%Lf", x.value) < 0
339         || !strisnan (buf, 0, strlen (buf)))
340       return 1;
341     if (sprintf (buf, "%Le", x.value) < 0
342         || !strisnan (buf, 0, strlen (buf)))
343       return 1;
344     if (sprintf (buf, "%Lg", x.value) < 0
345         || !strisnan (buf, 0, strlen (buf)))
346       return 1;
347   }
348   { /* Pseudo-Infinity.  */
349     static union { unsigned int word[4]; long double value; } x =
350       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
351     if (sprintf (buf, "%Lf", x.value) < 0
352         || !strisnan (buf, 0, strlen (buf)))
353       return 1;
354     if (sprintf (buf, "%Le", x.value) < 0
355         || !strisnan (buf, 0, strlen (buf)))
356       return 1;
357     if (sprintf (buf, "%Lg", x.value) < 0
358         || !strisnan (buf, 0, strlen (buf)))
359       return 1;
360   }
361   { /* Pseudo-Zero.  */
362     static union { unsigned int word[4]; long double value; } x =
363       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
364     if (sprintf (buf, "%Lf", x.value) < 0
365         || !strisnan (buf, 0, strlen (buf)))
366       return 1;
367     if (sprintf (buf, "%Le", x.value) < 0
368         || !strisnan (buf, 0, strlen (buf)))
369       return 1;
370     if (sprintf (buf, "%Lg", x.value) < 0
371         || !strisnan (buf, 0, strlen (buf)))
372       return 1;
373   }
374   { /* Unnormalized number.  */
375     static union { unsigned int word[4]; long double value; } x =
376       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
377     if (sprintf (buf, "%Lf", x.value) < 0
378         || !strisnan (buf, 0, strlen (buf)))
379       return 1;
380     if (sprintf (buf, "%Le", x.value) < 0
381         || !strisnan (buf, 0, strlen (buf)))
382       return 1;
383     if (sprintf (buf, "%Lg", x.value) < 0
384         || !strisnan (buf, 0, strlen (buf)))
385       return 1;
386   }
387   { /* Pseudo-Denormal.  */
388     static union { unsigned int word[4]; long double value; } x =
389       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
390     if (sprintf (buf, "%Lf", x.value) < 0
391         || !strisnan (buf, 0, strlen (buf)))
392       return 1;
393     if (sprintf (buf, "%Le", x.value) < 0
394         || !strisnan (buf, 0, strlen (buf)))
395       return 1;
396     if (sprintf (buf, "%Lg", x.value) < 0
397         || !strisnan (buf, 0, strlen (buf)))
398       return 1;
399   }
400 #endif
401   return 0;
402 }],
403           [gl_cv_func_printf_infinite_long_double=yes],
404           [gl_cv_func_printf_infinite_long_double=no],
405           [
406 changequote(,)dnl
407            case "$host_cpu" in
408                                    # Guess no on ia64, x86_64, i386.
409              ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
410              *)
411                case "$host_os" in
412                                        # Guess yes on glibc systems.
413                  *-gnu*)               gl_cv_func_printf_infinite_long_double="guessing yes";;
414                                        # Guess yes on FreeBSD >= 6.
415                  freebsd[1-5]*)        gl_cv_func_printf_infinite_long_double="guessing no";;
416                  freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
417                                        # Guess yes on MacOS X >= 10.3.
418                  darwin[1-6].*)        gl_cv_func_printf_infinite_long_double="guessing no";;
419                  darwin*)              gl_cv_func_printf_infinite_long_double="guessing yes";;
420                                        # Guess yes on HP-UX >= 11.
421                  hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
422                  hpux*)                gl_cv_func_printf_infinite_long_double="guessing yes";;
423                                        # Guess yes on NetBSD >= 3.
424                  netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
425                                        gl_cv_func_printf_infinite_long_double="guessing no";;
426                  netbsd*)              gl_cv_func_printf_infinite_long_double="guessing yes";;
427                                        # If we don't know, assume the worst.
428                  *)                    gl_cv_func_printf_infinite_long_double="guessing no";;
429                esac
430                ;;
431            esac
432 changequote([,])dnl
433           ])
434         ])
435       ;;
436     *)
437       gl_cv_func_printf_infinite_long_double="irrelevant"
438       ;;
439   esac
440 ])
441
442 dnl Test whether the *printf family of functions supports the 'a' and 'A'
443 dnl conversion specifier for hexadecimal output of floating-point numbers.
444 dnl (ISO C99, POSIX:2001)
445 dnl Result is gl_cv_func_printf_directive_a.
446
447 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
448 [
449   AC_REQUIRE([AC_PROG_CC])
450   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
451   AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
452     [gl_cv_func_printf_directive_a],
453     [
454       AC_TRY_RUN([
455 #include <stdio.h>
456 #include <string.h>
457 static char buf[100];
458 int main ()
459 {
460   if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
461       || (strcmp (buf, "0x1.922p+1 33") != 0
462           && strcmp (buf, "0x3.244p+0 33") != 0
463           && strcmp (buf, "0x6.488p-1 33") != 0
464           && strcmp (buf, "0xc.91p-2 33") != 0))
465     return 1;
466   if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
467       || (strcmp (buf, "-0X1.922P+1 33") != 0
468           && strcmp (buf, "-0X3.244P+0 33") != 0
469           && strcmp (buf, "-0X6.488P-1 33") != 0
470           && strcmp (buf, "-0XC.91P-2 33") != 0))
471     return 1;
472   /* This catches a FreeBSD 6.1 bug: it doesn't round.  */
473   if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
474       || (strcmp (buf, "0x1.83p+0 33") != 0
475           && strcmp (buf, "0x3.05p-1 33") != 0
476           && strcmp (buf, "0x6.0ap-2 33") != 0
477           && strcmp (buf, "0xc.14p-3 33") != 0))
478     return 1;
479   /* This catches a FreeBSD 6.1 bug.  See
480      <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
481   if (sprintf (buf, "%010a %d", 1.0 / 0.0, 33, 44, 55) < 0
482       || buf[0] == '0')
483     return 1;
484   /* This catches a MacOS X 10.3.9 (Darwin 7.9) bug.  */
485   if (sprintf (buf, "%.1a", 1.999) < 0
486       || (strcmp (buf, "0x1.0p+1") != 0
487           && strcmp (buf, "0x2.0p+0") != 0
488           && strcmp (buf, "0x4.0p-1") != 0
489           && strcmp (buf, "0x8.0p-2") != 0))
490     return 1;
491   /* This catches the same MacOS X 10.3.9 (Darwin 7.9) bug and also a
492      glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
493   if (sprintf (buf, "%.1La", 1.999L) < 0
494       || (strcmp (buf, "0x1.0p+1") != 0
495           && strcmp (buf, "0x2.0p+0") != 0
496           && strcmp (buf, "0x4.0p-1") != 0
497           && strcmp (buf, "0x8.0p-2") != 0))
498     return 1;
499   return 0;
500 }], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no],
501       [
502        case "$host_os" in
503                                # Guess yes on glibc >= 2.5 systems.
504          *-gnu*)
505            AC_EGREP_CPP([BZ2908], [
506              #include <features.h>
507              #ifdef __GNU_LIBRARY__
508               #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)
509                BZ2908
510               #endif
511              #endif
512              ],
513              [gl_cv_func_printf_directive_a="guessing yes"],
514              [gl_cv_func_printf_directive_a="guessing no"])
515            ;;
516                                # If we don't know, assume the worst.
517          *)                    gl_cv_func_printf_directive_a="guessing no";;
518        esac
519       ])
520     ])
521 ])
522
523 dnl Test whether the *printf family of functions supports the %F format
524 dnl directive. (ISO C99, POSIX:2001)
525 dnl Result is gl_cv_func_printf_directive_f.
526
527 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
528 [
529   AC_REQUIRE([AC_PROG_CC])
530   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
531   AC_CACHE_CHECK([whether printf supports the 'F' directive],
532     [gl_cv_func_printf_directive_f],
533     [
534       AC_TRY_RUN([
535 #include <stdio.h>
536 #include <string.h>
537 static char buf[100];
538 int main ()
539 {
540   if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
541       || strcmp (buf, "1234567.000000 33") != 0)
542     return 1;
543   if (sprintf (buf, "%F", 1.0 / 0.0) < 0
544       || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
545     return 1;
546   /* This catches a Cygwin 2007 bug.  */
547   if (sprintf (buf, "%.F", 1234.0) < 0
548       || strcmp (buf, "1234") != 0)
549     return 1;
550   return 0;
551 }], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no],
552       [
553 changequote(,)dnl
554        case "$host_os" in
555                                # Guess yes on glibc systems.
556          *-gnu*)               gl_cv_func_printf_directive_f="guessing yes";;
557                                # Guess yes on FreeBSD >= 6.
558          freebsd[1-5]*)        gl_cv_func_printf_directive_f="guessing no";;
559          freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
560                                # Guess yes on MacOS X >= 10.3.
561          darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
562          darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
563                                # Guess yes on Solaris >= 2.10.
564          solaris2.[0-9]*)      gl_cv_func_printf_directive_f="guessing no";;
565          solaris*)             gl_cv_func_printf_directive_f="guessing yes";;
566                                # If we don't know, assume the worst.
567          *)                    gl_cv_func_printf_directive_f="guessing no";;
568        esac
569 changequote([,])dnl
570       ])
571     ])
572 ])
573
574 dnl Test whether the *printf family of functions supports the %n format
575 dnl directive. (ISO C99, POSIX:2001)
576 dnl Result is gl_cv_func_printf_directive_n.
577
578 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
579 [
580   AC_REQUIRE([AC_PROG_CC])
581   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
582   AC_CACHE_CHECK([whether printf supports the 'n' directive],
583     [gl_cv_func_printf_directive_n],
584     [
585       AC_TRY_RUN([
586 #include <stdio.h>
587 #include <string.h>
588 static char fmtstring[10];
589 static char buf[100];
590 int main ()
591 {
592   int count = -1;
593   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
594      support %n in format strings in read-only memory but not in writable
595      memory.  */
596   strcpy (fmtstring, "%d %n");
597   if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
598       || strcmp (buf, "123 ") != 0
599       || count != 4)
600     return 1;
601   return 0;
602 }], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no],
603       [
604 changequote(,)dnl
605        case "$host_os" in
606          *)     gl_cv_func_printf_directive_n="guessing yes";;
607        esac
608 changequote([,])dnl
609       ])
610     ])
611 ])
612
613 dnl Test whether the *printf family of functions supports POSIX/XSI format
614 dnl strings with positions. (POSIX:2001)
615 dnl Result is gl_cv_func_printf_positions.
616
617 AC_DEFUN([gl_PRINTF_POSITIONS],
618 [
619   AC_REQUIRE([AC_PROG_CC])
620   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
621   AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
622     [gl_cv_func_printf_positions],
623     [
624       AC_TRY_RUN([
625 #include <stdio.h>
626 #include <string.h>
627 /* The string "%2$d %1$d", with dollar characters protected from the shell's
628    dollar expansion (possibly an autoconf bug).  */
629 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
630 static char buf[100];
631 int main ()
632 {
633   sprintf (buf, format, 33, 55);
634   return (strcmp (buf, "55 33") != 0);
635 }], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no],
636       [
637 changequote(,)dnl
638        case "$host_os" in
639          netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
640                        gl_cv_func_printf_positions="guessing no";;
641          beos*)        gl_cv_func_printf_positions="guessing no";;
642          mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
643          *)            gl_cv_func_printf_positions="guessing yes";;
644        esac
645 changequote([,])dnl
646       ])
647     ])
648 ])
649
650 dnl Test whether the *printf family of functions supports POSIX/XSI format
651 dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
652 dnl Result is gl_cv_func_printf_flag_grouping.
653
654 AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
655 [
656   AC_REQUIRE([AC_PROG_CC])
657   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
658   AC_CACHE_CHECK([whether printf supports the grouping flag],
659     [gl_cv_func_printf_flag_grouping],
660     [
661       AC_TRY_RUN([
662 #include <stdio.h>
663 #include <string.h>
664 static char buf[100];
665 int main ()
666 {
667   if (sprintf (buf, "%'d %d", 1234567, 99) < 0
668       || buf[strlen (buf) - 1] != '9')
669     return 1;
670   return 0;
671 }], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no],
672       [
673 changequote(,)dnl
674        case "$host_os" in
675          cygwin*)      gl_cv_func_printf_flag_grouping="guessing no";;
676          netbsd*)      gl_cv_func_printf_flag_grouping="guessing no";;
677          mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
678          *)            gl_cv_func_printf_flag_grouping="guessing yes";;
679        esac
680 changequote([,])dnl
681       ])
682     ])
683 ])
684
685 dnl Test whether the *printf family of functions supports padding of non-finite
686 dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
687 dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
688 dnl Result is gl_cv_func_printf_flag_zero.
689
690 AC_DEFUN([gl_PRINTF_FLAG_ZERO],
691 [
692   AC_REQUIRE([AC_PROG_CC])
693   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
694   AC_CACHE_CHECK([whether printf supports the zero flag correctly],
695     [gl_cv_func_printf_flag_zero],
696     [
697       AC_TRY_RUN([
698 #include <stdio.h>
699 #include <string.h>
700 static char buf[100];
701 int main ()
702 {
703   if (sprintf (buf, "%010f", 1.0 / 0.0, 33, 44, 55) < 0
704       || (strcmp (buf, "       inf") != 0
705           && strcmp (buf, "  infinity") != 0))
706     return 1;
707   return 0;
708 }], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no],
709       [
710 changequote(,)dnl
711        case "$host_os" in
712                  # Guess yes on glibc systems.
713          *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
714                  # Guess yes on BeOS.
715          beos*)  gl_cv_func_printf_flag_zero="guessing yes";;
716                  # If we don't know, assume the worst.
717          *)      gl_cv_func_printf_flag_zero="guessing no";;
718        esac
719 changequote([,])dnl
720       ])
721     ])
722 ])
723
724 dnl Test whether the *printf family of functions recovers gracefully in case
725 dnl of an out-of-memory condition, or whether it crashes the entire program.
726 dnl Result is gl_cv_func_printf_enomem.
727
728 AC_DEFUN([gl_PRINTF_ENOMEM],
729 [
730   AC_REQUIRE([AC_PROG_CC])
731   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
732   AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
733     [gl_cv_func_printf_enomem],
734     [
735       if test "$cross_compiling" = no; then
736         AC_LANG_CONFTEST([AC_LANG_SOURCE([
737 changequote(,)dnl
738 #include <stdio.h>
739 #include <sys/types.h>
740 #include <sys/time.h>
741 #include <sys/resource.h>
742 #include <errno.h>
743 int main()
744 {
745   struct rlimit limit;
746   int ret;
747   /* Some printf implementations allocate temporary space with malloc.  */
748   /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
749 #ifdef RLIMIT_DATA
750   if (getrlimit (RLIMIT_DATA, &limit) < 0)
751     return 77;
752   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
753     limit.rlim_max = 5000000;
754   limit.rlim_cur = limit.rlim_max;
755   if (setrlimit (RLIMIT_DATA, &limit) < 0)
756     return 77;
757 #endif
758   /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
759 #ifdef RLIMIT_AS
760   if (getrlimit (RLIMIT_AS, &limit) < 0)
761     return 77;
762   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
763     limit.rlim_max = 5000000;
764   limit.rlim_cur = limit.rlim_max;
765   if (setrlimit (RLIMIT_AS, &limit) < 0)
766     return 77;
767 #endif
768   /* Some printf implementations allocate temporary space on the stack.  */
769 #ifdef RLIMIT_STACK
770   if (getrlimit (RLIMIT_STACK, &limit) < 0)
771     return 77;
772   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
773     limit.rlim_max = 5000000;
774   limit.rlim_cur = limit.rlim_max;
775   if (setrlimit (RLIMIT_STACK, &limit) < 0)
776     return 77;
777 #endif
778   ret = printf ("%.5000000f", 1.0);
779   return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
780 }
781 changequote([,])dnl
782           ])])
783         if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
784           (./conftest
785            result=$?
786            if test $result != 0 && test $result != 77; then result=1; fi
787            exit $result
788           ) >/dev/null 2>/dev/null
789           case $? in
790             0) gl_cv_func_printf_enomem="yes" ;;
791             77) gl_cv_func_printf_enomem="guessing no" ;;
792             *) gl_cv_func_printf_enomem="no" ;;
793           esac
794         else
795           gl_cv_func_printf_enomem="guessing no"
796         fi
797         rm -fr conftest*
798       else
799 changequote(,)dnl
800         case "$host_os" in
801                     # Guess yes on glibc systems.
802           *-gnu*)   gl_cv_func_printf_enomem="guessing yes";;
803                     # Guess yes on Solaris.
804           solaris*) gl_cv_func_printf_enomem="guessing yes";;
805                     # Guess yes on AIX.
806           aix*)     gl_cv_func_printf_enomem="guessing yes";;
807                     # Guess yes on HP-UX/hppa.
808           hpux*)    case "$host_cpu" in
809                       hppa*) gl_cv_func_printf_enomem="guessing yes";;
810                       *)     gl_cv_func_printf_enomem="guessing no";;
811                     esac
812                     ;;
813                     # Guess yes on IRIX.
814           irix*)    gl_cv_func_printf_enomem="guessing yes";;
815                     # Guess yes on OSF/1.
816           osf*)     gl_cv_func_printf_enomem="guessing yes";;
817                     # Guess yes on BeOS.
818           beos*)    gl_cv_func_printf_enomem="guessing yes";;
819                     # If we don't know, assume the worst.
820           *)        gl_cv_func_printf_enomem="guessing no";;
821         esac
822 changequote([,])dnl
823       fi
824     ])
825 ])
826
827 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
828 dnl Result is ac_cv_func_snprintf.
829
830 AC_DEFUN([gl_SNPRINTF_PRESENCE],
831 [
832   AC_CHECK_FUNCS_ONCE([snprintf])
833 ])
834
835 dnl Test whether the string produced by the snprintf function is always NUL
836 dnl terminated. (ISO C99, POSIX:2001)
837 dnl Result is gl_cv_func_snprintf_truncation_c99.
838
839 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
840 [
841   AC_REQUIRE([AC_PROG_CC])
842   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
843   AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
844     [gl_cv_func_snprintf_truncation_c99],
845     [
846       AC_TRY_RUN([
847 #include <stdio.h>
848 #include <string.h>
849 static char buf[100];
850 int main ()
851 {
852   strcpy (buf, "ABCDEF");
853   snprintf (buf, 3, "%d %d", 4567, 89);
854   if (memcmp (buf, "45\0DEF", 6) != 0)
855     return 1;
856   return 0;
857 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
858       [
859 changequote(,)dnl
860        case "$host_os" in
861                                # Guess yes on glibc systems.
862          *-gnu*)               gl_cv_func_snprintf_truncation_c99="guessing yes";;
863                                # Guess yes on FreeBSD >= 5.
864          freebsd[1-4]*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
865          freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
866                                # Guess yes on MacOS X >= 10.3.
867          darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
868          darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
869                                # Guess yes on OpenBSD >= 3.9.
870          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
871                                gl_cv_func_snprintf_truncation_c99="guessing no";;
872          openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
873                                # Guess yes on Solaris >= 2.6.
874          solaris2.[0-5]*)      gl_cv_func_snprintf_truncation_c99="guessing no";;
875          solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
876                                # Guess yes on AIX >= 4.
877          aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
878          aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
879                                # Guess yes on HP-UX >= 11.
880          hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
881          hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
882                                # Guess yes on IRIX >= 6.5.
883          irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
884                                # Guess yes on OSF/1 >= 5.
885          osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
886          osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
887                                # Guess yes on NetBSD >= 3.
888          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
889                                gl_cv_func_snprintf_truncation_c99="guessing no";;
890          netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
891                                # Guess yes on BeOS.
892          beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
893                                # If we don't know, assume the worst.
894          *)                    gl_cv_func_snprintf_truncation_c99="guessing no";;
895        esac
896 changequote([,])dnl
897       ])
898     ])
899 ])
900
901 dnl Test whether the return value of the snprintf function is the number
902 dnl of bytes (excluding the terminating NUL) that would have been produced
903 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
904 dnl For example, this test program fails on IRIX 6.5:
905 dnl     ---------------------------------------------------------------------
906 dnl     #include <stdio.h>
907 dnl     int main()
908 dnl     {
909 dnl       static char buf[8];
910 dnl       int retval = snprintf (buf, 3, "%d", 12345);
911 dnl       return retval >= 0 && retval < 3;
912 dnl     }
913 dnl     ---------------------------------------------------------------------
914 dnl Result is gl_cv_func_snprintf_retval_c99.
915
916 AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
917 [
918   AC_REQUIRE([AC_PROG_CC])
919   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
920   AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
921     [gl_cv_func_snprintf_retval_c99],
922     [
923       AC_TRY_RUN([
924 #include <stdio.h>
925 #include <string.h>
926 static char buf[100];
927 int main ()
928 {
929   strcpy (buf, "ABCDEF");
930   if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
931     return 1;
932   return 0;
933 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
934       [
935 changequote(,)dnl
936        case "$host_os" in
937                                # Guess yes on glibc systems.
938          *-gnu*)               gl_cv_func_snprintf_retval_c99="guessing yes";;
939                                # Guess yes on FreeBSD >= 5.
940          freebsd[1-4]*)        gl_cv_func_snprintf_retval_c99="guessing no";;
941          freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
942                                # Guess yes on MacOS X >= 10.3.
943          darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
944          darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
945                                # Guess yes on OpenBSD >= 3.9.
946          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
947                                gl_cv_func_snprintf_retval_c99="guessing no";;
948          openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
949                                # Guess yes on Solaris >= 2.6.
950          solaris2.[0-5]*)      gl_cv_func_snprintf_retval_c99="guessing no";;
951          solaris*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
952                                # Guess yes on AIX >= 4.
953          aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
954          aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
955                                # Guess yes on NetBSD >= 3.
956          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
957                                gl_cv_func_snprintf_retval_c99="guessing no";;
958          netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
959                                # Guess yes on BeOS.
960          beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
961                                # If we don't know, assume the worst.
962          *)                    gl_cv_func_snprintf_retval_c99="guessing no";;
963        esac
964 changequote([,])dnl
965       ])
966     ])
967 ])
968
969 dnl Test whether the snprintf function supports the %n format directive
970 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
971 dnl Result is gl_cv_func_snprintf_directive_n.
972
973 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
974 [
975   AC_REQUIRE([AC_PROG_CC])
976   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
977   AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
978     [gl_cv_func_snprintf_directive_n],
979     [
980       AC_TRY_RUN([
981 #include <stdio.h>
982 #include <string.h>
983 static char fmtstring[10];
984 static char buf[100];
985 int main ()
986 {
987   int count = -1;
988   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
989      support %n in format strings in read-only memory but not in writable
990      memory.  */
991   strcpy (fmtstring, "%d %n");
992   snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
993   if (count != 6)
994     return 1;
995   return 0;
996 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
997       [
998 changequote(,)dnl
999        case "$host_os" in
1000                                # Guess yes on glibc systems.
1001          *-gnu*)               gl_cv_func_snprintf_directive_n="guessing yes";;
1002                                # Guess yes on FreeBSD >= 5.
1003          freebsd[1-4]*)        gl_cv_func_snprintf_directive_n="guessing no";;
1004          freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1005                                # Guess yes on MacOS X >= 10.3.
1006          darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
1007          darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1008                                # Guess yes on Solaris >= 2.6.
1009          solaris2.[0-5]*)      gl_cv_func_snprintf_directive_n="guessing no";;
1010          solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
1011                                # Guess yes on AIX >= 4.
1012          aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1013          aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1014                                # Guess yes on IRIX >= 6.5.
1015          irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
1016                                # Guess yes on OSF/1 >= 5.
1017          osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1018          osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1019                                # Guess yes on NetBSD >= 3.
1020          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1021                                gl_cv_func_snprintf_directive_n="guessing no";;
1022          netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1023                                # Guess yes on BeOS.
1024          beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
1025                                # If we don't know, assume the worst.
1026          *)                    gl_cv_func_snprintf_directive_n="guessing no";;
1027        esac
1028 changequote([,])dnl
1029       ])
1030     ])
1031 ])
1032
1033 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1034 dnl output. (ISO C99, POSIX:2001)
1035 dnl For example, snprintf nevertheless writes a NUL byte in this case
1036 dnl on OSF/1 5.1:
1037 dnl     ---------------------------------------------------------------------
1038 dnl     #include <stdio.h>
1039 dnl     int main()
1040 dnl     {
1041 dnl       static char buf[8] = "DEADBEEF";
1042 dnl       snprintf (buf, 0, "%d", 12345);
1043 dnl       return buf[0] != 'D';
1044 dnl     }
1045 dnl     ---------------------------------------------------------------------
1046 dnl And vsnprintf writes any output without bounds in this case, behaving like
1047 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1048 dnl     ---------------------------------------------------------------------
1049 dnl     #include <stdarg.h>
1050 dnl     #include <stdio.h>
1051 dnl     static int my_snprintf (char *buf, int size, const char *format, ...)
1052 dnl     {
1053 dnl       va_list args;
1054 dnl       int ret;
1055 dnl       va_start (args, format);
1056 dnl       ret = vsnprintf (buf, size, format, args);
1057 dnl       va_end (args);
1058 dnl       return ret;
1059 dnl     }
1060 dnl     int main()
1061 dnl     {
1062 dnl       static char buf[8] = "DEADBEEF";
1063 dnl       my_snprintf (buf, 0, "%d", 12345);
1064 dnl       return buf[0] != 'D';
1065 dnl     }
1066 dnl     ---------------------------------------------------------------------
1067 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1068
1069 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1070 [
1071   AC_REQUIRE([AC_PROG_CC])
1072   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1073   AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1074     [gl_cv_func_vsnprintf_zerosize_c99],
1075     [
1076       AC_TRY_RUN([
1077 #include <stdarg.h>
1078 #include <stdio.h>
1079 static int my_snprintf (char *buf, int size, const char *format, ...)
1080 {
1081   va_list args;
1082   int ret;
1083   va_start (args, format);
1084   ret = vsnprintf (buf, size, format, args);
1085   va_end (args);
1086   return ret;
1087 }
1088 int main()
1089 {
1090   static char buf[8] = "DEADBEEF";
1091   my_snprintf (buf, 0, "%d", 12345);
1092   return buf[0] != 'D';
1093 }],
1094       [gl_cv_func_vsnprintf_zerosize_c99=yes],
1095       [gl_cv_func_vsnprintf_zerosize_c99=no],
1096       [
1097 changequote(,)dnl
1098        case "$host_os" in
1099                                # Guess yes on glibc systems.
1100          *-gnu*)               gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1101                                # Guess yes on FreeBSD >= 5.
1102          freebsd[1-4]*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1103          freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1104                                # Guess yes on MacOS X >= 10.3.
1105          darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1106          darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1107                                # Guess yes on Cygwin.
1108          cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1109                                # Guess yes on Solaris >= 2.6.
1110          solaris2.[0-5]*)      gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1111          solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1112                                # Guess yes on AIX >= 4.
1113          aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1114          aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1115                                # Guess yes on IRIX >= 6.5.
1116          irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1117                                # Guess yes on NetBSD >= 3.
1118          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1119                                gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1120          netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1121                                # Guess yes on BeOS.
1122          beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1123                                # Guess yes on mingw.
1124          mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1125                                # If we don't know, assume the worst.
1126          *)                    gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1127        esac
1128 changequote([,])dnl
1129       ])
1130     ])
1131 ])
1132
1133 dnl The results of these tests on various platforms are:
1134 dnl
1135 dnl 1 = gl_PRINTF_SIZES_C99
1136 dnl 2 = gl_PRINTF_LONG_DOUBLE
1137 dnl 3 = gl_PRINTF_INFINITE
1138 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1139 dnl 5 = gl_PRINTF_DIRECTIVE_A
1140 dnl 6 = gl_PRINTF_DIRECTIVE_F
1141 dnl 7 = gl_PRINTF_DIRECTIVE_N
1142 dnl 8 = gl_PRINTF_POSITIONS
1143 dnl 9 = gl_PRINTF_FLAG_GROUPING
1144 dnl 10 = gl_PRINTF_FLAG_ZERO
1145 dnl 11 = gl_PRINTF_ENOMEM
1146 dnl 12 = gl_SNPRINTF_PRESENCE
1147 dnl 13 = gl_SNPRINTF_TRUNCATION_C99
1148 dnl 14 = gl_SNPRINTF_RETVAL_C99
1149 dnl 15 = gl_SNPRINTF_DIRECTIVE_N
1150 dnl 16 = gl_VSNPRINTF_ZEROSIZE_C99
1151 dnl
1152 dnl 1 = checking whether printf supports size specifiers as in C99...
1153 dnl 2 = checking whether printf supports 'long double' arguments...
1154 dnl 3 = checking whether printf supports infinite 'double' arguments...
1155 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1156 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1157 dnl 6 = checking whether printf supports the 'F' directive...
1158 dnl 7 = checking whether printf supports the 'n' directive...
1159 dnl 8 = checking whether printf supports POSIX/XSI format strings with positions...
1160 dnl 9 = checking whether printf supports the grouping flag...
1161 dnl 10 = checking whether printf supports the zero flag correctly...
1162 dnl 11 = checking whether printf survives out-of-memory conditions...
1163 dnl 12 = checking for snprintf...
1164 dnl 13 = checking whether snprintf truncates the result as in C99...
1165 dnl 14 = checking whether snprintf returns a byte count as in C99...
1166 dnl 15 = checking whether snprintf fully supports the 'n' directive...
1167 dnl 16 = checking whether vsnprintf respects a zero size as in C99...
1168 dnl
1169 dnl . = yes, # = no.
1170 dnl
1171 dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
1172 dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
1173 dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  .  .  .
1174 dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  #  #  .  .  .  .  .
1175 dnl   MacOS X 10.3.9                 .  .  .  .  #  .  .  .  .  #  #  .  .  .  .  .
1176 dnl   OpenBSD 3.9, 4.0               .  ?  ?  ?  #  ?  .  .  ?  ?  ?  .  .  .  ?  ?
1177 dnl   Cygwin 2007 (= Cygwin 1.5.24)  .  .  .  .  #  #  .  .  .  #  ?  .  .  .  .  .
1178 dnl   Cygwin 2006 (= Cygwin 1.5.19)  #  .  .  .  #  #  .  .  #  #  ?  .  .  .  .  .
1179 dnl   Solaris 10                     .  .  #  #  #  .  .  .  .  #  .  .  .  .  .  .
1180 dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  .  .  #  .  .  .  .  .  .
1181 dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  .  .  #  .  #  #  #  #  #
1182 dnl   AIX 5.2                        .  .  #  #  #  .  .  .  .  #  .  .  .  .  .  .
1183 dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  #  .  .  .  .  .  .
1184 dnl   HP-UX 11.31                    .  .  .  .  #  .  .  .  .  #  .  .  .  #  #  .
1185 dnl   HP-UX 10.20, 11.{00,11,23}     #  .  .  .  #  #  .  .  .  #  .  .  .  #  #  #
1186 dnl   IRIX 6.5                       #  .  #  #  #  #  .  .  .  #  .  .  .  #  .  .
1187 dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  #  .  .  .  #  .  #
1188 dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  #  .  #  #  #  #  #
1189 dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  .  ?  ?  ?  .  .  .  ?  ?
1190 dnl   NetBSD 3.0                     .  .  .  .  #  #  .  #  #  #  #  .  .  .  .  .
1191 dnl   BeOS                           #  #  .  #  #  #  .  #  .  .  ?  .  .  .  .  .
1192 dnl   mingw                          #  #  #  #  #  #  .  #  #  #  ?  .  #  #  #  .