]> git.cworth.org Git - tar/blob - m4/printf.m4
Imported Upstream version 1.22
[tar] / m4 / printf.m4
1 # printf.m4 serial 28
2 dnl Copyright (C) 2003, 2007-2009 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([gl_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([gl_MULTIARCH])
815   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
816   AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
817     [gl_cv_func_printf_enomem],
818     [
819       gl_cv_func_printf_enomem="guessing no"
820       if test "$cross_compiling" = no; then
821         if test $APPLE_UNIVERSAL_BUILD = 0; then
822           AC_LANG_CONFTEST([AC_LANG_SOURCE([
823 ]GL_NOCRASH[
824 changequote(,)dnl
825 #include <stdio.h>
826 #include <sys/types.h>
827 #include <sys/time.h>
828 #include <sys/resource.h>
829 #include <errno.h>
830 int main()
831 {
832   struct rlimit limit;
833   int ret;
834   nocrash_init ();
835   /* Some printf implementations allocate temporary space with malloc.  */
836   /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
837 #ifdef RLIMIT_DATA
838   if (getrlimit (RLIMIT_DATA, &limit) < 0)
839     return 77;
840   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
841     limit.rlim_max = 5000000;
842   limit.rlim_cur = limit.rlim_max;
843   if (setrlimit (RLIMIT_DATA, &limit) < 0)
844     return 77;
845 #endif
846   /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
847 #ifdef RLIMIT_AS
848   if (getrlimit (RLIMIT_AS, &limit) < 0)
849     return 77;
850   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
851     limit.rlim_max = 5000000;
852   limit.rlim_cur = limit.rlim_max;
853   if (setrlimit (RLIMIT_AS, &limit) < 0)
854     return 77;
855 #endif
856   /* Some printf implementations allocate temporary space on the stack.  */
857 #ifdef RLIMIT_STACK
858   if (getrlimit (RLIMIT_STACK, &limit) < 0)
859     return 77;
860   if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
861     limit.rlim_max = 5000000;
862   limit.rlim_cur = limit.rlim_max;
863   if (setrlimit (RLIMIT_STACK, &limit) < 0)
864     return 77;
865 #endif
866   ret = printf ("%.5000000f", 1.0);
867   return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
868 }
869 changequote([,])dnl
870           ])])
871           if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
872             (./conftest
873              result=$?
874              if test $result != 0 && test $result != 77; then result=1; fi
875              exit $result
876             ) >/dev/null 2>/dev/null
877             case $? in
878               0) gl_cv_func_printf_enomem="yes" ;;
879               77) gl_cv_func_printf_enomem="guessing no" ;;
880               *) gl_cv_func_printf_enomem="no" ;;
881             esac
882           else
883             gl_cv_func_printf_enomem="guessing no"
884           fi
885           rm -fr conftest*
886         else
887           dnl A universal build on Apple MacOS X platforms.
888           dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
889           dnl But we need a configuration result that is valid in both modes.
890           gl_cv_func_printf_enomem="guessing no"
891         fi
892       fi
893       if test "$gl_cv_func_printf_enomem" = "guessing no"; then
894 changequote(,)dnl
895         case "$host_os" in
896                     # Guess yes on glibc systems.
897           *-gnu*)   gl_cv_func_printf_enomem="guessing yes";;
898                     # Guess yes on Solaris.
899           solaris*) gl_cv_func_printf_enomem="guessing yes";;
900                     # Guess yes on AIX.
901           aix*)     gl_cv_func_printf_enomem="guessing yes";;
902                     # Guess yes on HP-UX/hppa.
903           hpux*)    case "$host_cpu" in
904                       hppa*) gl_cv_func_printf_enomem="guessing yes";;
905                       *)     gl_cv_func_printf_enomem="guessing no";;
906                     esac
907                     ;;
908                     # Guess yes on IRIX.
909           irix*)    gl_cv_func_printf_enomem="guessing yes";;
910                     # Guess yes on OSF/1.
911           osf*)     gl_cv_func_printf_enomem="guessing yes";;
912                     # Guess yes on BeOS.
913           beos*)    gl_cv_func_printf_enomem="guessing yes";;
914                     # Guess yes on Haiku.
915           haiku*)   gl_cv_func_printf_enomem="guessing yes";;
916                     # If we don't know, assume the worst.
917           *)        gl_cv_func_printf_enomem="guessing no";;
918         esac
919 changequote([,])dnl
920       fi
921     ])
922 ])
923
924 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
925 dnl Result is ac_cv_func_snprintf.
926
927 AC_DEFUN([gl_SNPRINTF_PRESENCE],
928 [
929   AC_CHECK_FUNCS_ONCE([snprintf])
930 ])
931
932 dnl Test whether the string produced by the snprintf function is always NUL
933 dnl terminated. (ISO C99, POSIX:2001)
934 dnl Result is gl_cv_func_snprintf_truncation_c99.
935
936 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
937 [
938   AC_REQUIRE([AC_PROG_CC])
939   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
940   AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
941     [gl_cv_func_snprintf_truncation_c99],
942     [
943       AC_TRY_RUN([
944 #include <stdio.h>
945 #include <string.h>
946 static char buf[100];
947 int main ()
948 {
949   strcpy (buf, "ABCDEF");
950   snprintf (buf, 3, "%d %d", 4567, 89);
951   if (memcmp (buf, "45\0DEF", 6) != 0)
952     return 1;
953   return 0;
954 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
955       [
956 changequote(,)dnl
957        case "$host_os" in
958                                # Guess yes on glibc systems.
959          *-gnu*)               gl_cv_func_snprintf_truncation_c99="guessing yes";;
960                                # Guess yes on FreeBSD >= 5.
961          freebsd[1-4]*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
962          freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
963                                # Guess yes on MacOS X >= 10.3.
964          darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
965          darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
966                                # Guess yes on OpenBSD >= 3.9.
967          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
968                                gl_cv_func_snprintf_truncation_c99="guessing no";;
969          openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
970                                # Guess yes on Solaris >= 2.6.
971          solaris2.[0-5]*)      gl_cv_func_snprintf_truncation_c99="guessing no";;
972          solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
973                                # Guess yes on AIX >= 4.
974          aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
975          aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
976                                # Guess yes on HP-UX >= 11.
977          hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
978          hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
979                                # Guess yes on IRIX >= 6.5.
980          irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
981                                # Guess yes on OSF/1 >= 5.
982          osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
983          osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
984                                # Guess yes on NetBSD >= 3.
985          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
986                                gl_cv_func_snprintf_truncation_c99="guessing no";;
987          netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
988                                # Guess yes on BeOS.
989          beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
990                                # If we don't know, assume the worst.
991          *)                    gl_cv_func_snprintf_truncation_c99="guessing no";;
992        esac
993 changequote([,])dnl
994       ])
995     ])
996 ])
997
998 dnl Test whether the return value of the snprintf function is the number
999 dnl of bytes (excluding the terminating NUL) that would have been produced
1000 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
1001 dnl For example, this test program fails on IRIX 6.5:
1002 dnl     ---------------------------------------------------------------------
1003 dnl     #include <stdio.h>
1004 dnl     int main()
1005 dnl     {
1006 dnl       static char buf[8];
1007 dnl       int retval = snprintf (buf, 3, "%d", 12345);
1008 dnl       return retval >= 0 && retval < 3;
1009 dnl     }
1010 dnl     ---------------------------------------------------------------------
1011 dnl Result is gl_cv_func_snprintf_retval_c99.
1012
1013 AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
1014 [
1015   AC_REQUIRE([AC_PROG_CC])
1016   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1017   AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
1018     [gl_cv_func_snprintf_retval_c99],
1019     [
1020       AC_TRY_RUN([
1021 #include <stdio.h>
1022 #include <string.h>
1023 static char buf[100];
1024 int main ()
1025 {
1026   strcpy (buf, "ABCDEF");
1027   if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
1028     return 1;
1029   return 0;
1030 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
1031       [
1032 changequote(,)dnl
1033        case "$host_os" in
1034                                # Guess yes on glibc systems.
1035          *-gnu*)               gl_cv_func_snprintf_retval_c99="guessing yes";;
1036                                # Guess yes on FreeBSD >= 5.
1037          freebsd[1-4]*)        gl_cv_func_snprintf_retval_c99="guessing no";;
1038          freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1039                                # Guess yes on MacOS X >= 10.3.
1040          darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
1041          darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
1042                                # Guess yes on OpenBSD >= 3.9.
1043          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1044                                gl_cv_func_snprintf_retval_c99="guessing no";;
1045          openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
1046                                # Guess yes on Solaris >= 2.6.
1047          solaris2.[0-5]*)      gl_cv_func_snprintf_retval_c99="guessing no";;
1048          solaris*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
1049                                # Guess yes on AIX >= 4.
1050          aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
1051          aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
1052                                # Guess yes on NetBSD >= 3.
1053          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1054                                gl_cv_func_snprintf_retval_c99="guessing no";;
1055          netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
1056                                # Guess yes on BeOS.
1057          beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
1058                                # If we don't know, assume the worst.
1059          *)                    gl_cv_func_snprintf_retval_c99="guessing no";;
1060        esac
1061 changequote([,])dnl
1062       ])
1063     ])
1064 ])
1065
1066 dnl Test whether the snprintf function supports the %n format directive
1067 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1068 dnl Result is gl_cv_func_snprintf_directive_n.
1069
1070 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1071 [
1072   AC_REQUIRE([AC_PROG_CC])
1073   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1074   AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1075     [gl_cv_func_snprintf_directive_n],
1076     [
1077       AC_TRY_RUN([
1078 #include <stdio.h>
1079 #include <string.h>
1080 static char fmtstring[10];
1081 static char buf[100];
1082 int main ()
1083 {
1084   int count = -1;
1085   /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
1086      support %n in format strings in read-only memory but not in writable
1087      memory.  */
1088   strcpy (fmtstring, "%d %n");
1089   snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1090   if (count != 6)
1091     return 1;
1092   return 0;
1093 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
1094       [
1095 changequote(,)dnl
1096        case "$host_os" in
1097                                # Guess yes on glibc systems.
1098          *-gnu*)               gl_cv_func_snprintf_directive_n="guessing yes";;
1099                                # Guess yes on FreeBSD >= 5.
1100          freebsd[1-4]*)        gl_cv_func_snprintf_directive_n="guessing no";;
1101          freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1102                                # Guess yes on MacOS X >= 10.3.
1103          darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
1104          darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1105                                # Guess yes on Solaris >= 2.6.
1106          solaris2.[0-5]*)      gl_cv_func_snprintf_directive_n="guessing no";;
1107          solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
1108                                # Guess yes on AIX >= 4.
1109          aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1110          aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1111                                # Guess yes on IRIX >= 6.5.
1112          irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
1113                                # Guess yes on OSF/1 >= 5.
1114          osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
1115          osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
1116                                # Guess yes on NetBSD >= 3.
1117          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1118                                gl_cv_func_snprintf_directive_n="guessing no";;
1119          netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
1120                                # Guess yes on BeOS.
1121          beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
1122                                # If we don't know, assume the worst.
1123          *)                    gl_cv_func_snprintf_directive_n="guessing no";;
1124        esac
1125 changequote([,])dnl
1126       ])
1127     ])
1128 ])
1129
1130 dnl Test whether the snprintf function, when passed a size = 1, writes any
1131 dnl output without bounds in this case, behaving like sprintf. This is the
1132 dnl case on Linux libc5.
1133 dnl Result is gl_cv_func_snprintf_size1.
1134
1135 AC_DEFUN([gl_SNPRINTF_SIZE1],
1136 [
1137   AC_REQUIRE([AC_PROG_CC])
1138   AC_CACHE_CHECK([whether snprintf respects a size of 1],
1139     [gl_cv_func_snprintf_size1],
1140     [
1141       AC_TRY_RUN([
1142 #include <stdio.h>
1143 int main()
1144 {
1145   static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1146   snprintf (buf, 1, "%d", 12345);
1147   return buf[1] != 'E';
1148 }],
1149       [gl_cv_func_snprintf_size1=yes],
1150       [gl_cv_func_snprintf_size1=no],
1151       [gl_cv_func_snprintf_size1="guessing yes"])
1152     ])
1153 ])
1154
1155 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1156 dnl output. (ISO C99, POSIX:2001)
1157 dnl For example, snprintf nevertheless writes a NUL byte in this case
1158 dnl on OSF/1 5.1:
1159 dnl     ---------------------------------------------------------------------
1160 dnl     #include <stdio.h>
1161 dnl     int main()
1162 dnl     {
1163 dnl       static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1164 dnl       snprintf (buf, 0, "%d", 12345);
1165 dnl       return buf[0] != 'D';
1166 dnl     }
1167 dnl     ---------------------------------------------------------------------
1168 dnl And vsnprintf writes any output without bounds in this case, behaving like
1169 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1170 dnl     ---------------------------------------------------------------------
1171 dnl     #include <stdarg.h>
1172 dnl     #include <stdio.h>
1173 dnl     static int my_snprintf (char *buf, int size, const char *format, ...)
1174 dnl     {
1175 dnl       va_list args;
1176 dnl       int ret;
1177 dnl       va_start (args, format);
1178 dnl       ret = vsnprintf (buf, size, format, args);
1179 dnl       va_end (args);
1180 dnl       return ret;
1181 dnl     }
1182 dnl     int main()
1183 dnl     {
1184 dnl       static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1185 dnl       my_snprintf (buf, 0, "%d", 12345);
1186 dnl       return buf[0] != 'D';
1187 dnl     }
1188 dnl     ---------------------------------------------------------------------
1189 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1190
1191 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1192 [
1193   AC_REQUIRE([AC_PROG_CC])
1194   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1195   AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1196     [gl_cv_func_vsnprintf_zerosize_c99],
1197     [
1198       AC_TRY_RUN([
1199 #include <stdarg.h>
1200 #include <stdio.h>
1201 static int my_snprintf (char *buf, int size, const char *format, ...)
1202 {
1203   va_list args;
1204   int ret;
1205   va_start (args, format);
1206   ret = vsnprintf (buf, size, format, args);
1207   va_end (args);
1208   return ret;
1209 }
1210 int main()
1211 {
1212   static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1213   my_snprintf (buf, 0, "%d", 12345);
1214   return buf[0] != 'D';
1215 }],
1216       [gl_cv_func_vsnprintf_zerosize_c99=yes],
1217       [gl_cv_func_vsnprintf_zerosize_c99=no],
1218       [
1219 changequote(,)dnl
1220        case "$host_os" in
1221                                # Guess yes on glibc systems.
1222          *-gnu*)               gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1223                                # Guess yes on FreeBSD >= 5.
1224          freebsd[1-4]*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1225          freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1226                                # Guess yes on MacOS X >= 10.3.
1227          darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1228          darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1229                                # Guess yes on Cygwin.
1230          cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1231                                # Guess yes on Solaris >= 2.6.
1232          solaris2.[0-5]*)      gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1233          solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1234                                # Guess yes on AIX >= 4.
1235          aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1236          aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1237                                # Guess yes on IRIX >= 6.5.
1238          irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1239                                # Guess yes on NetBSD >= 3.
1240          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1241                                gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1242          netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1243                                # Guess yes on BeOS.
1244          beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1245                                # Guess yes on mingw.
1246          mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1247                                # If we don't know, assume the worst.
1248          *)                    gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1249        esac
1250 changequote([,])dnl
1251       ])
1252     ])
1253 ])
1254
1255 dnl The results of these tests on various platforms are:
1256 dnl
1257 dnl 1 = gl_PRINTF_SIZES_C99
1258 dnl 2 = gl_PRINTF_LONG_DOUBLE
1259 dnl 3 = gl_PRINTF_INFINITE
1260 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1261 dnl 5 = gl_PRINTF_DIRECTIVE_A
1262 dnl 6 = gl_PRINTF_DIRECTIVE_F
1263 dnl 7 = gl_PRINTF_DIRECTIVE_N
1264 dnl 8 = gl_PRINTF_POSITIONS
1265 dnl 9 = gl_PRINTF_FLAG_GROUPING
1266 dnl 10 = gl_PRINTF_FLAG_LEFTADJUST
1267 dnl 11 = gl_PRINTF_FLAG_ZERO
1268 dnl 12 = gl_PRINTF_PRECISION
1269 dnl 13 = gl_PRINTF_ENOMEM
1270 dnl 14 = gl_SNPRINTF_PRESENCE
1271 dnl 15 = gl_SNPRINTF_TRUNCATION_C99
1272 dnl 16 = gl_SNPRINTF_RETVAL_C99
1273 dnl 17 = gl_SNPRINTF_DIRECTIVE_N
1274 dnl 18 = gl_SNPRINTF_SIZE1
1275 dnl 19 = gl_VSNPRINTF_ZEROSIZE_C99
1276 dnl
1277 dnl 1 = checking whether printf supports size specifiers as in C99...
1278 dnl 2 = checking whether printf supports 'long double' arguments...
1279 dnl 3 = checking whether printf supports infinite 'double' arguments...
1280 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1281 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1282 dnl 6 = checking whether printf supports the 'F' directive...
1283 dnl 7 = checking whether printf supports the 'n' directive...
1284 dnl 8 = checking whether printf supports POSIX/XSI format strings with positions...
1285 dnl 9 = checking whether printf supports the grouping flag...
1286 dnl 10 = checking whether printf supports the left-adjust flag correctly...
1287 dnl 11 = checking whether printf supports the zero flag correctly...
1288 dnl 12 = checking whether printf supports large precisions...
1289 dnl 13 = checking whether printf survives out-of-memory conditions...
1290 dnl 14 = checking for snprintf...
1291 dnl 15 = checking whether snprintf truncates the result as in C99...
1292 dnl 16 = checking whether snprintf returns a byte count as in C99...
1293 dnl 17 = checking whether snprintf fully supports the 'n' directive...
1294 dnl 18 = checking whether snprintf respects a size of 1...
1295 dnl 19 = checking whether vsnprintf respects a zero size as in C99...
1296 dnl
1297 dnl . = yes, # = no.
1298 dnl
1299 dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
1300 dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
1301 dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  .  .  .  .  .  .
1302 dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  .  #  .  #  .  .  .  .  .  .
1303 dnl   MacOS X 10.3.9                 .  .  .  .  #  .  .  .  .  .  #  .  #  .  .  .  .  .  .
1304 dnl   OpenBSD 3.9, 4.0               .  .  #  #  #  #  .  .  #  .  #  .  #  .  .  .  .  .  .
1305 dnl   Cygwin 2007 (= Cygwin 1.5.24)  .  .  .  .  #  #  .  .  .  ?  #  ?  ?  .  .  .  .  .  .
1306 dnl   Cygwin 2006 (= Cygwin 1.5.19)  #  .  .  .  #  #  .  .  #  ?  #  ?  ?  .  .  .  .  .  .
1307 dnl   Solaris 10                     .  .  #  #  #  .  .  .  .  .  #  .  .  .  .  .  .  .  .
1308 dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  .  .  .  #  .  .  .  .  .  .  .  .
1309 dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  .  .  .  #  .  .  #  #  #  #  #  #
1310 dnl   AIX 5.2                        .  .  #  #  #  .  .  .  .  .  #  .  .  .  .  .  .  .  .
1311 dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  .  #  .  .  .  .  .  .  .  .
1312 dnl   HP-UX 11.31                    .  .  .  .  #  .  .  .  .  .  #  .  .  .  .  #  #  .  .
1313 dnl   HP-UX 11.{00,11,23}            #  .  .  .  #  #  .  .  .  .  #  .  .  .  .  #  #  .  #
1314 dnl   HP-UX 10.20                    #  .  .  .  #  #  .  .  .  #  #  .  .  .  .  #  #  ?  #
1315 dnl   IRIX 6.5                       #  .  #  #  #  #  .  .  .  .  #  .  .  .  .  #  .  .  .
1316 dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  .  #  .  .  .  .  #  .  .  #
1317 dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  .  #  .  .  #  #  #  #  #  #
1318 dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  .  ?  ?  ?  ?  ?  .  .  .  ?  ?  ?
1319 dnl   NetBSD 3.0                     .  .  .  .  #  #  .  #  #  ?  #  .  #  .  .  .  .  .  .
1320 dnl   Haiku                          .  .  .  #  #  #  .  .  .  .  .  .  ?  .  .  .  .  .  .
1321 dnl   BeOS                           #  #  .  #  #  #  .  #  .  ?  .  #  ?  .  .  .  .  .  .
1322 dnl   mingw                          #  #  #  #  #  #  .  #  #  .  #  #  ?  .  #  #  #  .  .