e09c9d88049ca1e930ef43576e9a18d67fa2d57e
[gnulib.git] / m4 / printf.m4
1 # printf.m4 serial 8
2 dnl Copyright (C) 2003, 2007 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 dnl Test whether the *printf family of functions supports the 'j', 'z', 't',
8 dnl 'L' size specifiers. (ISO C99, POSIX:2001)
9 dnl Result is gl_cv_func_printf_sizes_c99.
10
11 AC_DEFUN([gl_PRINTF_SIZES_C99],
12 [
13   AC_REQUIRE([AC_PROG_CC])
14   AC_REQUIRE([gl_AC_HEADER_STDINT_H])
15   AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
16   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
17   AC_CACHE_CHECK([whether printf supports size specifiers as in C99],
18     [gl_cv_func_printf_sizes_c99], 
19     [
20       AC_TRY_RUN([
21 #include <stddef.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <sys/types.h>
25 #if HAVE_STDINT_H_WITH_UINTMAX
26 # include <stdint.h>
27 #endif
28 #if HAVE_INTTYPES_H_WITH_UINTMAX
29 # include <inttypes.h>
30 #endif
31 static char buf[100];
32 int main ()
33 {
34 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
35   buf[0] = '\0';
36   if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
37       || strcmp (buf, "12345671 33") != 0)
38     return 1;
39 #endif
40   buf[0] = '\0';
41   if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
42       || strcmp (buf, "12345672 33") != 0)
43     return 1;
44   buf[0] = '\0';
45   if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
46       || strcmp (buf, "12345673 33") != 0)
47     return 1;
48   buf[0] = '\0';
49   if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
50       || strcmp (buf, "1.5 33") != 0)
51     return 1;
52   return 0;
53 }], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no],
54       [
55 changequote(,)dnl
56        case "$host_os" in
57                                # Guess yes on glibc systems.
58          *-gnu*)               gl_cv_func_printf_sizes_c99="guessing yes";;
59                                # Guess yes on FreeBSD >= 5.
60          freebsd[1-4]*)        gl_cv_func_printf_sizes_c99="guessing no";;
61          freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
62                                # Guess yes on MacOS X >= 10.3.
63          darwin[1-6].*)        gl_cv_func_printf_sizes_c99="guessing no";;
64          darwin*)              gl_cv_func_printf_sizes_c99="guessing yes";;
65                                # Guess yes on OpenBSD >= 3.9.
66          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
67                                gl_cv_func_printf_sizes_c99="guessing no";;
68          openbsd*)             gl_cv_func_printf_sizes_c99="guessing yes";;
69                                # Guess yes on Solaris >= 2.10.
70          solaris2.[0-9]*)      gl_cv_func_printf_sizes_c99="guessing no";;
71          solaris*)             gl_cv_func_printf_sizes_c99="guessing yes";;
72                                # Guess yes on NetBSD >= 3.
73          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
74                                gl_cv_func_printf_sizes_c99="guessing no";;
75          netbsd*)              gl_cv_func_printf_sizes_c99="guessing yes";;
76                                # If we don't know, assume the worst.
77          *)                    gl_cv_func_printf_sizes_c99="guessing no";;
78        esac
79 changequote([,])dnl
80       ])
81     ])
82 ])
83
84 dnl Test whether the *printf family of functions supports the 'a' and 'A'
85 dnl conversion specifier for hexadecimal output of floating-point numbers.
86 dnl (ISO C99, POSIX:2001)
87 dnl Result is gl_cv_func_printf_directive_a.
88
89 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
90 [
91   AC_REQUIRE([AC_PROG_CC])
92   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
93   AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
94     [gl_cv_func_printf_directive_a], 
95     [
96       AC_TRY_RUN([
97 #include <stdio.h>
98 #include <string.h>
99 static char buf[100];
100 int main ()
101 {
102   if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
103       || (strcmp (buf, "0x1.922p+1 33") != 0
104           && strcmp (buf, "0x3.244p+0 33") != 0
105           && strcmp (buf, "0x6.488p-1 33") != 0
106           && strcmp (buf, "0xc.91p-2 33") != 0))
107     return 1;
108   if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
109       || (strcmp (buf, "-0X1.922P+1 33") != 0
110           && strcmp (buf, "-0X3.244P+0 33") != 0
111           && strcmp (buf, "-0X6.488P-1 33") != 0
112           && strcmp (buf, "-0XC.91P-2 33") != 0))
113     return 1;
114   /* This catches a FreeBSD 6.1 bug: it doesn't round.  */
115   if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
116       || (strcmp (buf, "0x1.83p+0 33") != 0
117           && strcmp (buf, "0x3.05p-1 33") != 0
118           && strcmp (buf, "0x6.0ap-2 33") != 0
119           && strcmp (buf, "0xc.14p-3 33") != 0))
120     return 1;
121   /* This catches a FreeBSD 6.1 bug.  See
122      <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
123   if (sprintf (buf, "%010a %d", 1.0 / 0.0, 33, 44, 55) < 0
124       || buf[0] == '0')
125     return 1;
126   /* This catches a MacOS X 10.3.9 (Darwin 7.9) bug.  */
127   if (sprintf (buf, "%.1a", 1.999) < 0
128       || (strcmp (buf, "0x1.0p+1") != 0
129           && strcmp (buf, "0x2.0p+0") != 0
130           && strcmp (buf, "0x4.0p-1") != 0
131           && strcmp (buf, "0x8.0p-2") != 0))
132     return 1;
133   /* This catches the same MacOS X 10.3.9 (Darwin 7.9) bug and also a
134      glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
135   if (sprintf (buf, "%.1La", 1.999L) < 0
136       || (strcmp (buf, "0x1.0p+1") != 0
137           && strcmp (buf, "0x2.0p+0") != 0
138           && strcmp (buf, "0x4.0p-1") != 0
139           && strcmp (buf, "0x8.0p-2") != 0))
140     return 1;
141   return 0;
142 }], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no],
143       [
144        case "$host_os" in
145                                # Guess yes on glibc >= 2.5 systems.
146          *-gnu*)
147            AC_EGREP_CPP([BZ2908], [
148              #include <features.h>
149              #ifdef __GNU_LIBRARY__
150               #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)
151                BZ2908
152               #endif
153              #endif
154              ],
155              [gl_cv_func_printf_directive_a="guessing yes"],
156              [gl_cv_func_printf_directive_a="guessing no"])
157            ;;
158                                # If we don't know, assume the worst.
159          *)                    gl_cv_func_printf_directive_a="guessing no";;
160        esac
161       ])
162     ])
163 ])
164
165 dnl Test whether the *printf family of functions supports the %F format
166 dnl directive. (ISO C99, POSIX:2001)
167 dnl Result is gl_cv_func_printf_directive_f.
168
169 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
170 [
171   AC_REQUIRE([AC_PROG_CC])
172   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
173   AC_CACHE_CHECK([whether printf supports the 'F' directive],
174     [gl_cv_func_printf_directive_f], 
175     [
176       AC_TRY_RUN([
177 #include <stdio.h>
178 #include <string.h>
179 static char buf[100];
180 int main ()
181 {
182   if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
183       || strcmp (buf, "1234567.000000 33") != 0)
184     return 1;
185   if (sprintf (buf, "%F", 1.0 / 0.0) < 0
186       || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
187     return 1;
188   /* This catches a Cygwin 2007 bug.  */
189   if (sprintf (buf, "%.F", 1234.0) < 0
190       || strcmp (buf, "1234") != 0)
191     return 1;
192   return 0;
193 }], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no],
194       [
195 changequote(,)dnl
196        case "$host_os" in
197                                # Guess yes on glibc systems.
198          *-gnu*)               gl_cv_func_printf_directive_f="guessing yes";;
199                                # Guess yes on FreeBSD >= 6.
200          freebsd[1-5]*)        gl_cv_func_printf_directive_f="guessing no";;
201          freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
202                                # Guess yes on MacOS X >= 10.3.
203          darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
204          darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
205                                # Guess yes on Solaris >= 2.10.
206          solaris2.[0-9]*)      gl_cv_func_printf_directive_f="guessing no";;
207          solaris*)             gl_cv_func_printf_directive_f="guessing yes";;
208                                # If we don't know, assume the worst.
209          *)                    gl_cv_func_printf_directive_f="guessing no";;
210        esac
211 changequote([,])dnl
212       ])
213     ])
214 ])
215
216 dnl Test whether the *printf family of functions supports the %n format
217 dnl directive. (ISO C99, POSIX:2001)
218 dnl Result is gl_cv_func_printf_directive_n.
219
220 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
221 [
222   AC_REQUIRE([AC_PROG_CC])
223   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
224   AC_CACHE_CHECK([whether printf supports the 'n' directive],
225     [gl_cv_func_printf_directive_n], 
226     [
227       AC_TRY_RUN([
228 #include <stdio.h>
229 #include <string.h>
230 static char buf[100];
231 int main ()
232 {
233   int count = -1;
234   if (sprintf (buf, "%d %n", 123, &count, 33, 44, 55) < 0
235       || strcmp (buf, "123 ") != 0
236       || count != 4)
237     return 1;
238   return 0;
239 }], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no],
240       [
241 changequote(,)dnl
242        case "$host_os" in
243          *)     gl_cv_func_printf_directive_n="guessing yes";;
244        esac
245 changequote([,])dnl
246       ])
247     ])
248 ])
249
250 dnl Test whether the *printf family of functions supports POSIX/XSI format
251 dnl strings with positions. (POSIX:2001)
252 dnl Result is gl_cv_func_printf_positions.
253
254 AC_DEFUN([gl_PRINTF_POSITIONS],
255 [
256   AC_REQUIRE([AC_PROG_CC])
257   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
258   AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
259     [gl_cv_func_printf_positions], 
260     [
261       AC_TRY_RUN([
262 #include <stdio.h>
263 #include <string.h>
264 /* The string "%2$d %1$d", with dollar characters protected from the shell's
265    dollar expansion (possibly an autoconf bug).  */
266 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
267 static char buf[100];
268 int main ()
269 {
270   sprintf (buf, format, 33, 55);
271   return (strcmp (buf, "55 33") != 0);
272 }], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no],
273       [
274 changequote(,)dnl
275        case "$host_os" in
276          netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
277                        gl_cv_func_printf_positions="guessing no";;
278          beos*)        gl_cv_func_printf_positions="guessing no";;
279          mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
280          *)            gl_cv_func_printf_positions="guessing yes";;
281        esac
282 changequote([,])dnl
283       ])
284     ])
285 ])
286
287 dnl Test whether the *printf family of functions supports POSIX/XSI format
288 dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
289 dnl Result is gl_cv_func_printf_flag_grouping.
290
291 AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
292 [
293   AC_REQUIRE([AC_PROG_CC])
294   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
295   AC_CACHE_CHECK([whether printf supports the grouping flag],
296     [gl_cv_func_printf_flag_grouping],
297     [
298       AC_TRY_RUN([
299 #include <stdio.h>
300 #include <string.h>
301 static char buf[100];
302 int main ()
303 {
304   if (sprintf (buf, "%'d %d", 1234567, 99) < 0
305       || buf[strlen (buf) - 1] != '9')
306     return 1;
307   return 0;
308 }], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no],
309       [
310 changequote(,)dnl
311        case "$host_os" in
312          netbsd*)      gl_cv_func_printf_flag_grouping="guessing no";;
313          mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
314          *)            gl_cv_func_printf_flag_grouping="guessing yes";;
315        esac
316 changequote([,])dnl
317       ])
318     ])
319 ])
320
321 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
322 dnl Result is ac_cv_func_snprintf.
323
324 AC_DEFUN([gl_SNPRINTF_PRESENCE],
325 [
326   AC_CHECK_FUNCS_ONCE([snprintf])
327 ])
328
329 dnl Test whether the string produced by the snprintf function is always NUL
330 dnl terminated. (ISO C99, POSIX:2001)
331 dnl Result is gl_cv_func_snprintf_truncation_c99.
332
333 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
334 [
335   AC_REQUIRE([AC_PROG_CC])
336   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
337   AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
338     [gl_cv_func_snprintf_truncation_c99], 
339     [
340       AC_TRY_RUN([
341 #include <stdio.h>
342 #include <string.h>
343 static char buf[100];
344 int main ()
345 {
346   strcpy (buf, "ABCDEF");
347   snprintf (buf, 3, "%d %d", 4567, 89);
348   if (memcmp (buf, "45\0DEF", 6) != 0)
349     return 1;
350   return 0;
351 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
352       [
353 changequote(,)dnl
354        case "$host_os" in
355                                # Guess yes on glibc systems.
356          *-gnu*)               gl_cv_func_snprintf_truncation_c99="guessing yes";;
357                                # Guess yes on FreeBSD >= 5.
358          freebsd[1-4]*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
359          freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
360                                # Guess yes on MacOS X >= 10.3.
361          darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
362          darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
363                                # Guess yes on OpenBSD >= 3.9.
364          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
365                                gl_cv_func_snprintf_truncation_c99="guessing no";;
366          openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
367                                # Guess yes on Solaris >= 2.6.
368          solaris2.[0-5]*)      gl_cv_func_snprintf_truncation_c99="guessing no";;
369          solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
370                                # Guess yes on AIX >= 4.
371          aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
372          aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
373                                # Guess yes on HP-UX >= 11.
374          hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
375          hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
376                                # Guess yes on IRIX >= 6.5.
377          irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
378                                # Guess yes on OSF/1 >= 5.
379          osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
380          osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
381                                # Guess yes on NetBSD >= 3.
382          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
383                                gl_cv_func_snprintf_truncation_c99="guessing no";;
384          netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
385                                # Guess yes on BeOS.
386          beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
387                                # If we don't know, assume the worst.
388          *)                    gl_cv_func_snprintf_truncation_c99="guessing no";;
389        esac
390 changequote([,])dnl
391       ])
392     ])
393 ])
394
395 dnl Test whether the return value of the snprintf function is the number
396 dnl of bytes (excluding the terminating NUL) that would have been produced
397 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
398 dnl For example, this test program fails on IRIX 6.5:
399 dnl     ---------------------------------------------------------------------
400 dnl     #include <stdio.h>
401 dnl     int main()
402 dnl     {
403 dnl       static char buf[8];
404 dnl       int retval = snprintf (buf, 3, "%d", 12345);
405 dnl       return retval >= 0 && retval < 3;
406 dnl     }
407 dnl     ---------------------------------------------------------------------
408 dnl Result is gl_cv_func_snprintf_retval_c99.
409
410 AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
411 [
412   AC_REQUIRE([AC_PROG_CC])
413   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
414   AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
415     [gl_cv_func_snprintf_retval_c99], 
416     [
417       AC_TRY_RUN([
418 #include <stdio.h>
419 #include <string.h>
420 static char buf[100];
421 int main ()
422 {
423   strcpy (buf, "ABCDEF");
424   if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
425     return 1;
426   return 0;
427 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
428       [
429 changequote(,)dnl
430        case "$host_os" in
431                                # Guess yes on glibc systems.
432          *-gnu*)               gl_cv_func_snprintf_retval_c99="guessing yes";;
433                                # Guess yes on FreeBSD >= 5.
434          freebsd[1-4]*)        gl_cv_func_snprintf_retval_c99="guessing no";;
435          freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
436                                # Guess yes on MacOS X >= 10.3.
437          darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
438          darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
439                                # Guess yes on OpenBSD >= 3.9.
440          openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
441                                gl_cv_func_snprintf_retval_c99="guessing no";;
442          openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
443                                # Guess yes on Solaris >= 2.6.
444          solaris2.[0-5]*)      gl_cv_func_snprintf_retval_c99="guessing no";;
445          solaris*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
446                                # Guess yes on AIX >= 4.
447          aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
448          aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
449                                # Guess yes on NetBSD >= 3.
450          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
451                                gl_cv_func_snprintf_retval_c99="guessing no";;
452          netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
453                                # Guess yes on BeOS.
454          beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
455                                # If we don't know, assume the worst.
456          *)                    gl_cv_func_snprintf_retval_c99="guessing no";;
457        esac
458 changequote([,])dnl
459       ])
460     ])
461 ])
462
463 dnl Test whether the snprintf function supports the %n format directive
464 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
465 dnl Result is gl_cv_func_snprintf_directive_n.
466
467 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
468 [
469   AC_REQUIRE([AC_PROG_CC])
470   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
471   AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
472     [gl_cv_func_snprintf_directive_n], 
473     [
474       AC_TRY_RUN([
475 #include <stdio.h>
476 #include <string.h>
477 static char buf[100];
478 int main ()
479 {
480   int count = -1;
481   snprintf (buf, 4, "%d %n", 12345, &count, 33, 44, 55);
482   if (count != 6)
483     return 1;
484   return 0;
485 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
486       [
487 changequote(,)dnl
488        case "$host_os" in
489                                # Guess yes on glibc systems.
490          *-gnu*)               gl_cv_func_snprintf_directive_n="guessing yes";;
491                                # Guess yes on FreeBSD >= 5.
492          freebsd[1-4]*)        gl_cv_func_snprintf_directive_n="guessing no";;
493          freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
494                                # Guess yes on MacOS X >= 10.3.
495          darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
496          darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
497                                # Guess yes on Solaris >= 2.6.
498          solaris2.[0-5]*)      gl_cv_func_snprintf_directive_n="guessing no";;
499          solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
500                                # Guess yes on AIX >= 4.
501          aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
502          aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
503                                # Guess yes on IRIX >= 6.5.
504          irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
505                                # Guess yes on OSF/1 >= 5.
506          osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
507          osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
508                                # Guess yes on NetBSD >= 3.
509          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
510                                gl_cv_func_snprintf_directive_n="guessing no";;
511          netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
512                                # Guess yes on BeOS.
513          beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
514                                # If we don't know, assume the worst.
515          *)                    gl_cv_func_snprintf_directive_n="guessing no";;
516        esac
517 changequote([,])dnl
518       ])
519     ])
520 ])
521
522 dnl Test whether the vsnprintf function, when passed a zero size, produces no
523 dnl output. (ISO C99, POSIX:2001)
524 dnl For example, snprintf nevertheless writes a NUL byte in this case
525 dnl on OSF/1 5.1:
526 dnl     ---------------------------------------------------------------------
527 dnl     #include <stdio.h>
528 dnl     int main()
529 dnl     {
530 dnl       static char buf[8] = "DEADBEEF";
531 dnl       snprintf (buf, 0, "%d", 12345);
532 dnl       return buf[0] != 'D';
533 dnl     }
534 dnl     ---------------------------------------------------------------------
535 dnl And vsnprintf writes any output without bounds in this case, behaving like
536 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
537 dnl     ---------------------------------------------------------------------
538 dnl     #include <stdarg.h>
539 dnl     #include <stdio.h>
540 dnl     static int my_snprintf (char *buf, int size, const char *format, ...)
541 dnl     {
542 dnl       va_list args;
543 dnl       int ret;
544 dnl       va_start (args, format);
545 dnl       ret = vsnprintf (buf, size, format, args);
546 dnl       va_end (args);
547 dnl       return ret;
548 dnl     }
549 dnl     int main()
550 dnl     {
551 dnl       static char buf[8] = "DEADBEEF";
552 dnl       my_snprintf (buf, 0, "%d", 12345);
553 dnl       return buf[0] != 'D';
554 dnl     }
555 dnl     ---------------------------------------------------------------------
556 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
557
558 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
559 [
560   AC_REQUIRE([AC_PROG_CC])
561   AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
562   AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
563     [gl_cv_func_vsnprintf_zerosize_c99], 
564     [
565       AC_TRY_RUN([
566 #include <stdarg.h>
567 #include <stdio.h>
568 static int my_snprintf (char *buf, int size, const char *format, ...)
569 {
570   va_list args;
571   int ret;
572   va_start (args, format);
573   ret = vsnprintf (buf, size, format, args);
574   va_end (args);
575   return ret;
576 }
577 int main()
578 {
579   static char buf[8] = "DEADBEEF";
580   my_snprintf (buf, 0, "%d", 12345);
581   return buf[0] != 'D';
582 }],
583       [gl_cv_func_vsnprintf_zerosize_c99=yes],
584       [gl_cv_func_vsnprintf_zerosize_c99=no],
585       [
586 changequote(,)dnl
587        case "$host_os" in
588                                # Guess yes on glibc systems.
589          *-gnu*)               gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
590                                # Guess yes on FreeBSD >= 5.
591          freebsd[1-4]*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
592          freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
593                                # Guess yes on MacOS X >= 10.3.
594          darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
595          darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
596                                # Guess yes on Solaris >= 2.6.
597          solaris2.[0-5]*)      gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
598          solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
599                                # Guess yes on AIX >= 4.
600          aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
601          aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
602                                # Guess yes on IRIX >= 6.5.
603          irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
604                                # Guess yes on NetBSD >= 3.
605          netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
606                                gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
607          netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
608                                # Guess yes on BeOS.
609          beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
610                                # Guess yes on mingw.
611          mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
612                                # If we don't know, assume the worst.
613          *)                    gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
614        esac
615 changequote([,])dnl
616       ])
617     ])
618 ])
619
620 dnl The results of these tests on various platforms are:
621 dnl
622 dnl 1 = gl_PRINTF_SIZES_C99
623 dnl 2 = gl_PRINTF_DIRECTIVE_A
624 dnl 3 = gl_PRINTF_DIRECTIVE_F
625 dnl 4 = gl_PRINTF_DIRECTIVE_N
626 dnl 5 = gl_PRINTF_POSITIONS
627 dnl 6 = gl_PRINTF_FLAG_GROUPING
628 dnl 7 = gl_SNPRINTF_PRESENCE
629 dnl 8 = gl_SNPRINTF_TRUNCATION_C99
630 dnl 9 = gl_SNPRINTF_RETVAL_C99
631 dnl 10 = gl_SNPRINTF_DIRECTIVE_N
632 dnl 11 = gl_VSNPRINTF_ZEROSIZE_C99
633 dnl
634 dnl 1 = checking whether printf supports size specifiers as in C99...
635 dnl 2 = checking whether printf supports the 'a' and 'A' directives...
636 dnl 3 = checking whether printf supports the 'F' directive...
637 dnl 4 = checking whether printf supports the 'n' directive...
638 dnl 5 = checking whether printf supports POSIX/XSI format strings with positions...
639 dnl 6 = checking whether printf supports the grouping flag...
640 dnl 7 = checking for snprintf...
641 dnl 8 = checking whether snprintf truncates the result as in C99...
642 dnl 9 = checking whether snprintf returns a byte count as in C99...
643 dnl 10 = checking whether snprintf fully supports the 'n' directive...
644 dnl 11 = checking whether vsnprintf respects a zero size as in C99...
645 dnl
646 dnl . = yes, # = no.
647 dnl
648 dnl                                        1  2  3  4  5  6  7  8  9 10 11
649 dnl   glibc 2.5                            .  .  .  .  .  .  .  .  .  .  .
650 dnl   glibc 2.3.6                          .  #  .  .  .  .  .  .  .  .  .
651 dnl   FreeBSD 5.4, 6.1                     .  ?  .  .  .  .  .  .  .  .  .
652 dnl   MacOS X 10.3.9                       .  #  .  .  .  .  .  .  .  .  .
653 dnl   OpenBSD 3.9, 4.0                     .  #  ?  .  .  ?  .  .  .  ?  ?
654 dnl   Cygwin 2007                          .  #  #  .  .  ?  .  .  .  .  ?
655 dnl   Cygwin 2006                          #  #  #  .  .  ?  .  .  .  .  ?
656 dnl   Solaris 10                           .  #  .  .  .  .  .  .  .  .  .
657 dnl   Solaris 2.6 ... 9                    #  #  #  .  .  .  .  .  .  .  .
658 dnl   Solaris 2.5.1                        #  #  #  .  .  .  #  #  #  #  #
659 dnl   AIX 5.2                              .  #  .  .  .  .  .  .  .  .  .
660 dnl   AIX 4.3.2, 5.1                       #  #  #  .  .  .  .  .  .  .  .
661 dnl   HP-UX 11.31                          .  #  .  .  .  .  .  .  #  #  .
662 dnl   HP-UX 10.20, 11.00, 11.11, 11.23     #  #  #  .  .  .  .  .  #  #  #
663 dnl   IRIX 6.5                             #  #  #  .  .  .  .  .  #  .  .
664 dnl   OSF/1 5.1                            #  #  #  .  .  .  .  .  #  .  #
665 dnl   OSF/1 4.0d                           #  #  #  .  .  .  #  #  #  #  #
666 dnl   NetBSD 4.0                           .  ?  ?  .  .  ?  .  .  .  ?  ?
667 dnl   NetBSD 3.0                           .  #  #  .  #  #  .  .  .  .  .
668 dnl   BeOS                                 #  #  #  .  #  .  .  .  .  .  .
669 dnl   mingw                                #  #  #  .  #  #  .  #  #  #  .