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