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.
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.
11 AC_DEFUN([gl_PRINTF_SIZES_C99],
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],
24 #include <sys/types.h>
25 #if HAVE_STDINT_H_WITH_UINTMAX
28 #if HAVE_INTTYPES_H_WITH_UINTMAX
29 # include <inttypes.h>
34 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
36 if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
37 || strcmp (buf, "12345671 33") != 0)
41 if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
42 || strcmp (buf, "12345672 33") != 0)
45 if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
46 || strcmp (buf, "12345673 33") != 0)
49 if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
50 || strcmp (buf, "1.5 33") != 0)
53 }], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no],
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";;
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.
89 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
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],
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))
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))
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))
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
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))
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))
142 }], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no],
145 # Guess yes on glibc >= 2.5 systems.
147 AC_EGREP_CPP([BZ2908], [
148 #include <features.h>
149 #ifdef __GNU_LIBRARY__
150 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)
155 [gl_cv_func_printf_directive_a="guessing yes"],
156 [gl_cv_func_printf_directive_a="guessing no"])
158 # If we don't know, assume the worst.
159 *) gl_cv_func_printf_directive_a="guessing no";;
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.
169 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
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],
179 static char buf[100];
182 if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
183 || strcmp (buf, "1234567.000000 33") != 0)
185 if (sprintf (buf, "%F", 1.0 / 0.0) < 0
186 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
188 /* This catches a Cygwin 2007 bug. */
189 if (sprintf (buf, "%.F", 1234.0) < 0
190 || strcmp (buf, "1234") != 0)
193 }], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no],
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";;
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.
220 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
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],
230 static char buf[100];
234 if (sprintf (buf, "%d %n", 123, &count, 33, 44, 55) < 0
235 || strcmp (buf, "123 ") != 0
239 }], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no],
243 *) gl_cv_func_printf_directive_n="guessing yes";;
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.
254 AC_DEFUN([gl_PRINTF_POSITIONS],
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],
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];
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],
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";;
287 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
288 dnl Result is ac_cv_func_snprintf.
290 AC_DEFUN([gl_SNPRINTF_PRESENCE],
292 AC_CHECK_FUNCS_ONCE([snprintf])
295 dnl Test whether the string produced by the snprintf function is always NUL
296 dnl terminated. (ISO C99, POSIX:2001)
297 dnl Result is gl_cv_func_snprintf_truncation_c99.
299 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
301 AC_REQUIRE([AC_PROG_CC])
302 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
303 AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
304 [gl_cv_func_snprintf_truncation_c99],
309 static char buf[100];
312 strcpy (buf, "ABCDEF");
313 snprintf (buf, 3, "%d %d", 4567, 89);
314 if (memcmp (buf, "45\0DEF", 6) != 0)
317 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
321 # Guess yes on glibc systems.
322 *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
323 # Guess yes on FreeBSD >= 5.
324 freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
325 freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
326 # Guess yes on MacOS X >= 10.3.
327 darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
328 darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
329 # Guess yes on OpenBSD >= 3.9.
330 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
331 gl_cv_func_snprintf_truncation_c99="guessing no";;
332 openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
333 # Guess yes on Solaris >= 2.6.
334 solaris2.[0-5]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
335 solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
336 # Guess yes on AIX >= 4.
337 aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
338 aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
339 # Guess yes on HP-UX >= 11.
340 hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
341 hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
342 # Guess yes on IRIX >= 6.5.
343 irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
344 # Guess yes on OSF/1 >= 5.
345 osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
346 osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
347 # Guess yes on NetBSD >= 3.
348 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
349 gl_cv_func_snprintf_truncation_c99="guessing no";;
350 netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
352 beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
353 # If we don't know, assume the worst.
354 *) gl_cv_func_snprintf_truncation_c99="guessing no";;
361 dnl Test whether the return value of the snprintf function is the number
362 dnl of bytes (excluding the terminating NUL) that would have been produced
363 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
364 dnl Result is gl_cv_func_snprintf_retval_c99.
366 AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
368 AC_REQUIRE([AC_PROG_CC])
369 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
370 AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
371 [gl_cv_func_snprintf_retval_c99],
376 static char buf[100];
379 strcpy (buf, "ABCDEF");
380 if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
383 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
387 # Guess yes on glibc systems.
388 *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
389 # Guess yes on FreeBSD >= 5.
390 freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";;
391 freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
392 # Guess yes on MacOS X >= 10.3.
393 darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
394 darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
395 # Guess yes on OpenBSD >= 3.9.
396 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
397 gl_cv_func_snprintf_retval_c99="guessing no";;
398 openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
399 # Guess yes on Solaris >= 2.6.
400 solaris2.[0-5]*) gl_cv_func_snprintf_retval_c99="guessing no";;
401 solaris*) gl_cv_func_snprintf_retval_c99="guessing yes";;
402 # Guess yes on AIX >= 4.
403 aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
404 aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
405 # Guess yes on NetBSD >= 3.
406 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
407 gl_cv_func_snprintf_retval_c99="guessing no";;
408 netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
410 beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
411 # If we don't know, assume the worst.
412 *) gl_cv_func_snprintf_retval_c99="guessing no";;
419 dnl Test whether the snprintf function supports the %n format directive
420 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
421 dnl Result is gl_cv_func_snprintf_directive_n.
423 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
425 AC_REQUIRE([AC_PROG_CC])
426 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
427 AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
428 [gl_cv_func_snprintf_directive_n],
433 static char buf[100];
437 snprintf (buf, 4, "%d %n", 12345, &count, 33, 44, 55);
441 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
445 # Guess yes on glibc systems.
446 *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";;
447 # Guess yes on FreeBSD >= 5.
448 freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
449 freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
450 # Guess yes on MacOS X >= 10.3.
451 darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
452 darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
453 # Guess yes on Solaris >= 2.6.
454 solaris2.[0-5]*) gl_cv_func_snprintf_directive_n="guessing no";;
455 solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
456 # Guess yes on AIX >= 4.
457 aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
458 aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
459 # Guess yes on IRIX >= 6.5.
460 irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
461 # Guess yes on OSF/1 >= 5.
462 osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
463 osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
464 # Guess yes on NetBSD >= 3.
465 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
466 gl_cv_func_snprintf_directive_n="guessing no";;
467 netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
469 beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
470 # If we don't know, assume the worst.
471 *) gl_cv_func_snprintf_directive_n="guessing no";;
478 dnl The results of these tests on various platforms are:
480 dnl 1 = gl_PRINTF_SIZES_C99
481 dnl 2 = gl_PRINTF_DIRECTIVE_A
482 dnl 3 = gl_PRINTF_DIRECTIVE_F
483 dnl 4 = gl_PRINTF_DIRECTIVE_N
484 dnl 5 = gl_PRINTF_POSITIONS
485 dnl 6 = gl_SNPRINTF_PRESENCE
486 dnl 7 = gl_SNPRINTF_TRUNCATION_C99
487 dnl 8 = gl_SNPRINTF_RETVAL_C99
488 dnl 9 = gl_SNPRINTF_DIRECTIVE_N
490 dnl 1 = checking whether printf supports size specifiers as in C99...
491 dnl 2 = checking whether printf supports the 'a' and 'A' directives...
492 dnl 3 = checking whether printf supports the 'F' directive...
493 dnl 4 = checking whether printf supports the 'n' directive...
494 dnl 5 = checking whether printf supports POSIX/XSI format strings with positions...
495 dnl 6 = checking for snprintf...
496 dnl 7 = checking whether snprintf truncates the result as in C99...
497 dnl 8 = checking whether snprintf returns a byte count as in C99...
498 dnl 9 = checking whether snprintf fully supports the 'n' directive...
502 dnl 1 2 3 4 5 6 7 8 9
503 dnl glibc 2.5 . . . . . . . . .
504 dnl glibc 2.3.6 . # . . . . . . .
505 dnl FreeBSD 5.4, 6.1 . ? . . . . . . .
506 dnl MacOS X 10.3.9 . # . . . . . . .
507 dnl OpenBSD 3.9, 4.0 . # ? . . . . . ?
508 dnl Cygwin 2007 . # # . . . . . ?
509 dnl Cygwin 2006 # # # . . . . . ?
510 dnl Solaris 10 . # . . . . . . .
511 dnl Solaris 2.6 ... 9 # # # . . . . . .
512 dnl Solaris 2.5.1 # # # . . # # # #
513 dnl AIX 5.2 . # . . . . . . .
514 dnl AIX 4.3.2, 5.1 # # # . . . . . .
515 dnl HP-UX 11.31 . # . . . . . # #
516 dnl HP-UX 10.20, 11.00, 11.11, 11.23 # # # . . . . # #
517 dnl IRIX 6.5 # # # . . . . # .
518 dnl OSF/1 5.1 # # # . . . . # .
519 dnl OSF/1 4.0d # # # . . # # # #
520 dnl NetBSD 4.0 . ? ? . . . . . ?
521 dnl NetBSD 3.0 . # # . # . . . .
522 dnl BeOS # # # . # . . . .
523 dnl mingw # # # . # . # # #