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