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>
35 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
37 if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
38 || strcmp (buf, "12345671 33") != 0)
42 if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
43 || strcmp (buf, "12345672 33") != 0)
46 if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
47 || strcmp (buf, "12345673 33") != 0)
50 if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
51 || strcmp (buf, "1.5 33") != 0)
55 [gl_cv_func_printf_sizes_c99=yes],
56 [gl_cv_func_printf_sizes_c99=no],
60 # Guess yes on glibc systems.
61 *-gnu*) gl_cv_func_printf_sizes_c99="guessing yes";;
62 # Guess yes on FreeBSD >= 5.
63 freebsd[1-4]*) gl_cv_func_printf_sizes_c99="guessing no";;
64 freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
65 # Guess yes on MacOS X >= 10.3.
66 darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";;
67 darwin*) gl_cv_func_printf_sizes_c99="guessing yes";;
68 # Guess yes on OpenBSD >= 3.9.
69 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
70 gl_cv_func_printf_sizes_c99="guessing no";;
71 openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
72 # Guess yes on Solaris >= 2.10.
73 solaris2.[0-9]*) gl_cv_func_printf_sizes_c99="guessing no";;
74 solaris*) gl_cv_func_printf_sizes_c99="guessing yes";;
75 # Guess yes on NetBSD >= 3.
76 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
77 gl_cv_func_printf_sizes_c99="guessing no";;
78 netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
79 # If we don't know, assume the worst.
80 *) gl_cv_func_printf_sizes_c99="guessing no";;
87 dnl Test whether the *printf family of functions supports 'long double'
88 dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
89 dnl Result is gl_cv_func_printf_long_double.
91 AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
93 AC_REQUIRE([AC_PROG_CC])
94 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
95 AC_CACHE_CHECK([whether printf supports 'long double' arguments],
96 [gl_cv_func_printf_long_double],
102 static char buf[10000];
106 if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
107 || strcmp (buf, "1.750000 33") != 0)
110 if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
111 || strcmp (buf, "1.750000e+00 33") != 0)
114 if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
115 || strcmp (buf, "1.75 33") != 0)
119 [gl_cv_func_printf_long_double=yes],
120 [gl_cv_func_printf_long_double=no],
124 beos*) gl_cv_func_printf_long_double="guessing no";;
125 mingw* | pw*) gl_cv_func_printf_long_double="guessing no";;
126 *) gl_cv_func_printf_long_double="guessing yes";;
133 dnl Test whether the *printf family of functions supports infinite and NaN
134 dnl 'double' arguments and negative zero arguments in the %f, %e, %g
135 dnl directives. (ISO C99, POSIX:2001)
136 dnl Result is gl_cv_func_printf_infinite.
138 AC_DEFUN([gl_PRINTF_INFINITE],
140 AC_REQUIRE([AC_PROG_CC])
141 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
142 AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
143 [gl_cv_func_printf_infinite],
150 strisnan (const char *string, size_t start_index, size_t end_index)
152 if (start_index < end_index)
154 if (string[start_index] == '-')
156 if (start_index + 3 <= end_index
157 && memcmp (string + start_index, "nan", 3) == 0)
160 if (start_index == end_index
161 || (string[start_index] == '(' && string[end_index - 1] == ')'))
170 static double plus_zero = 0.0;
171 double minus_zero = - plus_zero;
172 return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
174 static char buf[10000];
175 static double zero = 0.0;
178 if (sprintf (buf, "%f", 1.0 / 0.0) < 0
179 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 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", zero / zero) < 0
185 || !strisnan (buf, 0, strlen (buf)))
187 if (sprintf (buf, "%e", 1.0 / 0.0) < 0
188 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
190 if (sprintf (buf, "%e", -1.0 / 0.0) < 0
191 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
193 if (sprintf (buf, "%e", zero / zero) < 0
194 || !strisnan (buf, 0, strlen (buf)))
196 if (sprintf (buf, "%g", 1.0 / 0.0) < 0
197 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
199 if (sprintf (buf, "%g", -1.0 / 0.0) < 0
200 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
202 if (sprintf (buf, "%g", zero / zero) < 0
203 || !strisnan (buf, 0, strlen (buf)))
205 /* This test fails on HP-UX 10.20. */
206 if (have_minus_zero ())
207 if (sprintf (buf, "%g", - zero) < 0
208 || strcmp (buf, "-0") != 0)
212 [gl_cv_func_printf_infinite=yes],
213 [gl_cv_func_printf_infinite=no],
217 # Guess yes on glibc systems.
218 *-gnu*) gl_cv_func_printf_infinite="guessing yes";;
219 # Guess yes on FreeBSD >= 6.
220 freebsd[1-5]*) gl_cv_func_printf_infinite="guessing no";;
221 freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
222 # Guess yes on MacOS X >= 10.3.
223 darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";;
224 darwin*) gl_cv_func_printf_infinite="guessing yes";;
225 # Guess yes on HP-UX >= 11.
226 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
227 hpux*) gl_cv_func_printf_infinite="guessing yes";;
228 # Guess yes on NetBSD >= 3.
229 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
230 gl_cv_func_printf_infinite="guessing no";;
231 netbsd*) gl_cv_func_printf_infinite="guessing yes";;
233 beos*) gl_cv_func_printf_infinite="guessing yes";;
234 # If we don't know, assume the worst.
235 *) gl_cv_func_printf_infinite="guessing no";;
242 dnl Test whether the *printf family of functions supports infinite and NaN
243 dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
244 dnl Result is gl_cv_func_printf_infinite_long_double.
246 AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
248 AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
249 AC_REQUIRE([AC_PROG_CC])
250 AC_REQUIRE([gl_BIGENDIAN])
251 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
252 dnl The user can set or unset the variable gl_printf_safe to indicate
253 dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
254 if test -n "$gl_printf_safe"; then
255 AC_DEFINE([CHECK_PRINTF_SAFE], [1],
256 [Define if you wish *printf() functions that have a safe handling of
257 non-IEEE-754 'long double' values.])
259 case "$gl_cv_func_printf_long_double" in
261 AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
262 [gl_cv_func_printf_infinite_long_double],
271 strisnan (const char *string, size_t start_index, size_t end_index)
273 if (start_index < end_index)
275 if (string[start_index] == '-')
277 if (start_index + 3 <= end_index
278 && memcmp (string + start_index, "nan", 3) == 0)
281 if (start_index == end_index
282 || (string[start_index] == '(' && string[end_index - 1] == ')'))
288 static char buf[10000];
289 static long double zeroL = 0.0L;
293 if (sprintf (buf, "%Lf", 1.0L / 0.0L) < 0
294 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
296 if (sprintf (buf, "%Lf", -1.0L / 0.0L) < 0
297 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
299 if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
300 || !strisnan (buf, 0, strlen (buf)))
302 if (sprintf (buf, "%Le", 1.0L / 0.0L) < 0
303 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
305 if (sprintf (buf, "%Le", -1.0L / 0.0L) < 0
306 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
308 if (sprintf (buf, "%Le", zeroL / zeroL) < 0
309 || !strisnan (buf, 0, strlen (buf)))
311 if (sprintf (buf, "%Lg", 1.0L / 0.0L) < 0
312 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
314 if (sprintf (buf, "%Lg", -1.0L / 0.0L) < 0
315 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
317 if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
318 || !strisnan (buf, 0, strlen (buf)))
320 #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_))
321 /* Representation of an 80-bit 'long double' as an initializer for a sequence
322 of 'unsigned int' words. */
323 # ifdef WORDS_BIGENDIAN
324 # define LDBL80_WORDS(exponent,manthi,mantlo) \
325 { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
326 ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
327 (unsigned int) (mantlo) << 16 \
330 # define LDBL80_WORDS(exponent,manthi,mantlo) \
331 { mantlo, manthi, exponent }
334 static union { unsigned int word[4]; long double value; } x =
335 { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
336 if (sprintf (buf, "%Lf", x.value) < 0
337 || !strisnan (buf, 0, strlen (buf)))
339 if (sprintf (buf, "%Le", x.value) < 0
340 || !strisnan (buf, 0, strlen (buf)))
342 if (sprintf (buf, "%Lg", x.value) < 0
343 || !strisnan (buf, 0, strlen (buf)))
347 /* Signalling NaN. */
348 static union { unsigned int word[4]; long double value; } x =
349 { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
350 if (sprintf (buf, "%Lf", x.value) < 0
351 || !strisnan (buf, 0, strlen (buf)))
353 if (sprintf (buf, "%Le", x.value) < 0
354 || !strisnan (buf, 0, strlen (buf)))
356 if (sprintf (buf, "%Lg", x.value) < 0
357 || !strisnan (buf, 0, strlen (buf)))
361 static union { unsigned int word[4]; long double value; } x =
362 { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
363 if (sprintf (buf, "%Lf", x.value) < 0
364 || !strisnan (buf, 0, strlen (buf)))
366 if (sprintf (buf, "%Le", x.value) < 0
367 || !strisnan (buf, 0, strlen (buf)))
369 if (sprintf (buf, "%Lg", x.value) < 0
370 || !strisnan (buf, 0, strlen (buf)))
373 { /* Pseudo-Infinity. */
374 static union { unsigned int word[4]; long double value; } x =
375 { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
376 if (sprintf (buf, "%Lf", x.value) < 0
377 || !strisnan (buf, 0, strlen (buf)))
379 if (sprintf (buf, "%Le", x.value) < 0
380 || !strisnan (buf, 0, strlen (buf)))
382 if (sprintf (buf, "%Lg", x.value) < 0
383 || !strisnan (buf, 0, strlen (buf)))
387 static union { unsigned int word[4]; long double value; } x =
388 { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
389 if (sprintf (buf, "%Lf", x.value) < 0
390 || !strisnan (buf, 0, strlen (buf)))
392 if (sprintf (buf, "%Le", x.value) < 0
393 || !strisnan (buf, 0, strlen (buf)))
395 if (sprintf (buf, "%Lg", x.value) < 0
396 || !strisnan (buf, 0, strlen (buf)))
399 { /* Unnormalized number. */
400 static union { unsigned int word[4]; long double value; } x =
401 { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
402 if (sprintf (buf, "%Lf", x.value) < 0
403 || !strisnan (buf, 0, strlen (buf)))
405 if (sprintf (buf, "%Le", x.value) < 0
406 || !strisnan (buf, 0, strlen (buf)))
408 if (sprintf (buf, "%Lg", x.value) < 0
409 || !strisnan (buf, 0, strlen (buf)))
412 { /* Pseudo-Denormal. */
413 static union { unsigned int word[4]; long double value; } x =
414 { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
415 if (sprintf (buf, "%Lf", x.value) < 0
416 || !strisnan (buf, 0, strlen (buf)))
418 if (sprintf (buf, "%Le", x.value) < 0
419 || !strisnan (buf, 0, strlen (buf)))
421 if (sprintf (buf, "%Lg", x.value) < 0
422 || !strisnan (buf, 0, strlen (buf)))
428 [gl_cv_func_printf_infinite_long_double=yes],
429 [gl_cv_func_printf_infinite_long_double=no],
433 # Guess no on ia64, x86_64, i386.
434 ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
437 # Guess yes on glibc systems.
438 *-gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";;
439 # Guess yes on FreeBSD >= 6.
440 freebsd[1-5]*) gl_cv_func_printf_infinite_long_double="guessing no";;
441 freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
442 # Guess yes on MacOS X >= 10.3.
443 darwin[1-6].*) gl_cv_func_printf_infinite_long_double="guessing no";;
444 darwin*) gl_cv_func_printf_infinite_long_double="guessing yes";;
445 # Guess yes on HP-UX >= 11.
446 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
447 hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";;
448 # Guess yes on NetBSD >= 3.
449 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
450 gl_cv_func_printf_infinite_long_double="guessing no";;
451 netbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
452 # If we don't know, assume the worst.
453 *) gl_cv_func_printf_infinite_long_double="guessing no";;
462 gl_cv_func_printf_infinite_long_double="irrelevant"
467 dnl Test whether the *printf family of functions supports the 'a' and 'A'
468 dnl conversion specifier for hexadecimal output of floating-point numbers.
469 dnl (ISO C99, POSIX:2001)
470 dnl Result is gl_cv_func_printf_directive_a.
472 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
474 AC_REQUIRE([AC_PROG_CC])
475 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
476 AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
477 [gl_cv_func_printf_directive_a],
483 static char buf[100];
486 if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
487 || (strcmp (buf, "0x1.922p+1 33") != 0
488 && strcmp (buf, "0x3.244p+0 33") != 0
489 && strcmp (buf, "0x6.488p-1 33") != 0
490 && strcmp (buf, "0xc.91p-2 33") != 0))
492 if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
493 || (strcmp (buf, "-0X1.922P+1 33") != 0
494 && strcmp (buf, "-0X3.244P+0 33") != 0
495 && strcmp (buf, "-0X6.488P-1 33") != 0
496 && strcmp (buf, "-0XC.91P-2 33") != 0))
498 /* This catches a FreeBSD 6.1 bug: it doesn't round. */
499 if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
500 || (strcmp (buf, "0x1.83p+0 33") != 0
501 && strcmp (buf, "0x3.05p-1 33") != 0
502 && strcmp (buf, "0x6.0ap-2 33") != 0
503 && strcmp (buf, "0xc.14p-3 33") != 0))
505 /* This catches a FreeBSD 6.1 bug. See
506 <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
507 if (sprintf (buf, "%010a %d", 1.0 / 0.0, 33, 44, 55) < 0
510 /* This catches a MacOS X 10.3.9 (Darwin 7.9) bug. */
511 if (sprintf (buf, "%.1a", 1.999) < 0
512 || (strcmp (buf, "0x1.0p+1") != 0
513 && strcmp (buf, "0x2.0p+0") != 0
514 && strcmp (buf, "0x4.0p-1") != 0
515 && strcmp (buf, "0x8.0p-2") != 0))
517 /* This catches the same MacOS X 10.3.9 (Darwin 7.9) bug and also a
518 glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
519 if (sprintf (buf, "%.1La", 1.999L) < 0
520 || (strcmp (buf, "0x1.0p+1") != 0
521 && strcmp (buf, "0x2.0p+0") != 0
522 && strcmp (buf, "0x4.0p-1") != 0
523 && strcmp (buf, "0x8.0p-2") != 0))
527 [gl_cv_func_printf_directive_a=yes],
528 [gl_cv_func_printf_directive_a=no],
531 # Guess yes on glibc >= 2.5 systems.
533 AC_EGREP_CPP([BZ2908], [
534 #include <features.h>
535 #ifdef __GNU_LIBRARY__
536 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)
541 [gl_cv_func_printf_directive_a="guessing yes"],
542 [gl_cv_func_printf_directive_a="guessing no"])
544 # If we don't know, assume the worst.
545 *) gl_cv_func_printf_directive_a="guessing no";;
551 dnl Test whether the *printf family of functions supports the %F format
552 dnl directive. (ISO C99, POSIX:2001)
553 dnl Result is gl_cv_func_printf_directive_f.
555 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
557 AC_REQUIRE([AC_PROG_CC])
558 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
559 AC_CACHE_CHECK([whether printf supports the 'F' directive],
560 [gl_cv_func_printf_directive_f],
566 static char buf[100];
569 if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
570 || strcmp (buf, "1234567.000000 33") != 0)
572 if (sprintf (buf, "%F", 1.0 / 0.0) < 0
573 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
575 /* This catches a Cygwin 1.5.x bug. */
576 if (sprintf (buf, "%.F", 1234.0) < 0
577 || strcmp (buf, "1234") != 0)
581 [gl_cv_func_printf_directive_f=yes],
582 [gl_cv_func_printf_directive_f=no],
586 # Guess yes on glibc systems.
587 *-gnu*) gl_cv_func_printf_directive_f="guessing yes";;
588 # Guess yes on FreeBSD >= 6.
589 freebsd[1-5]*) gl_cv_func_printf_directive_f="guessing no";;
590 freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
591 # Guess yes on MacOS X >= 10.3.
592 darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";;
593 darwin*) gl_cv_func_printf_directive_f="guessing yes";;
594 # Guess yes on Solaris >= 2.10.
595 solaris2.[0-9]*) gl_cv_func_printf_directive_f="guessing no";;
596 solaris*) gl_cv_func_printf_directive_f="guessing yes";;
597 # If we don't know, assume the worst.
598 *) gl_cv_func_printf_directive_f="guessing no";;
605 dnl Test whether the *printf family of functions supports the %n format
606 dnl directive. (ISO C99, POSIX:2001)
607 dnl Result is gl_cv_func_printf_directive_n.
609 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
611 AC_REQUIRE([AC_PROG_CC])
612 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
613 AC_CACHE_CHECK([whether printf supports the 'n' directive],
614 [gl_cv_func_printf_directive_n],
620 static char fmtstring[10];
621 static char buf[100];
625 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
626 support %n in format strings in read-only memory but not in writable
628 strcpy (fmtstring, "%d %n");
629 if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
630 || strcmp (buf, "123 ") != 0
635 [gl_cv_func_printf_directive_n=yes],
636 [gl_cv_func_printf_directive_n=no],
640 *) gl_cv_func_printf_directive_n="guessing yes";;
647 dnl Test whether the *printf family of functions supports the %ls format
648 dnl directive and in particular, when a precision is specified, whether
649 dnl the functions stop converting the wide string argument when the number
650 dnl of bytes that have been produced by this conversion equals or exceeds
652 dnl Result is gl_cv_func_printf_directive_ls.
654 AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
656 AC_REQUIRE([AC_PROG_CC])
657 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
658 AC_CACHE_CHECK([whether printf supports the 'ls' directive],
659 [gl_cv_func_printf_directive_ls],
663 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
665 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
666 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 BeOS, precisions larger than 1044
893 dnl crash the program.
894 dnl Result is gl_cv_func_printf_precision.
896 AC_DEFUN([gl_PRINTF_PRECISION],
898 AC_REQUIRE([AC_PROG_CC])
899 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
900 AC_CACHE_CHECK([whether printf supports large precisions],
901 [gl_cv_func_printf_precision],
907 static char buf[5000];
911 /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
914 if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
918 [gl_cv_func_printf_precision=yes],
919 [gl_cv_func_printf_precision=no],
923 # Guess no only on native Win32 and BeOS systems.
924 mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
925 beos*) gl_cv_func_printf_precision="guessing no" ;;
926 *) gl_cv_func_printf_precision="guessing yes" ;;
933 dnl Test whether the *printf family of functions recovers gracefully in case
934 dnl of an out-of-memory condition, or whether it crashes the entire program.
935 dnl Result is gl_cv_func_printf_enomem.
937 AC_DEFUN([gl_PRINTF_ENOMEM],
939 AC_REQUIRE([AC_PROG_CC])
940 AC_REQUIRE([gl_MULTIARCH])
941 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
942 AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
943 [gl_cv_func_printf_enomem],
945 gl_cv_func_printf_enomem="guessing no"
946 if test "$cross_compiling" = no; then
947 if test $APPLE_UNIVERSAL_BUILD = 0; then
948 AC_LANG_CONFTEST([AC_LANG_SOURCE([
952 #include <sys/types.h>
953 #include <sys/time.h>
954 #include <sys/resource.h>
961 /* Some printf implementations allocate temporary space with malloc. */
962 /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
964 if (getrlimit (RLIMIT_DATA, &limit) < 0)
966 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
967 limit.rlim_max = 5000000;
968 limit.rlim_cur = limit.rlim_max;
969 if (setrlimit (RLIMIT_DATA, &limit) < 0)
972 /* On Linux systems, malloc() is limited by RLIMIT_AS. */
974 if (getrlimit (RLIMIT_AS, &limit) < 0)
976 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
977 limit.rlim_max = 5000000;
978 limit.rlim_cur = limit.rlim_max;
979 if (setrlimit (RLIMIT_AS, &limit) < 0)
982 /* Some printf implementations allocate temporary space on the stack. */
984 if (getrlimit (RLIMIT_STACK, &limit) < 0)
986 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
987 limit.rlim_max = 5000000;
988 limit.rlim_cur = limit.rlim_max;
989 if (setrlimit (RLIMIT_STACK, &limit) < 0)
992 ret = printf ("%.5000000f", 1.0);
993 return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
997 if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
1000 if test $result != 0 && test $result != 77; then result=1; fi
1002 ) >/dev/null 2>/dev/null
1004 0) gl_cv_func_printf_enomem="yes" ;;
1005 77) gl_cv_func_printf_enomem="guessing no" ;;
1006 *) gl_cv_func_printf_enomem="no" ;;
1009 gl_cv_func_printf_enomem="guessing no"
1013 dnl A universal build on Apple MacOS X platforms.
1014 dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
1015 dnl But we need a configuration result that is valid in both modes.
1016 gl_cv_func_printf_enomem="guessing no"
1019 if test "$gl_cv_func_printf_enomem" = "guessing no"; then
1022 # Guess yes on glibc systems.
1023 *-gnu*) gl_cv_func_printf_enomem="guessing yes";;
1024 # Guess yes on Solaris.
1025 solaris*) gl_cv_func_printf_enomem="guessing yes";;
1027 aix*) gl_cv_func_printf_enomem="guessing yes";;
1028 # Guess yes on HP-UX/hppa.
1029 hpux*) case "$host_cpu" in
1030 hppa*) gl_cv_func_printf_enomem="guessing yes";;
1031 *) gl_cv_func_printf_enomem="guessing no";;
1034 # Guess yes on IRIX.
1035 irix*) gl_cv_func_printf_enomem="guessing yes";;
1036 # Guess yes on OSF/1.
1037 osf*) gl_cv_func_printf_enomem="guessing yes";;
1038 # Guess yes on BeOS.
1039 beos*) gl_cv_func_printf_enomem="guessing yes";;
1040 # Guess yes on Haiku.
1041 haiku*) gl_cv_func_printf_enomem="guessing yes";;
1042 # If we don't know, assume the worst.
1043 *) gl_cv_func_printf_enomem="guessing no";;
1050 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
1051 dnl Result is ac_cv_func_snprintf.
1053 AC_DEFUN([gl_SNPRINTF_PRESENCE],
1055 AC_CHECK_FUNCS_ONCE([snprintf])
1058 dnl Test whether the string produced by the snprintf function is always NUL
1059 dnl terminated. (ISO C99, POSIX:2001)
1060 dnl Result is gl_cv_func_snprintf_truncation_c99.
1062 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
1064 AC_REQUIRE([AC_PROG_CC])
1065 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1066 AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
1067 [gl_cv_func_snprintf_truncation_c99],
1073 static char buf[100];
1076 strcpy (buf, "ABCDEF");
1077 snprintf (buf, 3, "%d %d", 4567, 89);
1078 if (memcmp (buf, "45\0DEF", 6) != 0)
1082 [gl_cv_func_snprintf_truncation_c99=yes],
1083 [gl_cv_func_snprintf_truncation_c99=no],
1087 # Guess yes on glibc systems.
1088 *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1089 # Guess yes on FreeBSD >= 5.
1090 freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1091 freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1092 # Guess yes on MacOS X >= 10.3.
1093 darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1094 darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1095 # Guess yes on OpenBSD >= 3.9.
1096 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1097 gl_cv_func_snprintf_truncation_c99="guessing no";;
1098 openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1099 # Guess yes on Solaris >= 2.6.
1100 solaris2.[0-5]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1101 solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1102 # Guess yes on AIX >= 4.
1103 aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1104 aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1105 # Guess yes on HP-UX >= 11.
1106 hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1107 hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1108 # Guess yes on IRIX >= 6.5.
1109 irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1110 # Guess yes on OSF/1 >= 5.
1111 osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1112 osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1113 # Guess yes on NetBSD >= 3.
1114 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1115 gl_cv_func_snprintf_truncation_c99="guessing no";;
1116 netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1117 # Guess yes on BeOS.
1118 beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1119 # If we don't know, assume the worst.
1120 *) gl_cv_func_snprintf_truncation_c99="guessing no";;
1127 dnl Test whether the return value of the snprintf function is the number
1128 dnl of bytes (excluding the terminating NUL) that would have been produced
1129 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
1130 dnl For example, this test program fails on IRIX 6.5:
1131 dnl ---------------------------------------------------------------------
1132 dnl #include <stdio.h>
1135 dnl static char buf[8];
1136 dnl int retval = snprintf (buf, 3, "%d", 12345);
1137 dnl return retval >= 0 && retval < 3;
1139 dnl ---------------------------------------------------------------------
1140 dnl Result is gl_cv_func_snprintf_retval_c99.
1142 AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99],
1144 AC_REQUIRE([AC_PROG_CC])
1145 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1146 AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
1147 [gl_cv_func_snprintf_retval_c99],
1153 static char buf[100];
1156 strcpy (buf, "ABCDEF");
1157 if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
1161 [gl_cv_func_snprintf_retval_c99=yes],
1162 [gl_cv_func_snprintf_retval_c99=no],
1166 # Guess yes on glibc systems.
1167 *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1168 # Guess yes on FreeBSD >= 5.
1169 freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1170 freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1171 # Guess yes on MacOS X >= 10.3.
1172 darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
1173 darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1174 # Guess yes on OpenBSD >= 3.9.
1175 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1176 gl_cv_func_snprintf_retval_c99="guessing no";;
1177 openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1178 # Guess yes on Solaris >= 2.6.
1179 solaris2.[0-5]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1180 solaris*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1181 # Guess yes on AIX >= 4.
1182 aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1183 aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1184 # Guess yes on NetBSD >= 3.
1185 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1186 gl_cv_func_snprintf_retval_c99="guessing no";;
1187 netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1188 # Guess yes on BeOS.
1189 beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1190 # If we don't know, assume the worst.
1191 *) gl_cv_func_snprintf_retval_c99="guessing no";;
1198 dnl Test whether the snprintf function supports the %n format directive
1199 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1200 dnl Result is gl_cv_func_snprintf_directive_n.
1202 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1204 AC_REQUIRE([AC_PROG_CC])
1205 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1206 AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1207 [gl_cv_func_snprintf_directive_n],
1213 static char fmtstring[10];
1214 static char buf[100];
1218 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
1219 support %n in format strings in read-only memory but not in writable
1221 strcpy (fmtstring, "%d %n");
1222 snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1227 [gl_cv_func_snprintf_directive_n=yes],
1228 [gl_cv_func_snprintf_directive_n=no],
1232 # Guess yes on glibc systems.
1233 *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";;
1234 # Guess yes on FreeBSD >= 5.
1235 freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1236 freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1237 # Guess yes on MacOS X >= 10.3.
1238 darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
1239 darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
1240 # Guess yes on Solaris >= 2.6.
1241 solaris2.[0-5]*) gl_cv_func_snprintf_directive_n="guessing no";;
1242 solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
1243 # Guess yes on AIX >= 4.
1244 aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
1245 aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
1246 # Guess yes on IRIX >= 6.5.
1247 irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
1248 # Guess yes on OSF/1 >= 5.
1249 osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1250 osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
1251 # Guess yes on NetBSD >= 3.
1252 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1253 gl_cv_func_snprintf_directive_n="guessing no";;
1254 netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1255 # Guess yes on BeOS.
1256 beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
1257 # If we don't know, assume the worst.
1258 *) gl_cv_func_snprintf_directive_n="guessing no";;
1265 dnl Test whether the snprintf function, when passed a size = 1, writes any
1266 dnl output without bounds in this case, behaving like sprintf. This is the
1267 dnl case on Linux libc5.
1268 dnl Result is gl_cv_func_snprintf_size1.
1270 AC_DEFUN([gl_SNPRINTF_SIZE1],
1272 AC_REQUIRE([AC_PROG_CC])
1273 AC_CACHE_CHECK([whether snprintf respects a size of 1],
1274 [gl_cv_func_snprintf_size1],
1281 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1282 snprintf (buf, 1, "%d", 12345);
1283 return buf[1] != 'E';
1285 [gl_cv_func_snprintf_size1=yes],
1286 [gl_cv_func_snprintf_size1=no],
1287 [gl_cv_func_snprintf_size1="guessing yes"])
1291 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1292 dnl output. (ISO C99, POSIX:2001)
1293 dnl For example, snprintf nevertheless writes a NUL byte in this case
1295 dnl ---------------------------------------------------------------------
1296 dnl #include <stdio.h>
1299 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1300 dnl snprintf (buf, 0, "%d", 12345);
1301 dnl return buf[0] != 'D';
1303 dnl ---------------------------------------------------------------------
1304 dnl And vsnprintf writes any output without bounds in this case, behaving like
1305 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1306 dnl ---------------------------------------------------------------------
1307 dnl #include <stdarg.h>
1308 dnl #include <stdio.h>
1309 dnl static int my_snprintf (char *buf, int size, const char *format, ...)
1313 dnl va_start (args, format);
1314 dnl ret = vsnprintf (buf, size, format, args);
1320 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1321 dnl my_snprintf (buf, 0, "%d", 12345);
1322 dnl return buf[0] != 'D';
1324 dnl ---------------------------------------------------------------------
1325 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1327 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1329 AC_REQUIRE([AC_PROG_CC])
1330 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1331 AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1332 [gl_cv_func_vsnprintf_zerosize_c99],
1338 static int my_snprintf (char *buf, int size, const char *format, ...)
1342 va_start (args, format);
1343 ret = vsnprintf (buf, size, format, args);
1349 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1350 my_snprintf (buf, 0, "%d", 12345);
1351 return buf[0] != 'D';
1353 [gl_cv_func_vsnprintf_zerosize_c99=yes],
1354 [gl_cv_func_vsnprintf_zerosize_c99=no],
1358 # Guess yes on glibc systems.
1359 *-gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1360 # Guess yes on FreeBSD >= 5.
1361 freebsd[1-4]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1362 freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1363 # Guess yes on MacOS X >= 10.3.
1364 darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1365 darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1366 # Guess yes on Cygwin.
1367 cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1368 # Guess yes on Solaris >= 2.6.
1369 solaris2.[0-5]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1370 solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1371 # Guess yes on AIX >= 4.
1372 aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1373 aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1374 # Guess yes on IRIX >= 6.5.
1375 irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1376 # Guess yes on NetBSD >= 3.
1377 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1378 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1379 netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1380 # Guess yes on BeOS.
1381 beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1382 # Guess yes on mingw.
1383 mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1384 # If we don't know, assume the worst.
1385 *) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1392 dnl The results of these tests on various platforms are:
1394 dnl 1 = gl_PRINTF_SIZES_C99
1395 dnl 2 = gl_PRINTF_LONG_DOUBLE
1396 dnl 3 = gl_PRINTF_INFINITE
1397 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1398 dnl 5 = gl_PRINTF_DIRECTIVE_A
1399 dnl 6 = gl_PRINTF_DIRECTIVE_F
1400 dnl 7 = gl_PRINTF_DIRECTIVE_N
1401 dnl 8 = gl_PRINTF_DIRECTIVE_LS
1402 dnl 9 = gl_PRINTF_POSITIONS
1403 dnl 10 = gl_PRINTF_FLAG_GROUPING
1404 dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
1405 dnl 12 = gl_PRINTF_FLAG_ZERO
1406 dnl 13 = gl_PRINTF_PRECISION
1407 dnl 14 = gl_PRINTF_ENOMEM
1408 dnl 15 = gl_SNPRINTF_PRESENCE
1409 dnl 16 = gl_SNPRINTF_TRUNCATION_C99
1410 dnl 17 = gl_SNPRINTF_RETVAL_C99
1411 dnl 18 = gl_SNPRINTF_DIRECTIVE_N
1412 dnl 19 = gl_SNPRINTF_SIZE1
1413 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
1415 dnl 1 = checking whether printf supports size specifiers as in C99...
1416 dnl 2 = checking whether printf supports 'long double' arguments...
1417 dnl 3 = checking whether printf supports infinite 'double' arguments...
1418 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1419 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1420 dnl 6 = checking whether printf supports the 'F' directive...
1421 dnl 7 = checking whether printf supports the 'n' directive...
1422 dnl 8 = checking whether printf supports the 'ls' directive...
1423 dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
1424 dnl 10 = checking whether printf supports the grouping flag...
1425 dnl 11 = checking whether printf supports the left-adjust flag correctly...
1426 dnl 12 = checking whether printf supports the zero flag correctly...
1427 dnl 13 = checking whether printf supports large precisions...
1428 dnl 14 = checking whether printf survives out-of-memory conditions...
1429 dnl 15 = checking for snprintf...
1430 dnl 16 = checking whether snprintf truncates the result as in C99...
1431 dnl 17 = checking whether snprintf returns a byte count as in C99...
1432 dnl 18 = checking whether snprintf fully supports the 'n' directive...
1433 dnl 19 = checking whether snprintf respects a size of 1...
1434 dnl 20 = checking whether vsnprintf respects a zero size as in C99...
1436 dnl . = yes, # = no.
1438 dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1439 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . .
1440 dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . .
1441 dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . .
1442 dnl MacOS X 10.3.9 . . . . # . . . . . . # . # . . . . . .
1443 dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . .
1444 dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . .
1445 dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . .
1446 dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . .
1447 dnl Solaris 10 . . # # # . . # . . . # . . . . . . . .
1448 dnl Solaris 2.6 ... 9 # . # # # # . # . . . # . . . . . . . .
1449 dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # #
1450 dnl AIX 5.2, 7.1 . . # # # . . . . . . # . . . . . . . .
1451 dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . . . . .
1452 dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . .
1453 dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . #
1454 dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? #
1455 dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . .
1456 dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . #
1457 dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # #
1458 dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ?
1459 dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . .
1460 dnl Haiku . . . # # # . # . . . . . ? . . . . . .
1461 dnl BeOS # # . # # # . ? # . ? . # ? . . . . . .
1462 dnl mingw # # # # # # . . # # . # # ? . # # # . .