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 HP-UX >= 11.
443 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
444 hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";;
445 # If we don't know, assume the worst.
446 *) gl_cv_func_printf_infinite_long_double="guessing no";;
455 gl_cv_func_printf_infinite_long_double="irrelevant"
460 dnl Test whether the *printf family of functions supports the 'a' and 'A'
461 dnl conversion specifier for hexadecimal output of floating-point numbers.
462 dnl (ISO C99, POSIX:2001)
463 dnl Result is gl_cv_func_printf_directive_a.
465 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
467 AC_REQUIRE([AC_PROG_CC])
468 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
469 AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
470 [gl_cv_func_printf_directive_a],
476 static char buf[100];
479 if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
480 || (strcmp (buf, "0x1.922p+1 33") != 0
481 && strcmp (buf, "0x3.244p+0 33") != 0
482 && strcmp (buf, "0x6.488p-1 33") != 0
483 && strcmp (buf, "0xc.91p-2 33") != 0))
485 if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
486 || (strcmp (buf, "-0X1.922P+1 33") != 0
487 && strcmp (buf, "-0X3.244P+0 33") != 0
488 && strcmp (buf, "-0X6.488P-1 33") != 0
489 && strcmp (buf, "-0XC.91P-2 33") != 0))
491 /* This catches a FreeBSD 6.1 bug: it doesn't round. */
492 if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
493 || (strcmp (buf, "0x1.83p+0 33") != 0
494 && strcmp (buf, "0x3.05p-1 33") != 0
495 && strcmp (buf, "0x6.0ap-2 33") != 0
496 && strcmp (buf, "0xc.14p-3 33") != 0))
498 /* This catches a FreeBSD 6.1 bug. See
499 <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
500 if (sprintf (buf, "%010a %d", 1.0 / 0.0, 33, 44, 55) < 0
503 /* This catches a MacOS X 10.3.9 (Darwin 7.9) bug. */
504 if (sprintf (buf, "%.1a", 1.999) < 0
505 || (strcmp (buf, "0x1.0p+1") != 0
506 && strcmp (buf, "0x2.0p+0") != 0
507 && strcmp (buf, "0x4.0p-1") != 0
508 && strcmp (buf, "0x8.0p-2") != 0))
510 /* This catches the same MacOS X 10.3.9 (Darwin 7.9) bug and also a
511 glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
512 if (sprintf (buf, "%.1La", 1.999L) < 0
513 || (strcmp (buf, "0x1.0p+1") != 0
514 && strcmp (buf, "0x2.0p+0") != 0
515 && strcmp (buf, "0x4.0p-1") != 0
516 && strcmp (buf, "0x8.0p-2") != 0))
520 [gl_cv_func_printf_directive_a=yes],
521 [gl_cv_func_printf_directive_a=no],
524 # Guess yes on glibc >= 2.5 systems.
526 AC_EGREP_CPP([BZ2908], [
527 #include <features.h>
528 #ifdef __GNU_LIBRARY__
529 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
534 [gl_cv_func_printf_directive_a="guessing yes"],
535 [gl_cv_func_printf_directive_a="guessing no"])
537 # If we don't know, assume the worst.
538 *) gl_cv_func_printf_directive_a="guessing no";;
544 dnl Test whether the *printf family of functions supports the %F format
545 dnl directive. (ISO C99, POSIX:2001)
546 dnl Result is gl_cv_func_printf_directive_f.
548 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
550 AC_REQUIRE([AC_PROG_CC])
551 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
552 AC_CACHE_CHECK([whether printf supports the 'F' directive],
553 [gl_cv_func_printf_directive_f],
559 static char buf[100];
562 if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
563 || strcmp (buf, "1234567.000000 33") != 0)
565 if (sprintf (buf, "%F", 1.0 / 0.0) < 0
566 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
568 /* This catches a Cygwin 1.5.x bug. */
569 if (sprintf (buf, "%.F", 1234.0) < 0
570 || strcmp (buf, "1234") != 0)
574 [gl_cv_func_printf_directive_f=yes],
575 [gl_cv_func_printf_directive_f=no],
579 # Guess yes on glibc systems.
580 *-gnu*) gl_cv_func_printf_directive_f="guessing yes";;
581 # Guess yes on FreeBSD >= 6.
582 freebsd[1-5]*) gl_cv_func_printf_directive_f="guessing no";;
583 freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
584 # Guess yes on MacOS X >= 10.3.
585 darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";;
586 darwin*) gl_cv_func_printf_directive_f="guessing yes";;
587 # Guess yes on Solaris >= 2.10.
588 solaris2.[0-9]*) gl_cv_func_printf_directive_f="guessing no";;
589 solaris*) gl_cv_func_printf_directive_f="guessing yes";;
590 # If we don't know, assume the worst.
591 *) gl_cv_func_printf_directive_f="guessing no";;
598 dnl Test whether the *printf family of functions supports the %n format
599 dnl directive. (ISO C99, POSIX:2001)
600 dnl Result is gl_cv_func_printf_directive_n.
602 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
604 AC_REQUIRE([AC_PROG_CC])
605 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
606 AC_CACHE_CHECK([whether printf supports the 'n' directive],
607 [gl_cv_func_printf_directive_n],
613 static char fmtstring[10];
614 static char buf[100];
618 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
619 support %n in format strings in read-only memory but not in writable
621 strcpy (fmtstring, "%d %n");
622 if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
623 || strcmp (buf, "123 ") != 0
628 [gl_cv_func_printf_directive_n=yes],
629 [gl_cv_func_printf_directive_n=no],
633 *) gl_cv_func_printf_directive_n="guessing yes";;
640 dnl Test whether the *printf family of functions supports the %ls format
641 dnl directive and in particular, when a precision is specified, whether
642 dnl the functions stop converting the wide string argument when the number
643 dnl of bytes that have been produced by this conversion equals or exceeds
645 dnl Result is gl_cv_func_printf_directive_ls.
647 AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
649 AC_REQUIRE([AC_PROG_CC])
650 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
651 AC_CACHE_CHECK([whether printf supports the 'ls' directive],
652 [gl_cv_func_printf_directive_ls],
656 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
658 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
659 included before <wchar.h>. */
668 /* Test whether %ls works at all.
669 This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
672 static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
674 if (sprintf (buf, "%ls", wstring) < 0
675 || strcmp (buf, "abc") != 0)
678 /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
679 assertion failure inside libc), but not on OpenBSD 4.0. */
681 static const wchar_t wstring[] = { 'a', 0 };
683 if (sprintf (buf, "%ls", wstring) < 0
684 || strcmp (buf, "a") != 0)
687 /* Test whether precisions in %ls are supported as specified in ISO C 99
689 "If a precision is specified, no more than that many bytes are written
690 (including shift sequences, if any), and the array shall contain a
691 null wide character if, to equal the multibyte character sequence
692 length given by the precision, the function would need to access a
693 wide character one past the end of the array."
694 This test fails on Solaris 10. */
696 static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
698 if (sprintf (buf, "%.2ls", wstring) < 0
699 || strcmp (buf, "ab") != 0)
704 [gl_cv_func_printf_directive_ls=yes],
705 [gl_cv_func_printf_directive_ls=no],
709 openbsd*) gl_cv_func_printf_directive_ls="guessing no";;
710 irix*) gl_cv_func_printf_directive_ls="guessing no";;
711 solaris*) gl_cv_func_printf_directive_ls="guessing no";;
712 cygwin*) gl_cv_func_printf_directive_ls="guessing no";;
713 beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";;
714 *) gl_cv_func_printf_directive_ls="guessing yes";;
721 dnl Test whether the *printf family of functions supports POSIX/XSI format
722 dnl strings with positions. (POSIX:2001)
723 dnl Result is gl_cv_func_printf_positions.
725 AC_DEFUN([gl_PRINTF_POSITIONS],
727 AC_REQUIRE([AC_PROG_CC])
728 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
729 AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
730 [gl_cv_func_printf_positions],
736 /* The string "%2$d %1$d", with dollar characters protected from the shell's
737 dollar expansion (possibly an autoconf bug). */
738 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
739 static char buf[100];
742 sprintf (buf, format, 33, 55);
743 return (strcmp (buf, "55 33") != 0);
745 [gl_cv_func_printf_positions=yes],
746 [gl_cv_func_printf_positions=no],
750 netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
751 gl_cv_func_printf_positions="guessing no";;
752 beos*) gl_cv_func_printf_positions="guessing no";;
753 mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
754 *) gl_cv_func_printf_positions="guessing yes";;
761 dnl Test whether the *printf family of functions supports POSIX/XSI format
762 dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
763 dnl Result is gl_cv_func_printf_flag_grouping.
765 AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
767 AC_REQUIRE([AC_PROG_CC])
768 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
769 AC_CACHE_CHECK([whether printf supports the grouping flag],
770 [gl_cv_func_printf_flag_grouping],
776 static char buf[100];
779 if (sprintf (buf, "%'d %d", 1234567, 99) < 0
780 || buf[strlen (buf) - 1] != '9')
784 [gl_cv_func_printf_flag_grouping=yes],
785 [gl_cv_func_printf_flag_grouping=no],
789 cygwin*) gl_cv_func_printf_flag_grouping="guessing no";;
790 netbsd*) gl_cv_func_printf_flag_grouping="guessing no";;
791 mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
792 *) gl_cv_func_printf_flag_grouping="guessing yes";;
799 dnl Test whether the *printf family of functions supports the - flag correctly.
801 dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html>
802 dnl Result is gl_cv_func_printf_flag_leftadjust.
804 AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
806 AC_REQUIRE([AC_PROG_CC])
807 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
808 AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
809 [gl_cv_func_printf_flag_leftadjust],
815 static char buf[100];
818 /* Check that a '-' flag is not annihilated by a negative width. */
819 if (sprintf (buf, "a%-*sc", -3, "b") < 0
820 || strcmp (buf, "ab c") != 0)
824 [gl_cv_func_printf_flag_leftadjust=yes],
825 [gl_cv_func_printf_flag_leftadjust=no],
829 # Guess yes on HP-UX 11.
830 hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
831 # Guess no on HP-UX 10 and older.
832 hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";;
833 # Guess yes otherwise.
834 *) gl_cv_func_printf_flag_leftadjust="guessing yes";;
841 dnl Test whether the *printf family of functions supports padding of non-finite
842 dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
843 dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
844 dnl Result is gl_cv_func_printf_flag_zero.
846 AC_DEFUN([gl_PRINTF_FLAG_ZERO],
848 AC_REQUIRE([AC_PROG_CC])
849 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
850 AC_CACHE_CHECK([whether printf supports the zero flag correctly],
851 [gl_cv_func_printf_flag_zero],
857 static char buf[100];
860 if (sprintf (buf, "%010f", 1.0 / 0.0, 33, 44, 55) < 0
861 || (strcmp (buf, " inf") != 0
862 && strcmp (buf, " infinity") != 0))
866 [gl_cv_func_printf_flag_zero=yes],
867 [gl_cv_func_printf_flag_zero=no],
871 # Guess yes on glibc systems.
872 *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
874 beos*) gl_cv_func_printf_flag_zero="guessing yes";;
875 # If we don't know, assume the worst.
876 *) gl_cv_func_printf_flag_zero="guessing no";;
883 dnl Test whether the *printf family of functions supports large precisions.
884 dnl On mingw, precisions larger than 512 are treated like 512, in integer,
885 dnl floating-point or pointer output. On BeOS, precisions larger than 1044
886 dnl crash the program.
887 dnl Result is gl_cv_func_printf_precision.
889 AC_DEFUN([gl_PRINTF_PRECISION],
891 AC_REQUIRE([AC_PROG_CC])
892 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
893 AC_CACHE_CHECK([whether printf supports large precisions],
894 [gl_cv_func_printf_precision],
900 static char buf[5000];
904 /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
907 if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
911 [gl_cv_func_printf_precision=yes],
912 [gl_cv_func_printf_precision=no],
916 # Guess no only on native Win32 and BeOS systems.
917 mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
918 beos*) gl_cv_func_printf_precision="guessing no" ;;
919 *) gl_cv_func_printf_precision="guessing yes" ;;
926 dnl Test whether the *printf family of functions recovers gracefully in case
927 dnl of an out-of-memory condition, or whether it crashes the entire program.
928 dnl Result is gl_cv_func_printf_enomem.
930 AC_DEFUN([gl_PRINTF_ENOMEM],
932 AC_REQUIRE([AC_PROG_CC])
933 AC_REQUIRE([gl_MULTIARCH])
934 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
935 AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
936 [gl_cv_func_printf_enomem],
938 gl_cv_func_printf_enomem="guessing no"
939 if test "$cross_compiling" = no; then
940 if test $APPLE_UNIVERSAL_BUILD = 0; then
941 AC_LANG_CONFTEST([AC_LANG_SOURCE([
945 #include <sys/types.h>
946 #include <sys/time.h>
947 #include <sys/resource.h>
954 /* Some printf implementations allocate temporary space with malloc. */
955 /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
957 if (getrlimit (RLIMIT_DATA, &limit) < 0)
959 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
960 limit.rlim_max = 5000000;
961 limit.rlim_cur = limit.rlim_max;
962 if (setrlimit (RLIMIT_DATA, &limit) < 0)
965 /* On Linux systems, malloc() is limited by RLIMIT_AS. */
967 if (getrlimit (RLIMIT_AS, &limit) < 0)
969 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
970 limit.rlim_max = 5000000;
971 limit.rlim_cur = limit.rlim_max;
972 if (setrlimit (RLIMIT_AS, &limit) < 0)
975 /* Some printf implementations allocate temporary space on the stack. */
977 if (getrlimit (RLIMIT_STACK, &limit) < 0)
979 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
980 limit.rlim_max = 5000000;
981 limit.rlim_cur = limit.rlim_max;
982 if (setrlimit (RLIMIT_STACK, &limit) < 0)
985 ret = printf ("%.5000000f", 1.0);
986 return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
990 if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
993 if test $result != 0 && test $result != 77; then result=1; fi
995 ) >/dev/null 2>/dev/null
997 0) gl_cv_func_printf_enomem="yes" ;;
998 77) gl_cv_func_printf_enomem="guessing no" ;;
999 *) gl_cv_func_printf_enomem="no" ;;
1002 gl_cv_func_printf_enomem="guessing no"
1006 dnl A universal build on Apple MacOS X platforms.
1007 dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
1008 dnl But we need a configuration result that is valid in both modes.
1009 gl_cv_func_printf_enomem="guessing no"
1012 if test "$gl_cv_func_printf_enomem" = "guessing no"; then
1015 # Guess yes on glibc systems.
1016 *-gnu*) gl_cv_func_printf_enomem="guessing yes";;
1017 # Guess yes on Solaris.
1018 solaris*) gl_cv_func_printf_enomem="guessing yes";;
1020 aix*) gl_cv_func_printf_enomem="guessing yes";;
1021 # Guess yes on HP-UX/hppa.
1022 hpux*) case "$host_cpu" in
1023 hppa*) gl_cv_func_printf_enomem="guessing yes";;
1024 *) gl_cv_func_printf_enomem="guessing no";;
1027 # Guess yes on IRIX.
1028 irix*) gl_cv_func_printf_enomem="guessing yes";;
1029 # Guess yes on OSF/1.
1030 osf*) gl_cv_func_printf_enomem="guessing yes";;
1031 # Guess yes on BeOS.
1032 beos*) gl_cv_func_printf_enomem="guessing yes";;
1033 # Guess yes on Haiku.
1034 haiku*) gl_cv_func_printf_enomem="guessing yes";;
1035 # If we don't know, assume the worst.
1036 *) gl_cv_func_printf_enomem="guessing no";;
1043 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
1044 dnl Result is ac_cv_func_snprintf.
1046 AC_DEFUN([gl_SNPRINTF_PRESENCE],
1048 AC_CHECK_FUNCS_ONCE([snprintf])
1051 dnl Test whether the string produced by the snprintf function is always NUL
1052 dnl terminated. (ISO C99, POSIX:2001)
1053 dnl Result is gl_cv_func_snprintf_truncation_c99.
1055 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
1057 AC_REQUIRE([AC_PROG_CC])
1058 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1059 AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
1060 [gl_cv_func_snprintf_truncation_c99],
1066 static char buf[100];
1069 strcpy (buf, "ABCDEF");
1070 snprintf (buf, 3, "%d %d", 4567, 89);
1071 if (memcmp (buf, "45\0DEF", 6) != 0)
1075 [gl_cv_func_snprintf_truncation_c99=yes],
1076 [gl_cv_func_snprintf_truncation_c99=no],
1080 # Guess yes on glibc systems.
1081 *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1082 # Guess yes on FreeBSD >= 5.
1083 freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1084 freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1085 # Guess yes on MacOS X >= 10.3.
1086 darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1087 darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1088 # Guess yes on OpenBSD >= 3.9.
1089 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1090 gl_cv_func_snprintf_truncation_c99="guessing no";;
1091 openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1092 # Guess yes on Solaris >= 2.6.
1093 solaris2.[0-5]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1094 solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1095 # Guess yes on AIX >= 4.
1096 aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1097 aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1098 # Guess yes on HP-UX >= 11.
1099 hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1100 hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1101 # Guess yes on IRIX >= 6.5.
1102 irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1103 # Guess yes on OSF/1 >= 5.
1104 osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1105 osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1106 # Guess yes on NetBSD >= 3.
1107 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1108 gl_cv_func_snprintf_truncation_c99="guessing no";;
1109 netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1110 # Guess yes on BeOS.
1111 beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1112 # If we don't know, assume the worst.
1113 *) gl_cv_func_snprintf_truncation_c99="guessing no";;
1120 dnl Test whether the return value of the snprintf function is the number
1121 dnl of bytes (excluding the terminating NUL) that would have been produced
1122 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
1123 dnl For example, this test program fails on IRIX 6.5:
1124 dnl ---------------------------------------------------------------------
1125 dnl #include <stdio.h>
1128 dnl static char buf[8];
1129 dnl int retval = snprintf (buf, 3, "%d", 12345);
1130 dnl return retval >= 0 && retval < 3;
1132 dnl ---------------------------------------------------------------------
1133 dnl Result is gl_cv_func_snprintf_retval_c99.
1135 AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99],
1137 AC_REQUIRE([AC_PROG_CC])
1138 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1139 AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
1140 [gl_cv_func_snprintf_retval_c99],
1146 static char buf[100];
1149 strcpy (buf, "ABCDEF");
1150 if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
1154 [gl_cv_func_snprintf_retval_c99=yes],
1155 [gl_cv_func_snprintf_retval_c99=no],
1159 # Guess yes on glibc systems.
1160 *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1161 # Guess yes on FreeBSD >= 5.
1162 freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1163 freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1164 # Guess yes on MacOS X >= 10.3.
1165 darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
1166 darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1167 # Guess yes on OpenBSD >= 3.9.
1168 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1169 gl_cv_func_snprintf_retval_c99="guessing no";;
1170 openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1171 # Guess yes on Solaris >= 2.6.
1172 solaris2.[0-5]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1173 solaris*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1174 # Guess yes on AIX >= 4.
1175 aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1176 aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1177 # Guess yes on NetBSD >= 3.
1178 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1179 gl_cv_func_snprintf_retval_c99="guessing no";;
1180 netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1181 # Guess yes on BeOS.
1182 beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1183 # If we don't know, assume the worst.
1184 *) gl_cv_func_snprintf_retval_c99="guessing no";;
1191 dnl Test whether the snprintf function supports the %n format directive
1192 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1193 dnl Result is gl_cv_func_snprintf_directive_n.
1195 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1197 AC_REQUIRE([AC_PROG_CC])
1198 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1199 AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1200 [gl_cv_func_snprintf_directive_n],
1206 static char fmtstring[10];
1207 static char buf[100];
1211 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
1212 support %n in format strings in read-only memory but not in writable
1214 strcpy (fmtstring, "%d %n");
1215 snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1220 [gl_cv_func_snprintf_directive_n=yes],
1221 [gl_cv_func_snprintf_directive_n=no],
1225 # Guess yes on glibc systems.
1226 *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";;
1227 # Guess yes on FreeBSD >= 5.
1228 freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1229 freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1230 # Guess yes on MacOS X >= 10.3.
1231 darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
1232 darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
1233 # Guess yes on Solaris >= 2.6.
1234 solaris2.[0-5]*) gl_cv_func_snprintf_directive_n="guessing no";;
1235 solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
1236 # Guess yes on AIX >= 4.
1237 aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
1238 aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
1239 # Guess yes on IRIX >= 6.5.
1240 irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
1241 # Guess yes on OSF/1 >= 5.
1242 osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1243 osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
1244 # Guess yes on NetBSD >= 3.
1245 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1246 gl_cv_func_snprintf_directive_n="guessing no";;
1247 netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1248 # Guess yes on BeOS.
1249 beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
1250 # If we don't know, assume the worst.
1251 *) gl_cv_func_snprintf_directive_n="guessing no";;
1258 dnl Test whether the snprintf function, when passed a size = 1, writes any
1259 dnl output without bounds in this case, behaving like sprintf. This is the
1260 dnl case on Linux libc5.
1261 dnl Result is gl_cv_func_snprintf_size1.
1263 AC_DEFUN([gl_SNPRINTF_SIZE1],
1265 AC_REQUIRE([AC_PROG_CC])
1266 AC_CACHE_CHECK([whether snprintf respects a size of 1],
1267 [gl_cv_func_snprintf_size1],
1274 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1275 snprintf (buf, 1, "%d", 12345);
1276 return buf[1] != 'E';
1278 [gl_cv_func_snprintf_size1=yes],
1279 [gl_cv_func_snprintf_size1=no],
1280 [gl_cv_func_snprintf_size1="guessing yes"])
1284 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1285 dnl output. (ISO C99, POSIX:2001)
1286 dnl For example, snprintf nevertheless writes a NUL byte in this case
1288 dnl ---------------------------------------------------------------------
1289 dnl #include <stdio.h>
1292 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1293 dnl snprintf (buf, 0, "%d", 12345);
1294 dnl return buf[0] != 'D';
1296 dnl ---------------------------------------------------------------------
1297 dnl And vsnprintf writes any output without bounds in this case, behaving like
1298 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1299 dnl ---------------------------------------------------------------------
1300 dnl #include <stdarg.h>
1301 dnl #include <stdio.h>
1302 dnl static int my_snprintf (char *buf, int size, const char *format, ...)
1306 dnl va_start (args, format);
1307 dnl ret = vsnprintf (buf, size, format, args);
1313 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1314 dnl my_snprintf (buf, 0, "%d", 12345);
1315 dnl return buf[0] != 'D';
1317 dnl ---------------------------------------------------------------------
1318 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1320 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1322 AC_REQUIRE([AC_PROG_CC])
1323 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1324 AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1325 [gl_cv_func_vsnprintf_zerosize_c99],
1331 static int my_snprintf (char *buf, int size, const char *format, ...)
1335 va_start (args, format);
1336 ret = vsnprintf (buf, size, format, args);
1342 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1343 my_snprintf (buf, 0, "%d", 12345);
1344 return buf[0] != 'D';
1346 [gl_cv_func_vsnprintf_zerosize_c99=yes],
1347 [gl_cv_func_vsnprintf_zerosize_c99=no],
1351 # Guess yes on glibc systems.
1352 *-gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1353 # Guess yes on FreeBSD >= 5.
1354 freebsd[1-4]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1355 freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1356 # Guess yes on MacOS X >= 10.3.
1357 darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1358 darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1359 # Guess yes on Cygwin.
1360 cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1361 # Guess yes on Solaris >= 2.6.
1362 solaris2.[0-5]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1363 solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1364 # Guess yes on AIX >= 4.
1365 aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1366 aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1367 # Guess yes on IRIX >= 6.5.
1368 irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1369 # Guess yes on NetBSD >= 3.
1370 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1371 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1372 netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1373 # Guess yes on BeOS.
1374 beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1375 # Guess yes on mingw.
1376 mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1377 # If we don't know, assume the worst.
1378 *) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1385 dnl The results of these tests on various platforms are:
1387 dnl 1 = gl_PRINTF_SIZES_C99
1388 dnl 2 = gl_PRINTF_LONG_DOUBLE
1389 dnl 3 = gl_PRINTF_INFINITE
1390 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1391 dnl 5 = gl_PRINTF_DIRECTIVE_A
1392 dnl 6 = gl_PRINTF_DIRECTIVE_F
1393 dnl 7 = gl_PRINTF_DIRECTIVE_N
1394 dnl 8 = gl_PRINTF_DIRECTIVE_LS
1395 dnl 9 = gl_PRINTF_POSITIONS
1396 dnl 10 = gl_PRINTF_FLAG_GROUPING
1397 dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
1398 dnl 12 = gl_PRINTF_FLAG_ZERO
1399 dnl 13 = gl_PRINTF_PRECISION
1400 dnl 14 = gl_PRINTF_ENOMEM
1401 dnl 15 = gl_SNPRINTF_PRESENCE
1402 dnl 16 = gl_SNPRINTF_TRUNCATION_C99
1403 dnl 17 = gl_SNPRINTF_RETVAL_C99
1404 dnl 18 = gl_SNPRINTF_DIRECTIVE_N
1405 dnl 19 = gl_SNPRINTF_SIZE1
1406 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
1408 dnl 1 = checking whether printf supports size specifiers as in C99...
1409 dnl 2 = checking whether printf supports 'long double' arguments...
1410 dnl 3 = checking whether printf supports infinite 'double' arguments...
1411 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1412 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1413 dnl 6 = checking whether printf supports the 'F' directive...
1414 dnl 7 = checking whether printf supports the 'n' directive...
1415 dnl 8 = checking whether printf supports the 'ls' directive...
1416 dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
1417 dnl 10 = checking whether printf supports the grouping flag...
1418 dnl 11 = checking whether printf supports the left-adjust flag correctly...
1419 dnl 12 = checking whether printf supports the zero flag correctly...
1420 dnl 13 = checking whether printf supports large precisions...
1421 dnl 14 = checking whether printf survives out-of-memory conditions...
1422 dnl 15 = checking for snprintf...
1423 dnl 16 = checking whether snprintf truncates the result as in C99...
1424 dnl 17 = checking whether snprintf returns a byte count as in C99...
1425 dnl 18 = checking whether snprintf fully supports the 'n' directive...
1426 dnl 19 = checking whether snprintf respects a size of 1...
1427 dnl 20 = checking whether vsnprintf respects a zero size as in C99...
1429 dnl . = yes, # = no.
1431 dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1432 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . .
1433 dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . .
1434 dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . .
1435 dnl MacOS X 10.5.8 . . . # # . . . . . . # . . . . . . . .
1436 dnl MacOS X 10.3.9 . . . . # . . . . . . # . # . . . . . .
1437 dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . .
1438 dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . .
1439 dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . .
1440 dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . .
1441 dnl Solaris 10 . . # # # . . # . . . # . . . . . . . .
1442 dnl Solaris 2.6 ... 9 # . # # # # . # . . . # . . . . . . . .
1443 dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # #
1444 dnl AIX 5.2, 7.1 . . # # # . . . . . . # . . . . . . . .
1445 dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . . . . .
1446 dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . .
1447 dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . #
1448 dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? #
1449 dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . .
1450 dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . #
1451 dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # #
1452 dnl NetBSD 5.0 . . . # # . . . . . . # . # . . . . . .
1453 dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ?
1454 dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . .
1455 dnl Haiku . . . # # # . # . . . . . ? . . . . . .
1456 dnl BeOS # # . # # # . ? # . ? . # ? . . . . . .
1457 dnl mingw # # # # # # . . # # . # # ? . # # # . .