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 # # # # # # . . # # . # # ? . # # # . .