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],
24 #include <sys/types.h>
25 #if HAVE_STDINT_H_WITH_UINTMAX
28 #if HAVE_INTTYPES_H_WITH_UINTMAX
29 # include <inttypes.h>
34 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
36 if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
37 || strcmp (buf, "12345671 33") != 0)
41 if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
42 || strcmp (buf, "12345672 33") != 0)
45 if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
46 || strcmp (buf, "12345673 33") != 0)
49 if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
50 || strcmp (buf, "1.5 33") != 0)
53 }], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no],
57 # Guess yes on glibc systems.
58 *-gnu*) gl_cv_func_printf_sizes_c99="guessing yes";;
59 # Guess yes on FreeBSD >= 5.
60 freebsd[1-4]*) gl_cv_func_printf_sizes_c99="guessing no";;
61 freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
62 # Guess yes on MacOS X >= 10.3.
63 darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";;
64 darwin*) gl_cv_func_printf_sizes_c99="guessing yes";;
65 # Guess yes on OpenBSD >= 3.9.
66 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
67 gl_cv_func_printf_sizes_c99="guessing no";;
68 openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
69 # Guess yes on Solaris >= 2.10.
70 solaris2.[0-9]*) gl_cv_func_printf_sizes_c99="guessing no";;
71 solaris*) gl_cv_func_printf_sizes_c99="guessing yes";;
72 # Guess yes on NetBSD >= 3.
73 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
74 gl_cv_func_printf_sizes_c99="guessing no";;
75 netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
76 # If we don't know, assume the worst.
77 *) gl_cv_func_printf_sizes_c99="guessing no";;
84 dnl Test whether the *printf family of functions supports 'long double'
85 dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
86 dnl Result is gl_cv_func_printf_long_double.
88 AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
90 AC_REQUIRE([AC_PROG_CC])
91 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
92 AC_CACHE_CHECK([whether printf supports 'long double' arguments],
93 [gl_cv_func_printf_long_double],
98 static char buf[10000];
102 if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
103 || strcmp (buf, "1.750000 33") != 0)
106 if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
107 || strcmp (buf, "1.750000e+00 33") != 0)
110 if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
111 || strcmp (buf, "1.75 33") != 0)
114 }], [gl_cv_func_printf_long_double=yes], [gl_cv_func_printf_long_double=no],
118 beos*) gl_cv_func_printf_long_double="guessing no";;
119 mingw* | pw*) gl_cv_func_printf_long_double="guessing no";;
120 *) gl_cv_func_printf_long_double="guessing yes";;
127 dnl Test whether the *printf family of functions supports infinite and NaN
128 dnl 'double' arguments and negative zero arguments in the %f, %e, %g
129 dnl directives. (ISO C99, POSIX:2001)
130 dnl Result is gl_cv_func_printf_infinite.
132 AC_DEFUN([gl_PRINTF_INFINITE],
134 AC_REQUIRE([AC_PROG_CC])
135 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
136 AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
137 [gl_cv_func_printf_infinite],
143 strisnan (const char *string, size_t start_index, size_t end_index)
145 if (start_index < end_index)
147 if (string[start_index] == '-')
149 if (start_index + 3 <= end_index
150 && memcmp (string + start_index, "nan", 3) == 0)
153 if (start_index == end_index
154 || (string[start_index] == '(' && string[end_index - 1] == ')'))
163 static double plus_zero = 0.0;
164 double minus_zero = - plus_zero;
165 return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
167 static char buf[10000];
168 static double zero = 0.0;
171 if (sprintf (buf, "%f", 1.0 / 0.0) < 0
172 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
174 if (sprintf (buf, "%f", -1.0 / 0.0) < 0
175 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
177 if (sprintf (buf, "%f", zero / zero) < 0
178 || !strisnan (buf, 0, strlen (buf)))
180 if (sprintf (buf, "%e", 1.0 / 0.0) < 0
181 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
183 if (sprintf (buf, "%e", -1.0 / 0.0) < 0
184 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
186 if (sprintf (buf, "%e", zero / zero) < 0
187 || !strisnan (buf, 0, strlen (buf)))
189 if (sprintf (buf, "%g", 1.0 / 0.0) < 0
190 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
192 if (sprintf (buf, "%g", -1.0 / 0.0) < 0
193 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
195 if (sprintf (buf, "%g", zero / zero) < 0
196 || !strisnan (buf, 0, strlen (buf)))
198 /* This test fails on HP-UX 10.20. */
199 if (have_minus_zero ())
200 if (sprintf (buf, "%g", - zero) < 0
201 || strcmp (buf, "-0") != 0)
204 }], [gl_cv_func_printf_infinite=yes], [gl_cv_func_printf_infinite=no],
208 # Guess yes on glibc systems.
209 *-gnu*) gl_cv_func_printf_infinite="guessing yes";;
210 # Guess yes on FreeBSD >= 6.
211 freebsd[1-5]*) gl_cv_func_printf_infinite="guessing no";;
212 freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
213 # Guess yes on MacOS X >= 10.3.
214 darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";;
215 darwin*) gl_cv_func_printf_infinite="guessing yes";;
216 # Guess yes on HP-UX >= 11.
217 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
218 hpux*) gl_cv_func_printf_infinite="guessing yes";;
219 # Guess yes on NetBSD >= 3.
220 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
221 gl_cv_func_printf_infinite="guessing no";;
222 netbsd*) gl_cv_func_printf_infinite="guessing yes";;
224 beos*) gl_cv_func_printf_infinite="guessing yes";;
225 # If we don't know, assume the worst.
226 *) gl_cv_func_printf_infinite="guessing no";;
233 dnl Test whether the *printf family of functions supports infinite and NaN
234 dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
235 dnl Result is gl_cv_func_printf_infinite_long_double.
237 AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
239 AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
240 AC_REQUIRE([AC_PROG_CC])
241 AC_REQUIRE([gl_BIGENDIAN])
242 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
243 dnl The user can set or unset the variable gl_printf_safe to indicate
244 dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
245 if test -n "$gl_printf_safe"; then
246 AC_DEFINE([CHECK_PRINTF_SAFE], [1],
247 [Define if you wish *printf() functions that have a safe handling of
248 non-IEEE-754 'long double' values.])
250 case "$gl_cv_func_printf_long_double" in
252 AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
253 [gl_cv_func_printf_infinite_long_double],
261 strisnan (const char *string, size_t start_index, size_t end_index)
263 if (start_index < end_index)
265 if (string[start_index] == '-')
267 if (start_index + 3 <= end_index
268 && memcmp (string + start_index, "nan", 3) == 0)
271 if (start_index == end_index
272 || (string[start_index] == '(' && string[end_index - 1] == ')'))
278 static char buf[10000];
279 static long double zeroL = 0.0L;
283 if (sprintf (buf, "%Lf", 1.0L / 0.0L) < 0
284 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
286 if (sprintf (buf, "%Lf", -1.0L / 0.0L) < 0
287 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
289 if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
290 || !strisnan (buf, 0, strlen (buf)))
292 if (sprintf (buf, "%Le", 1.0L / 0.0L) < 0
293 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
295 if (sprintf (buf, "%Le", -1.0L / 0.0L) < 0
296 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
298 if (sprintf (buf, "%Le", zeroL / zeroL) < 0
299 || !strisnan (buf, 0, strlen (buf)))
301 if (sprintf (buf, "%Lg", 1.0L / 0.0L) < 0
302 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
304 if (sprintf (buf, "%Lg", -1.0L / 0.0L) < 0
305 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
307 if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
308 || !strisnan (buf, 0, strlen (buf)))
310 #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_))
311 /* Representation of an 80-bit 'long double' as an initializer for a sequence
312 of 'unsigned int' words. */
313 # ifdef WORDS_BIGENDIAN
314 # define LDBL80_WORDS(exponent,manthi,mantlo) \
315 { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
316 ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
317 (unsigned int) (mantlo) << 16 \
320 # define LDBL80_WORDS(exponent,manthi,mantlo) \
321 { mantlo, manthi, exponent }
324 static union { unsigned int word[4]; long double value; } x =
325 { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
326 if (sprintf (buf, "%Lf", x.value) < 0
327 || !strisnan (buf, 0, strlen (buf)))
329 if (sprintf (buf, "%Le", x.value) < 0
330 || !strisnan (buf, 0, strlen (buf)))
332 if (sprintf (buf, "%Lg", x.value) < 0
333 || !strisnan (buf, 0, strlen (buf)))
337 /* Signalling NaN. */
338 static union { unsigned int word[4]; long double value; } x =
339 { LDBL80_WORDS (0xFFFF, 0x83333333, 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 static union { unsigned int word[4]; long double value; } x =
352 { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
353 if (sprintf (buf, "%Lf", x.value) < 0
354 || !strisnan (buf, 0, strlen (buf)))
356 if (sprintf (buf, "%Le", x.value) < 0
357 || !strisnan (buf, 0, strlen (buf)))
359 if (sprintf (buf, "%Lg", x.value) < 0
360 || !strisnan (buf, 0, strlen (buf)))
363 { /* Pseudo-Infinity. */
364 static union { unsigned int word[4]; long double value; } x =
365 { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
366 if (sprintf (buf, "%Lf", x.value) < 0
367 || !strisnan (buf, 0, strlen (buf)))
369 if (sprintf (buf, "%Le", x.value) < 0
370 || !strisnan (buf, 0, strlen (buf)))
372 if (sprintf (buf, "%Lg", x.value) < 0
373 || !strisnan (buf, 0, strlen (buf)))
377 static union { unsigned int word[4]; long double value; } x =
378 { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
379 if (sprintf (buf, "%Lf", x.value) < 0
380 || !strisnan (buf, 0, strlen (buf)))
382 if (sprintf (buf, "%Le", x.value) < 0
383 || !strisnan (buf, 0, strlen (buf)))
385 if (sprintf (buf, "%Lg", x.value) < 0
386 || !strisnan (buf, 0, strlen (buf)))
389 { /* Unnormalized number. */
390 static union { unsigned int word[4]; long double value; } x =
391 { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
392 if (sprintf (buf, "%Lf", x.value) < 0
393 || !strisnan (buf, 0, strlen (buf)))
395 if (sprintf (buf, "%Le", x.value) < 0
396 || !strisnan (buf, 0, strlen (buf)))
398 if (sprintf (buf, "%Lg", x.value) < 0
399 || !strisnan (buf, 0, strlen (buf)))
402 { /* Pseudo-Denormal. */
403 static union { unsigned int word[4]; long double value; } x =
404 { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
405 if (sprintf (buf, "%Lf", x.value) < 0
406 || !strisnan (buf, 0, strlen (buf)))
408 if (sprintf (buf, "%Le", x.value) < 0
409 || !strisnan (buf, 0, strlen (buf)))
411 if (sprintf (buf, "%Lg", x.value) < 0
412 || !strisnan (buf, 0, strlen (buf)))
418 [gl_cv_func_printf_infinite_long_double=yes],
419 [gl_cv_func_printf_infinite_long_double=no],
423 # Guess no on ia64, x86_64, i386.
424 ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
427 # Guess yes on glibc systems.
428 *-gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";;
429 # Guess yes on FreeBSD >= 6.
430 freebsd[1-5]*) gl_cv_func_printf_infinite_long_double="guessing no";;
431 freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
432 # Guess yes on MacOS X >= 10.3.
433 darwin[1-6].*) gl_cv_func_printf_infinite_long_double="guessing no";;
434 darwin*) gl_cv_func_printf_infinite_long_double="guessing yes";;
435 # Guess yes on HP-UX >= 11.
436 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
437 hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";;
438 # Guess yes on NetBSD >= 3.
439 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
440 gl_cv_func_printf_infinite_long_double="guessing no";;
441 netbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
442 # If we don't know, assume the worst.
443 *) gl_cv_func_printf_infinite_long_double="guessing no";;
452 gl_cv_func_printf_infinite_long_double="irrelevant"
457 dnl Test whether the *printf family of functions supports the 'a' and 'A'
458 dnl conversion specifier for hexadecimal output of floating-point numbers.
459 dnl (ISO C99, POSIX:2001)
460 dnl Result is gl_cv_func_printf_directive_a.
462 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
464 AC_REQUIRE([AC_PROG_CC])
465 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
466 AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
467 [gl_cv_func_printf_directive_a],
472 static char buf[100];
475 if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
476 || (strcmp (buf, "0x1.922p+1 33") != 0
477 && strcmp (buf, "0x3.244p+0 33") != 0
478 && strcmp (buf, "0x6.488p-1 33") != 0
479 && strcmp (buf, "0xc.91p-2 33") != 0))
481 if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
482 || (strcmp (buf, "-0X1.922P+1 33") != 0
483 && strcmp (buf, "-0X3.244P+0 33") != 0
484 && strcmp (buf, "-0X6.488P-1 33") != 0
485 && strcmp (buf, "-0XC.91P-2 33") != 0))
487 /* This catches a FreeBSD 6.1 bug: it doesn't round. */
488 if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
489 || (strcmp (buf, "0x1.83p+0 33") != 0
490 && strcmp (buf, "0x3.05p-1 33") != 0
491 && strcmp (buf, "0x6.0ap-2 33") != 0
492 && strcmp (buf, "0xc.14p-3 33") != 0))
494 /* This catches a FreeBSD 6.1 bug. See
495 <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
496 if (sprintf (buf, "%010a %d", 1.0 / 0.0, 33, 44, 55) < 0
499 /* This catches a MacOS X 10.3.9 (Darwin 7.9) bug. */
500 if (sprintf (buf, "%.1a", 1.999) < 0
501 || (strcmp (buf, "0x1.0p+1") != 0
502 && strcmp (buf, "0x2.0p+0") != 0
503 && strcmp (buf, "0x4.0p-1") != 0
504 && strcmp (buf, "0x8.0p-2") != 0))
506 /* This catches the same MacOS X 10.3.9 (Darwin 7.9) bug and also a
507 glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
508 if (sprintf (buf, "%.1La", 1.999L) < 0
509 || (strcmp (buf, "0x1.0p+1") != 0
510 && strcmp (buf, "0x2.0p+0") != 0
511 && strcmp (buf, "0x4.0p-1") != 0
512 && strcmp (buf, "0x8.0p-2") != 0))
515 }], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no],
518 # Guess yes on glibc >= 2.5 systems.
520 AC_EGREP_CPP([BZ2908], [
521 #include <features.h>
522 #ifdef __GNU_LIBRARY__
523 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)
528 [gl_cv_func_printf_directive_a="guessing yes"],
529 [gl_cv_func_printf_directive_a="guessing no"])
531 # If we don't know, assume the worst.
532 *) gl_cv_func_printf_directive_a="guessing no";;
538 dnl Test whether the *printf family of functions supports the %F format
539 dnl directive. (ISO C99, POSIX:2001)
540 dnl Result is gl_cv_func_printf_directive_f.
542 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
544 AC_REQUIRE([AC_PROG_CC])
545 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
546 AC_CACHE_CHECK([whether printf supports the 'F' directive],
547 [gl_cv_func_printf_directive_f],
552 static char buf[100];
555 if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
556 || strcmp (buf, "1234567.000000 33") != 0)
558 if (sprintf (buf, "%F", 1.0 / 0.0) < 0
559 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
561 /* This catches a Cygwin 1.5.x bug. */
562 if (sprintf (buf, "%.F", 1234.0) < 0
563 || strcmp (buf, "1234") != 0)
566 }], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no],
570 # Guess yes on glibc systems.
571 *-gnu*) gl_cv_func_printf_directive_f="guessing yes";;
572 # Guess yes on FreeBSD >= 6.
573 freebsd[1-5]*) gl_cv_func_printf_directive_f="guessing no";;
574 freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
575 # Guess yes on MacOS X >= 10.3.
576 darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";;
577 darwin*) gl_cv_func_printf_directive_f="guessing yes";;
578 # Guess yes on Solaris >= 2.10.
579 solaris2.[0-9]*) gl_cv_func_printf_directive_f="guessing no";;
580 solaris*) gl_cv_func_printf_directive_f="guessing yes";;
581 # If we don't know, assume the worst.
582 *) gl_cv_func_printf_directive_f="guessing no";;
589 dnl Test whether the *printf family of functions supports the %n format
590 dnl directive. (ISO C99, POSIX:2001)
591 dnl Result is gl_cv_func_printf_directive_n.
593 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
595 AC_REQUIRE([AC_PROG_CC])
596 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
597 AC_CACHE_CHECK([whether printf supports the 'n' directive],
598 [gl_cv_func_printf_directive_n],
603 static char fmtstring[10];
604 static char buf[100];
608 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
609 support %n in format strings in read-only memory but not in writable
611 strcpy (fmtstring, "%d %n");
612 if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
613 || strcmp (buf, "123 ") != 0
617 }], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no],
621 *) gl_cv_func_printf_directive_n="guessing yes";;
628 dnl Test whether the *printf family of functions supports the %ls format
629 dnl directive and in particular, when a precision is specified, whether
630 dnl the functions stop converting the wide string argument when the number
631 dnl of bytes that have been produced by this conversion equals or exceeds
633 dnl Result is gl_cv_func_printf_directive_ls.
635 AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
637 AC_REQUIRE([AC_PROG_CC])
638 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
639 AC_CACHE_CHECK([whether printf supports the 'ls' directive],
640 [gl_cv_func_printf_directive_ls],
643 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
645 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
646 included before <wchar.h>. */
655 /* Test whether %ls works at all.
656 This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
659 static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
661 if (sprintf (buf, "%ls", wstring) < 0
662 || strcmp (buf, "abc") != 0)
665 /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
666 assertion failure inside libc), but not on OpenBSD 4.0. */
668 static const wchar_t wstring[] = { 'a', 0 };
670 if (sprintf (buf, "%ls", wstring) < 0
671 || strcmp (buf, "a") != 0)
674 /* Test whether precisions in %ls are supported as specified in ISO C 99
676 "If a precision is specified, no more than that many bytes are written
677 (including shift sequences, if any), and the array shall contain a
678 null wide character if, to equal the multibyte character sequence
679 length given by the precision, the function would need to access a
680 wide character one past the end of the array."
681 This test fails on Solaris 10. */
683 static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
685 if (sprintf (buf, "%.2ls", wstring) < 0
686 || strcmp (buf, "ab") != 0)
690 }], [gl_cv_func_printf_directive_ls=yes], [gl_cv_func_printf_directive_ls=no],
694 openbsd*) gl_cv_func_printf_directive_ls="guessing no";;
695 irix*) gl_cv_func_printf_directive_ls="guessing no";;
696 solaris*) gl_cv_func_printf_directive_ls="guessing no";;
697 cygwin*) gl_cv_func_printf_directive_ls="guessing no";;
698 beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";;
699 *) gl_cv_func_printf_directive_ls="guessing yes";;
706 dnl Test whether the *printf family of functions supports POSIX/XSI format
707 dnl strings with positions. (POSIX:2001)
708 dnl Result is gl_cv_func_printf_positions.
710 AC_DEFUN([gl_PRINTF_POSITIONS],
712 AC_REQUIRE([AC_PROG_CC])
713 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
714 AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
715 [gl_cv_func_printf_positions],
720 /* The string "%2$d %1$d", with dollar characters protected from the shell's
721 dollar expansion (possibly an autoconf bug). */
722 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
723 static char buf[100];
726 sprintf (buf, format, 33, 55);
727 return (strcmp (buf, "55 33") != 0);
728 }], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no],
732 netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
733 gl_cv_func_printf_positions="guessing no";;
734 beos*) gl_cv_func_printf_positions="guessing no";;
735 mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
736 *) gl_cv_func_printf_positions="guessing yes";;
743 dnl Test whether the *printf family of functions supports POSIX/XSI format
744 dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
745 dnl Result is gl_cv_func_printf_flag_grouping.
747 AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
749 AC_REQUIRE([AC_PROG_CC])
750 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
751 AC_CACHE_CHECK([whether printf supports the grouping flag],
752 [gl_cv_func_printf_flag_grouping],
757 static char buf[100];
760 if (sprintf (buf, "%'d %d", 1234567, 99) < 0
761 || buf[strlen (buf) - 1] != '9')
764 }], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no],
768 cygwin*) gl_cv_func_printf_flag_grouping="guessing no";;
769 netbsd*) gl_cv_func_printf_flag_grouping="guessing no";;
770 mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
771 *) gl_cv_func_printf_flag_grouping="guessing yes";;
778 dnl Test whether the *printf family of functions supports the - flag correctly.
780 dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html>
781 dnl Result is gl_cv_func_printf_flag_leftadjust.
783 AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
785 AC_REQUIRE([AC_PROG_CC])
786 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
787 AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
788 [gl_cv_func_printf_flag_leftadjust],
793 static char buf[100];
796 /* Check that a '-' flag is not annihilated by a negative width. */
797 if (sprintf (buf, "a%-*sc", -3, "b") < 0
798 || strcmp (buf, "ab c") != 0)
802 [gl_cv_func_printf_flag_leftadjust=yes],
803 [gl_cv_func_printf_flag_leftadjust=no],
807 # Guess yes on HP-UX 11.
808 hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
809 # Guess no on HP-UX 10 and older.
810 hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";;
811 # Guess yes otherwise.
812 *) gl_cv_func_printf_flag_leftadjust="guessing yes";;
819 dnl Test whether the *printf family of functions supports padding of non-finite
820 dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
821 dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
822 dnl Result is gl_cv_func_printf_flag_zero.
824 AC_DEFUN([gl_PRINTF_FLAG_ZERO],
826 AC_REQUIRE([AC_PROG_CC])
827 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
828 AC_CACHE_CHECK([whether printf supports the zero flag correctly],
829 [gl_cv_func_printf_flag_zero],
834 static char buf[100];
837 if (sprintf (buf, "%010f", 1.0 / 0.0, 33, 44, 55) < 0
838 || (strcmp (buf, " inf") != 0
839 && strcmp (buf, " infinity") != 0))
842 }], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no],
846 # Guess yes on glibc systems.
847 *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
849 beos*) gl_cv_func_printf_flag_zero="guessing yes";;
850 # If we don't know, assume the worst.
851 *) gl_cv_func_printf_flag_zero="guessing no";;
858 dnl Test whether the *printf family of functions supports large precisions.
859 dnl On mingw, precisions larger than 512 are treated like 512, in integer,
860 dnl floating-point or pointer output. On BeOS, precisions larger than 1044
861 dnl crash the program.
862 dnl Result is gl_cv_func_printf_precision.
864 AC_DEFUN([gl_PRINTF_PRECISION],
866 AC_REQUIRE([AC_PROG_CC])
867 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
868 AC_CACHE_CHECK([whether printf supports large precisions],
869 [gl_cv_func_printf_precision],
874 static char buf[5000];
878 /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
881 if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
884 }], [gl_cv_func_printf_precision=yes], [gl_cv_func_printf_precision=no],
888 # Guess no only on native Win32 and BeOS systems.
889 mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
890 beos*) gl_cv_func_printf_precision="guessing no" ;;
891 *) gl_cv_func_printf_precision="guessing yes" ;;
898 dnl Test whether the *printf family of functions recovers gracefully in case
899 dnl of an out-of-memory condition, or whether it crashes the entire program.
900 dnl Result is gl_cv_func_printf_enomem.
902 AC_DEFUN([gl_PRINTF_ENOMEM],
904 AC_REQUIRE([AC_PROG_CC])
905 AC_REQUIRE([gl_MULTIARCH])
906 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
907 AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
908 [gl_cv_func_printf_enomem],
910 gl_cv_func_printf_enomem="guessing no"
911 if test "$cross_compiling" = no; then
912 if test $APPLE_UNIVERSAL_BUILD = 0; then
913 AC_LANG_CONFTEST([AC_LANG_SOURCE([
917 #include <sys/types.h>
918 #include <sys/time.h>
919 #include <sys/resource.h>
926 /* Some printf implementations allocate temporary space with malloc. */
927 /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
929 if (getrlimit (RLIMIT_DATA, &limit) < 0)
931 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
932 limit.rlim_max = 5000000;
933 limit.rlim_cur = limit.rlim_max;
934 if (setrlimit (RLIMIT_DATA, &limit) < 0)
937 /* On Linux systems, malloc() is limited by RLIMIT_AS. */
939 if (getrlimit (RLIMIT_AS, &limit) < 0)
941 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
942 limit.rlim_max = 5000000;
943 limit.rlim_cur = limit.rlim_max;
944 if (setrlimit (RLIMIT_AS, &limit) < 0)
947 /* Some printf implementations allocate temporary space on the stack. */
949 if (getrlimit (RLIMIT_STACK, &limit) < 0)
951 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
952 limit.rlim_max = 5000000;
953 limit.rlim_cur = limit.rlim_max;
954 if (setrlimit (RLIMIT_STACK, &limit) < 0)
957 ret = printf ("%.5000000f", 1.0);
958 return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
962 if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
965 if test $result != 0 && test $result != 77; then result=1; fi
967 ) >/dev/null 2>/dev/null
969 0) gl_cv_func_printf_enomem="yes" ;;
970 77) gl_cv_func_printf_enomem="guessing no" ;;
971 *) gl_cv_func_printf_enomem="no" ;;
974 gl_cv_func_printf_enomem="guessing no"
978 dnl A universal build on Apple MacOS X platforms.
979 dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
980 dnl But we need a configuration result that is valid in both modes.
981 gl_cv_func_printf_enomem="guessing no"
984 if test "$gl_cv_func_printf_enomem" = "guessing no"; then
987 # Guess yes on glibc systems.
988 *-gnu*) gl_cv_func_printf_enomem="guessing yes";;
989 # Guess yes on Solaris.
990 solaris*) gl_cv_func_printf_enomem="guessing yes";;
992 aix*) gl_cv_func_printf_enomem="guessing yes";;
993 # Guess yes on HP-UX/hppa.
994 hpux*) case "$host_cpu" in
995 hppa*) gl_cv_func_printf_enomem="guessing yes";;
996 *) gl_cv_func_printf_enomem="guessing no";;
1000 irix*) gl_cv_func_printf_enomem="guessing yes";;
1001 # Guess yes on OSF/1.
1002 osf*) gl_cv_func_printf_enomem="guessing yes";;
1003 # Guess yes on BeOS.
1004 beos*) gl_cv_func_printf_enomem="guessing yes";;
1005 # Guess yes on Haiku.
1006 haiku*) gl_cv_func_printf_enomem="guessing yes";;
1007 # If we don't know, assume the worst.
1008 *) gl_cv_func_printf_enomem="guessing no";;
1015 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
1016 dnl Result is ac_cv_func_snprintf.
1018 AC_DEFUN([gl_SNPRINTF_PRESENCE],
1020 AC_CHECK_FUNCS_ONCE([snprintf])
1023 dnl Test whether the string produced by the snprintf function is always NUL
1024 dnl terminated. (ISO C99, POSIX:2001)
1025 dnl Result is gl_cv_func_snprintf_truncation_c99.
1027 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
1029 AC_REQUIRE([AC_PROG_CC])
1030 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1031 AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
1032 [gl_cv_func_snprintf_truncation_c99],
1037 static char buf[100];
1040 strcpy (buf, "ABCDEF");
1041 snprintf (buf, 3, "%d %d", 4567, 89);
1042 if (memcmp (buf, "45\0DEF", 6) != 0)
1045 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no],
1049 # Guess yes on glibc systems.
1050 *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1051 # Guess yes on FreeBSD >= 5.
1052 freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1053 freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1054 # Guess yes on MacOS X >= 10.3.
1055 darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1056 darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1057 # Guess yes on OpenBSD >= 3.9.
1058 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1059 gl_cv_func_snprintf_truncation_c99="guessing no";;
1060 openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1061 # Guess yes on Solaris >= 2.6.
1062 solaris2.[0-5]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1063 solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1064 # Guess yes on AIX >= 4.
1065 aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1066 aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1067 # Guess yes on HP-UX >= 11.
1068 hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1069 hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1070 # Guess yes on IRIX >= 6.5.
1071 irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1072 # Guess yes on OSF/1 >= 5.
1073 osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1074 osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1075 # Guess yes on NetBSD >= 3.
1076 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1077 gl_cv_func_snprintf_truncation_c99="guessing no";;
1078 netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1079 # Guess yes on BeOS.
1080 beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1081 # If we don't know, assume the worst.
1082 *) gl_cv_func_snprintf_truncation_c99="guessing no";;
1089 dnl Test whether the return value of the snprintf function is the number
1090 dnl of bytes (excluding the terminating NUL) that would have been produced
1091 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
1092 dnl For example, this test program fails on IRIX 6.5:
1093 dnl ---------------------------------------------------------------------
1094 dnl #include <stdio.h>
1097 dnl static char buf[8];
1098 dnl int retval = snprintf (buf, 3, "%d", 12345);
1099 dnl return retval >= 0 && retval < 3;
1101 dnl ---------------------------------------------------------------------
1102 dnl Result is gl_cv_func_snprintf_retval_c99.
1104 AC_DEFUN([gl_SNPRINTF_RETVAL_C99],
1106 AC_REQUIRE([AC_PROG_CC])
1107 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1108 AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
1109 [gl_cv_func_snprintf_retval_c99],
1114 static char buf[100];
1117 strcpy (buf, "ABCDEF");
1118 if (snprintf (buf, 3, "%d %d", 4567, 89) != 7)
1121 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no],
1125 # Guess yes on glibc systems.
1126 *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1127 # Guess yes on FreeBSD >= 5.
1128 freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1129 freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1130 # Guess yes on MacOS X >= 10.3.
1131 darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
1132 darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1133 # Guess yes on OpenBSD >= 3.9.
1134 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1135 gl_cv_func_snprintf_retval_c99="guessing no";;
1136 openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1137 # Guess yes on Solaris >= 2.6.
1138 solaris2.[0-5]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1139 solaris*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1140 # Guess yes on AIX >= 4.
1141 aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1142 aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1143 # Guess yes on NetBSD >= 3.
1144 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1145 gl_cv_func_snprintf_retval_c99="guessing no";;
1146 netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1147 # Guess yes on BeOS.
1148 beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1149 # If we don't know, assume the worst.
1150 *) gl_cv_func_snprintf_retval_c99="guessing no";;
1157 dnl Test whether the snprintf function supports the %n format directive
1158 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1159 dnl Result is gl_cv_func_snprintf_directive_n.
1161 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1163 AC_REQUIRE([AC_PROG_CC])
1164 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1165 AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1166 [gl_cv_func_snprintf_directive_n],
1171 static char fmtstring[10];
1172 static char buf[100];
1176 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
1177 support %n in format strings in read-only memory but not in writable
1179 strcpy (fmtstring, "%d %n");
1180 snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1184 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no],
1188 # Guess yes on glibc systems.
1189 *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";;
1190 # Guess yes on FreeBSD >= 5.
1191 freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1192 freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1193 # Guess yes on MacOS X >= 10.3.
1194 darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
1195 darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
1196 # Guess yes on Solaris >= 2.6.
1197 solaris2.[0-5]*) gl_cv_func_snprintf_directive_n="guessing no";;
1198 solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
1199 # Guess yes on AIX >= 4.
1200 aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
1201 aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
1202 # Guess yes on IRIX >= 6.5.
1203 irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
1204 # Guess yes on OSF/1 >= 5.
1205 osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1206 osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
1207 # Guess yes on NetBSD >= 3.
1208 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1209 gl_cv_func_snprintf_directive_n="guessing no";;
1210 netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1211 # Guess yes on BeOS.
1212 beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
1213 # If we don't know, assume the worst.
1214 *) gl_cv_func_snprintf_directive_n="guessing no";;
1221 dnl Test whether the snprintf function, when passed a size = 1, writes any
1222 dnl output without bounds in this case, behaving like sprintf. This is the
1223 dnl case on Linux libc5.
1224 dnl Result is gl_cv_func_snprintf_size1.
1226 AC_DEFUN([gl_SNPRINTF_SIZE1],
1228 AC_REQUIRE([AC_PROG_CC])
1229 AC_CACHE_CHECK([whether snprintf respects a size of 1],
1230 [gl_cv_func_snprintf_size1],
1236 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1237 snprintf (buf, 1, "%d", 12345);
1238 return buf[1] != 'E';
1240 [gl_cv_func_snprintf_size1=yes],
1241 [gl_cv_func_snprintf_size1=no],
1242 [gl_cv_func_snprintf_size1="guessing yes"])
1246 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1247 dnl output. (ISO C99, POSIX:2001)
1248 dnl For example, snprintf nevertheless writes a NUL byte in this case
1250 dnl ---------------------------------------------------------------------
1251 dnl #include <stdio.h>
1254 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1255 dnl snprintf (buf, 0, "%d", 12345);
1256 dnl return buf[0] != 'D';
1258 dnl ---------------------------------------------------------------------
1259 dnl And vsnprintf writes any output without bounds in this case, behaving like
1260 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1261 dnl ---------------------------------------------------------------------
1262 dnl #include <stdarg.h>
1263 dnl #include <stdio.h>
1264 dnl static int my_snprintf (char *buf, int size, const char *format, ...)
1268 dnl va_start (args, format);
1269 dnl ret = vsnprintf (buf, size, format, args);
1275 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1276 dnl my_snprintf (buf, 0, "%d", 12345);
1277 dnl return buf[0] != 'D';
1279 dnl ---------------------------------------------------------------------
1280 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1282 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1284 AC_REQUIRE([AC_PROG_CC])
1285 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1286 AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1287 [gl_cv_func_vsnprintf_zerosize_c99],
1292 static int my_snprintf (char *buf, int size, const char *format, ...)
1296 va_start (args, format);
1297 ret = vsnprintf (buf, size, format, args);
1303 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1304 my_snprintf (buf, 0, "%d", 12345);
1305 return buf[0] != 'D';
1307 [gl_cv_func_vsnprintf_zerosize_c99=yes],
1308 [gl_cv_func_vsnprintf_zerosize_c99=no],
1312 # Guess yes on glibc systems.
1313 *-gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1314 # Guess yes on FreeBSD >= 5.
1315 freebsd[1-4]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1316 freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1317 # Guess yes on MacOS X >= 10.3.
1318 darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1319 darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1320 # Guess yes on Cygwin.
1321 cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1322 # Guess yes on Solaris >= 2.6.
1323 solaris2.[0-5]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1324 solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1325 # Guess yes on AIX >= 4.
1326 aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1327 aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1328 # Guess yes on IRIX >= 6.5.
1329 irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1330 # Guess yes on NetBSD >= 3.
1331 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1332 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1333 netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1334 # Guess yes on BeOS.
1335 beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1336 # Guess yes on mingw.
1337 mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1338 # If we don't know, assume the worst.
1339 *) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1346 dnl The results of these tests on various platforms are:
1348 dnl 1 = gl_PRINTF_SIZES_C99
1349 dnl 2 = gl_PRINTF_LONG_DOUBLE
1350 dnl 3 = gl_PRINTF_INFINITE
1351 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1352 dnl 5 = gl_PRINTF_DIRECTIVE_A
1353 dnl 6 = gl_PRINTF_DIRECTIVE_F
1354 dnl 7 = gl_PRINTF_DIRECTIVE_N
1355 dnl 8 = gl_PRINTF_DIRECTIVE_LS
1356 dnl 9 = gl_PRINTF_POSITIONS
1357 dnl 10 = gl_PRINTF_FLAG_GROUPING
1358 dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
1359 dnl 12 = gl_PRINTF_FLAG_ZERO
1360 dnl 13 = gl_PRINTF_PRECISION
1361 dnl 14 = gl_PRINTF_ENOMEM
1362 dnl 15 = gl_SNPRINTF_PRESENCE
1363 dnl 16 = gl_SNPRINTF_TRUNCATION_C99
1364 dnl 17 = gl_SNPRINTF_RETVAL_C99
1365 dnl 18 = gl_SNPRINTF_DIRECTIVE_N
1366 dnl 19 = gl_SNPRINTF_SIZE1
1367 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
1369 dnl 1 = checking whether printf supports size specifiers as in C99...
1370 dnl 2 = checking whether printf supports 'long double' arguments...
1371 dnl 3 = checking whether printf supports infinite 'double' arguments...
1372 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1373 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1374 dnl 6 = checking whether printf supports the 'F' directive...
1375 dnl 7 = checking whether printf supports the 'n' directive...
1376 dnl 8 = checking whether printf supports the 'ls' directive...
1377 dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
1378 dnl 10 = checking whether printf supports the grouping flag...
1379 dnl 11 = checking whether printf supports the left-adjust flag correctly...
1380 dnl 12 = checking whether printf supports the zero flag correctly...
1381 dnl 13 = checking whether printf supports large precisions...
1382 dnl 14 = checking whether printf survives out-of-memory conditions...
1383 dnl 15 = checking for snprintf...
1384 dnl 16 = checking whether snprintf truncates the result as in C99...
1385 dnl 17 = checking whether snprintf returns a byte count as in C99...
1386 dnl 18 = checking whether snprintf fully supports the 'n' directive...
1387 dnl 19 = checking whether snprintf respects a size of 1...
1388 dnl 20 = checking whether vsnprintf respects a zero size as in C99...
1390 dnl . = yes, # = no.
1392 dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1393 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . .
1394 dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . .
1395 dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . .
1396 dnl MacOS X 10.3.9 . . . . # . . . . . . # . # . . . . . .
1397 dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . .
1398 dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . .
1399 dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . .
1400 dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . .
1401 dnl Solaris 10 . . # # # . . # . . . # . . . . . . . .
1402 dnl Solaris 2.6 ... 9 # . # # # # . # . . . # . . . . . . . .
1403 dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # #
1404 dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . .
1405 dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . . . . .
1406 dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . .
1407 dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . #
1408 dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? #
1409 dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . .
1410 dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . #
1411 dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # #
1412 dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ?
1413 dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . .
1414 dnl Haiku . . . # # # . # . . . . . ? . . . . . .
1415 dnl BeOS # # . # # # . ? # . ? . # ? . . . . . .
1416 dnl mingw # # # # # # . . # # . # # ? . # # # . .