2 dnl Copyright (C) 2003, 2007-2010 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],
25 #include <sys/types.h>
26 #if HAVE_STDINT_H_WITH_UINTMAX
29 #if HAVE_INTTYPES_H_WITH_UINTMAX
30 # include <inttypes.h>
36 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
38 if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
39 || strcmp (buf, "12345671 33") != 0)
43 if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
44 || strcmp (buf, "12345672 33") != 0)
47 if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
48 || strcmp (buf, "12345673 33") != 0)
51 if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
52 || strcmp (buf, "1.5 33") != 0)
56 [gl_cv_func_printf_sizes_c99=yes],
57 [gl_cv_func_printf_sizes_c99=no],
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";;
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.
92 AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
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],
103 static char buf[10000];
108 if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
109 || strcmp (buf, "1.750000 33") != 0)
112 if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
113 || strcmp (buf, "1.750000e+00 33") != 0)
116 if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
117 || strcmp (buf, "1.75 33") != 0)
121 [gl_cv_func_printf_long_double=yes],
122 [gl_cv_func_printf_long_double=no],
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";;
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.
140 AC_DEFUN([gl_PRINTF_INFINITE],
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],
152 strisnan (const char *string, size_t start_index, size_t end_index)
154 if (start_index < end_index)
156 if (string[start_index] == '-')
158 if (start_index + 3 <= end_index
159 && memcmp (string + start_index, "nan", 3) == 0)
162 if (start_index == end_index
163 || (string[start_index] == '(' && string[end_index - 1] == ')'))
172 static double plus_zero = 0.0;
173 double minus_zero = - plus_zero;
174 return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
176 static char buf[10000];
177 static double zero = 0.0;
181 if (sprintf (buf, "%f", 1.0 / 0.0) < 0
182 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
184 if (sprintf (buf, "%f", -1.0 / 0.0) < 0
185 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
187 if (sprintf (buf, "%f", zero / zero) < 0
188 || !strisnan (buf, 0, strlen (buf)))
190 if (sprintf (buf, "%e", 1.0 / 0.0) < 0
191 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
193 if (sprintf (buf, "%e", -1.0 / 0.0) < 0
194 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
196 if (sprintf (buf, "%e", zero / zero) < 0
197 || !strisnan (buf, 0, strlen (buf)))
199 if (sprintf (buf, "%g", 1.0 / 0.0) < 0
200 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
202 if (sprintf (buf, "%g", -1.0 / 0.0) < 0
203 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
205 if (sprintf (buf, "%g", zero / zero) < 0
206 || !strisnan (buf, 0, strlen (buf)))
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)
215 [gl_cv_func_printf_infinite=yes],
216 [gl_cv_func_printf_infinite=no],
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";;
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";;
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.
249 AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
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.])
262 case "$gl_cv_func_printf_long_double" in
264 AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
265 [gl_cv_func_printf_infinite_long_double],
274 strisnan (const char *string, size_t start_index, size_t end_index)
276 if (start_index < end_index)
278 if (string[start_index] == '-')
280 if (start_index + 3 <= end_index
281 && memcmp (string + start_index, "nan", 3) == 0)
284 if (start_index == end_index
285 || (string[start_index] == '(' && string[end_index - 1] == ')'))
291 static char buf[10000];
292 static long double zeroL = 0.0L;
297 if (sprintf (buf, "%Lf", 1.0L / 0.0L) < 0
298 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
300 if (sprintf (buf, "%Lf", -1.0L / 0.0L) < 0
301 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
303 if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
304 || !strisnan (buf, 0, strlen (buf)))
306 if (sprintf (buf, "%Le", 1.0L / 0.0L) < 0
307 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
309 if (sprintf (buf, "%Le", -1.0L / 0.0L) < 0
310 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
312 if (sprintf (buf, "%Le", zeroL / zeroL) < 0
313 || !strisnan (buf, 0, strlen (buf)))
315 if (sprintf (buf, "%Lg", 1.0L / 0.0L) < 0
316 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
318 if (sprintf (buf, "%Lg", -1.0L / 0.0L) < 0
319 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
321 if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
322 || !strisnan (buf, 0, strlen (buf)))
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 \
334 # define LDBL80_WORDS(exponent,manthi,mantlo) \
335 { mantlo, manthi, exponent }
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)))
343 if (sprintf (buf, "%Le", x.value) < 0
344 || !strisnan (buf, 0, strlen (buf)))
346 if (sprintf (buf, "%Lg", x.value) < 0
347 || !strisnan (buf, 0, strlen (buf)))
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)))
357 if (sprintf (buf, "%Le", x.value) < 0
358 || !strisnan (buf, 0, strlen (buf)))
360 if (sprintf (buf, "%Lg", x.value) < 0
361 || !strisnan (buf, 0, strlen (buf)))
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)))
370 if (sprintf (buf, "%Le", x.value) < 0
371 || !strisnan (buf, 0, strlen (buf)))
373 if (sprintf (buf, "%Lg", x.value) < 0
374 || !strisnan (buf, 0, strlen (buf)))
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)))
383 if (sprintf (buf, "%Le", x.value) < 0
384 || !strisnan (buf, 0, strlen (buf)))
386 if (sprintf (buf, "%Lg", x.value) < 0
387 || !strisnan (buf, 0, strlen (buf)))
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)))
396 if (sprintf (buf, "%Le", x.value) < 0
397 || !strisnan (buf, 0, strlen (buf)))
399 if (sprintf (buf, "%Lg", x.value) < 0
400 || !strisnan (buf, 0, strlen (buf)))
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)))
409 if (sprintf (buf, "%Le", x.value) < 0
410 || !strisnan (buf, 0, strlen (buf)))
412 if (sprintf (buf, "%Lg", x.value) < 0
413 || !strisnan (buf, 0, strlen (buf)))
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)))
422 if (sprintf (buf, "%Le", x.value) < 0
423 || !strisnan (buf, 0, strlen (buf)))
425 if (sprintf (buf, "%Lg", x.value) < 0
426 || !strisnan (buf, 0, strlen (buf)))
432 [gl_cv_func_printf_infinite_long_double=yes],
433 [gl_cv_func_printf_infinite_long_double=no],
437 # Guess no on ia64, x86_64, i386.
438 ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
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";;
459 gl_cv_func_printf_infinite_long_double="irrelevant"
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.
469 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
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],
480 static char buf[100];
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))
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))
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))
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
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))
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))
525 [gl_cv_func_printf_directive_a=yes],
526 [gl_cv_func_printf_directive_a=no],
529 # Guess yes on glibc >= 2.5 systems.
531 AC_EGREP_CPP([BZ2908], [
532 #include <features.h>
533 #ifdef __GNU_LIBRARY__
534 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
539 [gl_cv_func_printf_directive_a="guessing yes"],
540 [gl_cv_func_printf_directive_a="guessing no"])
542 # If we don't know, assume the worst.
543 *) gl_cv_func_printf_directive_a="guessing no";;
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.
553 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
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],
564 static char buf[100];
568 if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
569 || strcmp (buf, "1234567.000000 33") != 0)
571 if (sprintf (buf, "%F", 1.0 / 0.0) < 0
572 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
574 /* This catches a Cygwin 1.5.x bug. */
575 if (sprintf (buf, "%.F", 1234.0) < 0
576 || strcmp (buf, "1234") != 0)
580 [gl_cv_func_printf_directive_f=yes],
581 [gl_cv_func_printf_directive_f=no],
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";;
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.
608 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
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],
619 static char fmtstring[10];
620 static char buf[100];
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
627 strcpy (fmtstring, "%d %n");
628 if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
629 || strcmp (buf, "123 ") != 0
634 [gl_cv_func_printf_directive_n=yes],
635 [gl_cv_func_printf_directive_n=no],
639 *) gl_cv_func_printf_directive_n="guessing yes";;
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
651 dnl Result is gl_cv_func_printf_directive_ls.
653 AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
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],
662 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
664 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
665 included before <wchar.h>. */
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
679 static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
681 if (sprintf (buf, "%ls", wstring) < 0
682 || strcmp (buf, "abc") != 0)
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. */
688 static const wchar_t wstring[] = { 'a', 0 };
690 if (sprintf (buf, "%ls", wstring) < 0
691 || strcmp (buf, "a") != 0)
694 /* Test whether precisions in %ls are supported as specified in ISO C 99
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. */
703 static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
705 if (sprintf (buf, "%.2ls", wstring) < 0
706 || strcmp (buf, "ab") != 0)
711 [gl_cv_func_printf_directive_ls=yes],
712 [gl_cv_func_printf_directive_ls=no],
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";;
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.
732 AC_DEFUN([gl_PRINTF_POSITIONS],
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],
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];
749 sprintf (buf, format, 33, 55);
750 return (strcmp (buf, "55 33") != 0);
752 [gl_cv_func_printf_positions=yes],
753 [gl_cv_func_printf_positions=no],
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";;
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.
772 AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
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],
783 static char buf[100];
786 if (sprintf (buf, "%'d %d", 1234567, 99) < 0
787 || buf[strlen (buf) - 1] != '9')
791 [gl_cv_func_printf_flag_grouping=yes],
792 [gl_cv_func_printf_flag_grouping=no],
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";;
806 dnl Test whether the *printf family of functions supports the - flag correctly.
808 dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html>
809 dnl Result is gl_cv_func_printf_flag_leftadjust.
811 AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
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],
822 static char buf[100];
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)
831 [gl_cv_func_printf_flag_leftadjust=yes],
832 [gl_cv_func_printf_flag_leftadjust=no],
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";;
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.
853 AC_DEFUN([gl_PRINTF_FLAG_ZERO],
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],
864 static char buf[100];
867 if (sprintf (buf, "%010f", 1.0 / 0.0, 33, 44, 55) < 0
868 || (strcmp (buf, " inf") != 0
869 && strcmp (buf, " infinity") != 0))
873 [gl_cv_func_printf_flag_zero=yes],
874 [gl_cv_func_printf_flag_zero=no],
878 # Guess yes on glibc systems.
879 *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
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";;
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 BeOS, precisions
894 dnl larger than 1044 crash the program.
895 dnl Result is gl_cv_func_printf_precision.
897 AC_DEFUN([gl_PRINTF_PRECISION],
899 AC_REQUIRE([AC_PROG_CC])
900 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
901 AC_CACHE_CHECK([whether printf supports large precisions],
902 [gl_cv_func_printf_precision],
908 static char buf[5000];
913 /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
916 if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
918 if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
922 [gl_cv_func_printf_precision=yes],
923 [gl_cv_func_printf_precision=no],
927 # Guess no only on Solaris, native Win32, and BeOS systems.
928 solaris*) gl_cv_func_printf_precision="guessing no" ;;
929 mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
930 beos*) gl_cv_func_printf_precision="guessing no" ;;
931 *) gl_cv_func_printf_precision="guessing yes" ;;
938 dnl Test whether the *printf family of functions recovers gracefully in case
939 dnl of an out-of-memory condition, or whether it crashes the entire program.
940 dnl Result is gl_cv_func_printf_enomem.
942 AC_DEFUN([gl_PRINTF_ENOMEM],
944 AC_REQUIRE([AC_PROG_CC])
945 AC_REQUIRE([gl_MULTIARCH])
946 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
947 AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
948 [gl_cv_func_printf_enomem],
950 gl_cv_func_printf_enomem="guessing no"
951 if test "$cross_compiling" = no; then
952 if test $APPLE_UNIVERSAL_BUILD = 0; then
953 AC_LANG_CONFTEST([AC_LANG_SOURCE([
957 #include <sys/types.h>
958 #include <sys/time.h>
959 #include <sys/resource.h>
966 /* Some printf implementations allocate temporary space with malloc. */
967 /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
969 if (getrlimit (RLIMIT_DATA, &limit) < 0)
971 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
972 limit.rlim_max = 5000000;
973 limit.rlim_cur = limit.rlim_max;
974 if (setrlimit (RLIMIT_DATA, &limit) < 0)
977 /* On Linux systems, malloc() is limited by RLIMIT_AS. */
979 if (getrlimit (RLIMIT_AS, &limit) < 0)
981 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
982 limit.rlim_max = 5000000;
983 limit.rlim_cur = limit.rlim_max;
984 if (setrlimit (RLIMIT_AS, &limit) < 0)
987 /* Some printf implementations allocate temporary space on the stack. */
989 if (getrlimit (RLIMIT_STACK, &limit) < 0)
991 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
992 limit.rlim_max = 5000000;
993 limit.rlim_cur = limit.rlim_max;
994 if (setrlimit (RLIMIT_STACK, &limit) < 0)
997 ret = printf ("%.5000000f", 1.0);
998 return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
1002 if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
1005 if test $result != 0 && test $result != 77; then result=1; fi
1007 ) >/dev/null 2>/dev/null
1009 0) gl_cv_func_printf_enomem="yes" ;;
1010 77) gl_cv_func_printf_enomem="guessing no" ;;
1011 *) gl_cv_func_printf_enomem="no" ;;
1014 gl_cv_func_printf_enomem="guessing no"
1018 dnl A universal build on Apple MacOS X platforms.
1019 dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
1020 dnl But we need a configuration result that is valid in both modes.
1021 gl_cv_func_printf_enomem="guessing no"
1024 if test "$gl_cv_func_printf_enomem" = "guessing no"; then
1027 # Guess yes on glibc systems.
1028 *-gnu*) gl_cv_func_printf_enomem="guessing yes";;
1029 # Guess yes on Solaris.
1030 solaris*) gl_cv_func_printf_enomem="guessing yes";;
1032 aix*) gl_cv_func_printf_enomem="guessing yes";;
1033 # Guess yes on HP-UX/hppa.
1034 hpux*) case "$host_cpu" in
1035 hppa*) gl_cv_func_printf_enomem="guessing yes";;
1036 *) gl_cv_func_printf_enomem="guessing no";;
1039 # Guess yes on IRIX.
1040 irix*) gl_cv_func_printf_enomem="guessing yes";;
1041 # Guess yes on OSF/1.
1042 osf*) gl_cv_func_printf_enomem="guessing yes";;
1043 # Guess yes on BeOS.
1044 beos*) gl_cv_func_printf_enomem="guessing yes";;
1045 # Guess yes on Haiku.
1046 haiku*) gl_cv_func_printf_enomem="guessing yes";;
1047 # If we don't know, assume the worst.
1048 *) gl_cv_func_printf_enomem="guessing no";;
1055 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
1056 dnl Result is ac_cv_func_snprintf.
1058 AC_DEFUN([gl_SNPRINTF_PRESENCE],
1060 AC_CHECK_FUNCS_ONCE([snprintf])
1063 dnl Test whether the string produced by the snprintf function is always NUL
1064 dnl terminated. (ISO C99, POSIX:2001)
1065 dnl Result is gl_cv_func_snprintf_truncation_c99.
1067 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
1069 AC_REQUIRE([AC_PROG_CC])
1070 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1071 AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
1072 [gl_cv_func_snprintf_truncation_c99],
1078 static char buf[100];
1081 strcpy (buf, "ABCDEF");
1082 snprintf (buf, 3, "%d %d", 4567, 89);
1083 if (memcmp (buf, "45\0DEF", 6) != 0)
1087 [gl_cv_func_snprintf_truncation_c99=yes],
1088 [gl_cv_func_snprintf_truncation_c99=no],
1092 # Guess yes on glibc systems.
1093 *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1094 # Guess yes on FreeBSD >= 5.
1095 freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1096 freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1097 # Guess yes on MacOS X >= 10.3.
1098 darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1099 darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1100 # Guess yes on OpenBSD >= 3.9.
1101 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1102 gl_cv_func_snprintf_truncation_c99="guessing no";;
1103 openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1104 # Guess yes on Solaris >= 2.6.
1105 solaris2.[0-5] | solaris2.[0-5].*)
1106 gl_cv_func_snprintf_truncation_c99="guessing no";;
1107 solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1108 # Guess yes on AIX >= 4.
1109 aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1110 aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1111 # Guess yes on HP-UX >= 11.
1112 hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1113 hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1114 # Guess yes on IRIX >= 6.5.
1115 irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1116 # Guess yes on OSF/1 >= 5.
1117 osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1118 osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1119 # Guess yes on NetBSD >= 3.
1120 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1121 gl_cv_func_snprintf_truncation_c99="guessing no";;
1122 netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1123 # Guess yes on BeOS.
1124 beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1125 # If we don't know, assume the worst.
1126 *) gl_cv_func_snprintf_truncation_c99="guessing no";;
1133 dnl Test whether the return value of the snprintf function is the number
1134 dnl of bytes (excluding the terminating NUL) that would have been produced
1135 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
1136 dnl For example, this test program fails on IRIX 6.5:
1137 dnl ---------------------------------------------------------------------
1138 dnl #include <stdio.h>
1141 dnl static char buf[8];
1142 dnl int retval = snprintf (buf, 3, "%d", 12345);
1143 dnl return retval >= 0 && retval < 3;
1145 dnl ---------------------------------------------------------------------
1146 dnl Result is gl_cv_func_snprintf_retval_c99.
1148 AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99],
1150 AC_REQUIRE([AC_PROG_CC])
1151 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1152 AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
1153 [gl_cv_func_snprintf_retval_c99],
1159 static char buf[100];
1162 strcpy (buf, "ABCDEF");
1163 if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
1165 if (snprintf (buf, 0, "%d %d", 4567, 89) != 7)
1167 if (snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
1171 [gl_cv_func_snprintf_retval_c99=yes],
1172 [gl_cv_func_snprintf_retval_c99=no],
1176 # Guess yes on glibc systems.
1177 *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1178 # Guess yes on FreeBSD >= 5.
1179 freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1180 freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1181 # Guess yes on MacOS X >= 10.3.
1182 darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
1183 darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1184 # Guess yes on OpenBSD >= 3.9.
1185 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1186 gl_cv_func_snprintf_retval_c99="guessing no";;
1187 openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1188 # Guess yes on Solaris >= 2.10.
1189 solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
1190 solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
1191 # Guess yes on AIX >= 4.
1192 aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1193 aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1194 # Guess yes on NetBSD >= 3.
1195 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1196 gl_cv_func_snprintf_retval_c99="guessing no";;
1197 netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1198 # Guess yes on BeOS.
1199 beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1200 # If we don't know, assume the worst.
1201 *) gl_cv_func_snprintf_retval_c99="guessing no";;
1208 dnl Test whether the snprintf function supports the %n format directive
1209 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1210 dnl Result is gl_cv_func_snprintf_directive_n.
1212 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1214 AC_REQUIRE([AC_PROG_CC])
1215 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1216 AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1217 [gl_cv_func_snprintf_directive_n],
1223 static char fmtstring[10];
1224 static char buf[100];
1228 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
1229 support %n in format strings in read-only memory but not in writable
1231 strcpy (fmtstring, "%d %n");
1232 snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1237 [gl_cv_func_snprintf_directive_n=yes],
1238 [gl_cv_func_snprintf_directive_n=no],
1242 # Guess yes on glibc systems.
1243 *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";;
1244 # Guess yes on FreeBSD >= 5.
1245 freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1246 freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1247 # Guess yes on MacOS X >= 10.3.
1248 darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
1249 darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
1250 # Guess yes on Solaris >= 2.6.
1251 solaris2.[0-5] | solaris2.[0-5].*)
1252 gl_cv_func_snprintf_directive_n="guessing no";;
1253 solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
1254 # Guess yes on AIX >= 4.
1255 aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
1256 aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
1257 # Guess yes on IRIX >= 6.5.
1258 irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
1259 # Guess yes on OSF/1 >= 5.
1260 osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1261 osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
1262 # Guess yes on NetBSD >= 3.
1263 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1264 gl_cv_func_snprintf_directive_n="guessing no";;
1265 netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1266 # Guess yes on BeOS.
1267 beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
1268 # If we don't know, assume the worst.
1269 *) gl_cv_func_snprintf_directive_n="guessing no";;
1276 dnl Test whether the snprintf function, when passed a size = 1, writes any
1277 dnl output without bounds in this case, behaving like sprintf. This is the
1278 dnl case on Linux libc5.
1279 dnl Result is gl_cv_func_snprintf_size1.
1281 AC_DEFUN([gl_SNPRINTF_SIZE1],
1283 AC_REQUIRE([AC_PROG_CC])
1284 AC_CACHE_CHECK([whether snprintf respects a size of 1],
1285 [gl_cv_func_snprintf_size1],
1292 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1293 snprintf (buf, 1, "%d", 12345);
1294 return buf[1] != 'E';
1296 [gl_cv_func_snprintf_size1=yes],
1297 [gl_cv_func_snprintf_size1=no],
1298 [gl_cv_func_snprintf_size1="guessing yes"])
1302 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1303 dnl output. (ISO C99, POSIX:2001)
1304 dnl For example, snprintf nevertheless writes a NUL byte in this case
1306 dnl ---------------------------------------------------------------------
1307 dnl #include <stdio.h>
1310 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1311 dnl snprintf (buf, 0, "%d", 12345);
1312 dnl return buf[0] != 'D';
1314 dnl ---------------------------------------------------------------------
1315 dnl And vsnprintf writes any output without bounds in this case, behaving like
1316 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1317 dnl ---------------------------------------------------------------------
1318 dnl #include <stdarg.h>
1319 dnl #include <stdio.h>
1320 dnl static int my_snprintf (char *buf, int size, const char *format, ...)
1324 dnl va_start (args, format);
1325 dnl ret = vsnprintf (buf, size, format, args);
1331 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1332 dnl my_snprintf (buf, 0, "%d", 12345);
1333 dnl return buf[0] != 'D';
1335 dnl ---------------------------------------------------------------------
1336 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1338 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1340 AC_REQUIRE([AC_PROG_CC])
1341 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1342 AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1343 [gl_cv_func_vsnprintf_zerosize_c99],
1349 static int my_snprintf (char *buf, int size, const char *format, ...)
1353 va_start (args, format);
1354 ret = vsnprintf (buf, size, format, args);
1360 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1361 my_snprintf (buf, 0, "%d", 12345);
1362 return buf[0] != 'D';
1364 [gl_cv_func_vsnprintf_zerosize_c99=yes],
1365 [gl_cv_func_vsnprintf_zerosize_c99=no],
1369 # Guess yes on glibc systems.
1370 *-gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1371 # Guess yes on FreeBSD >= 5.
1372 freebsd[1-4]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1373 freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1374 # Guess yes on MacOS X >= 10.3.
1375 darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1376 darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1377 # Guess yes on Cygwin.
1378 cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1379 # Guess yes on Solaris >= 2.6.
1380 solaris2.[0-5] | solaris2.[0-5].*)
1381 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1382 solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1383 # Guess yes on AIX >= 4.
1384 aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1385 aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1386 # Guess yes on IRIX >= 6.5.
1387 irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1388 # Guess yes on NetBSD >= 3.
1389 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1390 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1391 netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1392 # Guess yes on BeOS.
1393 beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1394 # Guess yes on mingw.
1395 mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1396 # If we don't know, assume the worst.
1397 *) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1404 dnl The results of these tests on various platforms are:
1406 dnl 1 = gl_PRINTF_SIZES_C99
1407 dnl 2 = gl_PRINTF_LONG_DOUBLE
1408 dnl 3 = gl_PRINTF_INFINITE
1409 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1410 dnl 5 = gl_PRINTF_DIRECTIVE_A
1411 dnl 6 = gl_PRINTF_DIRECTIVE_F
1412 dnl 7 = gl_PRINTF_DIRECTIVE_N
1413 dnl 8 = gl_PRINTF_DIRECTIVE_LS
1414 dnl 9 = gl_PRINTF_POSITIONS
1415 dnl 10 = gl_PRINTF_FLAG_GROUPING
1416 dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
1417 dnl 12 = gl_PRINTF_FLAG_ZERO
1418 dnl 13 = gl_PRINTF_PRECISION
1419 dnl 14 = gl_PRINTF_ENOMEM
1420 dnl 15 = gl_SNPRINTF_PRESENCE
1421 dnl 16 = gl_SNPRINTF_TRUNCATION_C99
1422 dnl 17 = gl_SNPRINTF_RETVAL_C99
1423 dnl 18 = gl_SNPRINTF_DIRECTIVE_N
1424 dnl 19 = gl_SNPRINTF_SIZE1
1425 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
1427 dnl 1 = checking whether printf supports size specifiers as in C99...
1428 dnl 2 = checking whether printf supports 'long double' arguments...
1429 dnl 3 = checking whether printf supports infinite 'double' arguments...
1430 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1431 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1432 dnl 6 = checking whether printf supports the 'F' directive...
1433 dnl 7 = checking whether printf supports the 'n' directive...
1434 dnl 8 = checking whether printf supports the 'ls' directive...
1435 dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
1436 dnl 10 = checking whether printf supports the grouping flag...
1437 dnl 11 = checking whether printf supports the left-adjust flag correctly...
1438 dnl 12 = checking whether printf supports the zero flag correctly...
1439 dnl 13 = checking whether printf supports large precisions...
1440 dnl 14 = checking whether printf survives out-of-memory conditions...
1441 dnl 15 = checking for snprintf...
1442 dnl 16 = checking whether snprintf truncates the result as in C99...
1443 dnl 17 = checking whether snprintf returns a byte count as in C99...
1444 dnl 18 = checking whether snprintf fully supports the 'n' directive...
1445 dnl 19 = checking whether snprintf respects a size of 1...
1446 dnl 20 = checking whether vsnprintf respects a zero size as in C99...
1448 dnl . = yes, # = no.
1450 dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1451 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . .
1452 dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . .
1453 dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . .
1454 dnl MacOS X 10.5.8 . . . # # . . . . . . # . . . . . . . .
1455 dnl MacOS X 10.3.9 . . . . # . . . . . . # . # . . . . . .
1456 dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . .
1457 dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . .
1458 dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . .
1459 dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . .
1460 dnl Solaris 11 2010-11 . . # # # . . # . . . # . . . . . . . .
1461 dnl Solaris 10 . . # # # . . # . . . # # . . . . . . .
1462 dnl Solaris 2.6 ... 9 # . # # # # . # . . . # . . . . # . . .
1463 dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # #
1464 dnl AIX 5.2, 7.1 . . # # # . . . . . . # . . . . . . . .
1465 dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . # . . .
1466 dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . .
1467 dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . #
1468 dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? #
1469 dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . .
1470 dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . #
1471 dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # #
1472 dnl NetBSD 5.0 . . . # # . . . . . . # . # . . . . . .
1473 dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ?
1474 dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . .
1475 dnl Haiku . . . # # # . # . . . . . ? . . ? . . .
1476 dnl BeOS # # . # # # . ? # . ? . # ? . . ? . . .
1477 dnl mingw # # # # # # . . # # . # # ? . # # # . .