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 (result, "0x1.83p+0 33") != 0
117 && strcmp (result, "0x3.05p-1 33") != 0
118 && strcmp (result, "0x6.0ap-2 33") != 0
119 && strcmp (result, "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 %n format
166 dnl directive. (ISO C99, POSIX:2001)
167 dnl Result is gl_cv_func_printf_directive_n.
169 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
171 AC_REQUIRE([AC_PROG_CC])
172 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
173 AC_CACHE_CHECK([whether printf supports the 'n' directive],
174 [gl_cv_func_printf_directive_n],
179 static char buf[100];
183 if (sprintf (buf, "%d %n", 123, &count, 33, 44, 55) < 0
184 || strcmp (buf, "123 ") != 0
188 }], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no],
192 *) gl_cv_func_printf_directive_n="guessing yes";;
199 dnl Test whether the *printf family of functions supports POSIX/XSI format
200 dnl strings with positions. (POSIX:2001)
201 dnl Result is gl_cv_func_printf_positions.
203 AC_DEFUN([gl_PRINTF_POSITIONS],
205 AC_REQUIRE([AC_PROG_CC])
206 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
207 AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
208 [gl_cv_func_printf_positions],
213 /* The string "%2$d %1$d", with dollar characters protected from the shell's
214 dollar expansion (possibly an autoconf bug). */
215 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
216 static char buf[100];
219 sprintf (buf, format, 33, 55);
220 return (strcmp (buf, "55 33") != 0);
221 }], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no],
225 netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
226 gl_cv_func_printf_positions="guessing no";;
227 beos*) gl_cv_func_printf_positions="guessing no";;
228 mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
229 *) gl_cv_func_printf_positions="guessing yes";;
236 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
237 dnl Result is ac_cv_func_snprintf.
239 AC_DEFUN([gl_SNPRINTF_PRESENCE],
241 AC_CHECK_FUNCS_ONCE([snprintf])
244 dnl Test whether the string produced by the snprintf function is always NUL
245 dnl terminated. (ISO C99, POSIX:2001)
246 dnl Result is gl_cv_func_snprintf_truncation_c99.
248 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
250 AC_REQUIRE([AC_PROG_CC])
251 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
252 AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
253 [gl_cv_func_snprintf_truncation_c99],
258 static char buf[100];
261 strcpy (buf, "ABCDEF");
262 snprintf (buf, 3, "%d %d", 4567, 89);
263 if (memcmp (buf, "45\0DEF", 6) != 0)
266 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
270 # Guess yes on glibc systems.
271 *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
272 # Guess yes on FreeBSD >= 5.
273 freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
274 freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
275 # Guess yes on MacOS X >= 10.3.
276 darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
277 darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
278 # Guess yes on OpenBSD >= 3.9.
279 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
280 gl_cv_func_snprintf_truncation_c99="guessing no";;
281 openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
282 # Guess yes on Solaris >= 2.6.
283 solaris2.[0-5]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
284 solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
285 # Guess yes on AIX >= 4.
286 aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
287 aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
288 # Guess yes on HP-UX >= 11.
289 hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
290 hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
291 # Guess yes on IRIX >= 6.5.
292 irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
293 # Guess yes on OSF/1 >= 5.
294 osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
295 osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
296 # Guess yes on NetBSD >= 3.
297 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
298 gl_cv_func_snprintf_truncation_c99="guessing no";;
299 netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
301 beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
302 # If we don't know, assume the worst.
303 *) gl_cv_func_snprintf_truncation_c99="guessing no";;
310 dnl Test whether the return value of the snprintf function is the number
311 dnl of bytes (excluding the terminating NUL) that would have been produced
312 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
313 dnl Result is gl_cv_func_snprintf_retval_c99.
315 AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
317 AC_REQUIRE([AC_PROG_CC])
318 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
319 AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
320 [gl_cv_func_snprintf_retval_c99],
325 static char buf[100];
328 strcpy (buf, "ABCDEF");
329 if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
332 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
336 # Guess yes on glibc systems.
337 *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
338 # Guess yes on FreeBSD >= 5.
339 freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";;
340 freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
341 # Guess yes on MacOS X >= 10.3.
342 darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
343 darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
344 # Guess yes on OpenBSD >= 3.9.
345 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
346 gl_cv_func_snprintf_retval_c99="guessing no";;
347 openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
348 # Guess yes on Solaris >= 2.6.
349 solaris2.[0-5]*) gl_cv_func_snprintf_retval_c99="guessing no";;
350 solaris*) gl_cv_func_snprintf_retval_c99="guessing yes";;
351 # Guess yes on AIX >= 4.
352 aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
353 aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
354 # Guess yes on NetBSD >= 3.
355 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
356 gl_cv_func_snprintf_retval_c99="guessing no";;
357 netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
359 beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
360 # If we don't know, assume the worst.
361 *) gl_cv_func_snprintf_retval_c99="guessing no";;
368 dnl Test whether the snprintf function supports the %n format directive
369 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
370 dnl Result is gl_cv_func_snprintf_directive_n.
372 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
374 AC_REQUIRE([AC_PROG_CC])
375 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
376 AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
377 [gl_cv_func_snprintf_directive_n],
382 static char buf[100];
386 snprintf (buf, 4, "%d %n", 12345, &count, 33, 44, 55);
390 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
394 # Guess yes on glibc systems.
395 *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";;
396 # Guess yes on FreeBSD >= 5.
397 freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
398 freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
399 # Guess yes on MacOS X >= 10.3.
400 darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
401 darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
402 # Guess yes on Solaris >= 2.6.
403 solaris2.[0-5]*) gl_cv_func_snprintf_directive_n="guessing no";;
404 solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
405 # Guess yes on AIX >= 4.
406 aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
407 aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
408 # Guess yes on IRIX >= 6.5.
409 irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
410 # Guess yes on OSF/1 >= 5.
411 osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
412 osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
413 # Guess yes on NetBSD >= 3.
414 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
415 gl_cv_func_snprintf_directive_n="guessing no";;
416 netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
418 beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
419 # If we don't know, assume the worst.
420 *) gl_cv_func_snprintf_directive_n="guessing no";;
427 dnl The results of these tests on various platforms are:
429 dnl 1 = gl_PRINTF_SIZES_C99
430 dnl 2 = gl_PRINTF_DIRECTIVE_A
431 dnl 3 = gl_PRINTF_DIRECTIVE_N
432 dnl 4 = gl_PRINTF_POSITIONS
433 dnl 5 = gl_SNPRINTF_PRESENCE
434 dnl 6 = gl_SNPRINTF_TRUNCATION_C99
435 dnl 7 = gl_SNPRINTF_RETVAL_C99
436 dnl 8 = gl_SNPRINTF_DIRECTIVE_N
438 dnl 1 = checking whether printf supports size specifiers as in C99...
439 dnl 2 = checking whether printf supports the 'a' and 'A' directives...
440 dnl 3 = checking whether printf supports the 'n' directive...
441 dnl 4 = checking whether printf supports POSIX/XSI format strings with positions...
442 dnl 5 = checking for snprintf...
443 dnl 6 = checking whether snprintf truncates the result as in C99...
444 dnl 7 = checking whether snprintf returns a byte count as in C99...
445 dnl 8 = checking whether snprintf fully supports the 'n' directive...
450 dnl glibc 2.5 . . . . . . . .
451 dnl glibc 2.3.6 . # . . . . . .
452 dnl FreeBSD 5.4, 6.1 . ? . . . . . .
453 dnl MacOS X 10.3.9 . # . . . . . .
454 dnl OpenBSD 3.9, 4.0 . # . . . . . ?
455 dnl Cygwin 2007 . # . . . . . ?
456 dnl Cygwin 2006 # # . . . . . ?
457 dnl Solaris 10 . # . . . . . .
458 dnl Solaris 2.6 ... 9 # # . . . . . .
459 dnl Solaris 2.5.1 # # . . # # # #
460 dnl AIX 4.3.2, 5.1 # # . . . . . .
461 dnl HP-UX 11.31 . # . . . . # #
462 dnl HP-UX 10.20, 11.00, 11.11, 11.23 # # . . . . # #
463 dnl IRIX 6.5 # # . . . . # .
464 dnl OSF/1 5.1 # # . . . . # .
465 dnl OSF/1 4.0d # # . . # # # #
466 dnl NetBSD 4.0 . ? . . . . . ?
467 dnl NetBSD 3.0 . # . # . . . .
468 dnl BeOS # # . # . . . .
469 dnl mingw # # . # . # # #