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