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