Merge commit '9b0975f1dc41ddd10d81fb5b0965b9e9a54ef37a'
[bpt/guile.git] / m4 / printf.m4
1 # printf.m4 serial 48
2 dnl Copyright (C) 2003, 2007-2012 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.
6
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.
10
11 AC_DEFUN([gl_PRINTF_SIZES_C99],
12 [
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],
19 [
20 AC_RUN_IFELSE(
21 [AC_LANG_SOURCE([[
22 #include <stddef.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include <sys/types.h>
26 #if HAVE_STDINT_H_WITH_UINTMAX
27 # include <stdint.h>
28 #endif
29 #if HAVE_INTTYPES_H_WITH_UINTMAX
30 # include <inttypes.h>
31 #endif
32 static char buf[100];
33 int main ()
34 {
35 int result = 0;
36 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
37 buf[0] = '\0';
38 if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
39 || strcmp (buf, "12345671 33") != 0)
40 result |= 1;
41 #endif
42 buf[0] = '\0';
43 if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
44 || strcmp (buf, "12345672 33") != 0)
45 result |= 2;
46 buf[0] = '\0';
47 if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
48 || strcmp (buf, "12345673 33") != 0)
49 result |= 4;
50 buf[0] = '\0';
51 if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
52 || strcmp (buf, "1.5 33") != 0)
53 result |= 8;
54 return result;
55 }]])],
56 [gl_cv_func_printf_sizes_c99=yes],
57 [gl_cv_func_printf_sizes_c99=no],
58 [
59 changequote(,)dnl
60 case "$host_os" in
61 # Guess yes on glibc systems.
62 *-gnu*) gl_cv_func_printf_sizes_c99="guessing yes";;
63 # Guess yes on FreeBSD >= 5.
64 freebsd[1-4]*) gl_cv_func_printf_sizes_c99="guessing no";;
65 freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
66 # Guess yes on MacOS X >= 10.3.
67 darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";;
68 darwin*) gl_cv_func_printf_sizes_c99="guessing yes";;
69 # Guess yes on OpenBSD >= 3.9.
70 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
71 gl_cv_func_printf_sizes_c99="guessing no";;
72 openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
73 # Guess yes on Solaris >= 2.10.
74 solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
75 solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
76 # Guess yes on NetBSD >= 3.
77 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
78 gl_cv_func_printf_sizes_c99="guessing no";;
79 netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
80 # If we don't know, assume the worst.
81 *) gl_cv_func_printf_sizes_c99="guessing no";;
82 esac
83 changequote([,])dnl
84 ])
85 ])
86 ])
87
88 dnl Test whether the *printf family of functions supports 'long double'
89 dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
90 dnl Result is gl_cv_func_printf_long_double.
91
92 AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
93 [
94 AC_REQUIRE([AC_PROG_CC])
95 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
96 AC_CACHE_CHECK([whether printf supports 'long double' arguments],
97 [gl_cv_func_printf_long_double],
98 [
99 AC_RUN_IFELSE(
100 [AC_LANG_SOURCE([[
101 #include <stdio.h>
102 #include <string.h>
103 static char buf[10000];
104 int main ()
105 {
106 int result = 0;
107 buf[0] = '\0';
108 if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
109 || strcmp (buf, "1.750000 33") != 0)
110 result |= 1;
111 buf[0] = '\0';
112 if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
113 || strcmp (buf, "1.750000e+00 33") != 0)
114 result |= 2;
115 buf[0] = '\0';
116 if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
117 || strcmp (buf, "1.75 33") != 0)
118 result |= 4;
119 return result;
120 }]])],
121 [gl_cv_func_printf_long_double=yes],
122 [gl_cv_func_printf_long_double=no],
123 [
124 changequote(,)dnl
125 case "$host_os" in
126 beos*) gl_cv_func_printf_long_double="guessing no";;
127 mingw* | pw*) gl_cv_func_printf_long_double="guessing no";;
128 *) gl_cv_func_printf_long_double="guessing yes";;
129 esac
130 changequote([,])dnl
131 ])
132 ])
133 ])
134
135 dnl Test whether the *printf family of functions supports infinite and NaN
136 dnl 'double' arguments and negative zero arguments in the %f, %e, %g
137 dnl directives. (ISO C99, POSIX:2001)
138 dnl Result is gl_cv_func_printf_infinite.
139
140 AC_DEFUN([gl_PRINTF_INFINITE],
141 [
142 AC_REQUIRE([AC_PROG_CC])
143 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
144 AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
145 [gl_cv_func_printf_infinite],
146 [
147 AC_RUN_IFELSE(
148 [AC_LANG_SOURCE([[
149 #include <stdio.h>
150 #include <string.h>
151 static int
152 strisnan (const char *string, size_t start_index, size_t end_index)
153 {
154 if (start_index < end_index)
155 {
156 if (string[start_index] == '-')
157 start_index++;
158 if (start_index + 3 <= end_index
159 && memcmp (string + start_index, "nan", 3) == 0)
160 {
161 start_index += 3;
162 if (start_index == end_index
163 || (string[start_index] == '(' && string[end_index - 1] == ')'))
164 return 1;
165 }
166 }
167 return 0;
168 }
169 static int
170 have_minus_zero ()
171 {
172 static double plus_zero = 0.0;
173 double minus_zero = - plus_zero;
174 return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
175 }
176 static char buf[10000];
177 static double zero = 0.0;
178 int main ()
179 {
180 int result = 0;
181 if (sprintf (buf, "%f", 1.0 / zero) < 0
182 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
183 result |= 1;
184 if (sprintf (buf, "%f", -1.0 / zero) < 0
185 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
186 result |= 1;
187 if (sprintf (buf, "%f", zero / zero) < 0
188 || !strisnan (buf, 0, strlen (buf)))
189 result |= 2;
190 if (sprintf (buf, "%e", 1.0 / zero) < 0
191 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
192 result |= 4;
193 if (sprintf (buf, "%e", -1.0 / zero) < 0
194 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
195 result |= 4;
196 if (sprintf (buf, "%e", zero / zero) < 0
197 || !strisnan (buf, 0, strlen (buf)))
198 result |= 8;
199 if (sprintf (buf, "%g", 1.0 / zero) < 0
200 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
201 result |= 16;
202 if (sprintf (buf, "%g", -1.0 / zero) < 0
203 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
204 result |= 16;
205 if (sprintf (buf, "%g", zero / zero) < 0
206 || !strisnan (buf, 0, strlen (buf)))
207 result |= 32;
208 /* This test fails on HP-UX 10.20. */
209 if (have_minus_zero ())
210 if (sprintf (buf, "%g", - zero) < 0
211 || strcmp (buf, "-0") != 0)
212 result |= 64;
213 return result;
214 }]])],
215 [gl_cv_func_printf_infinite=yes],
216 [gl_cv_func_printf_infinite=no],
217 [
218 changequote(,)dnl
219 case "$host_os" in
220 # Guess yes on glibc systems.
221 *-gnu*) gl_cv_func_printf_infinite="guessing yes";;
222 # Guess yes on FreeBSD >= 6.
223 freebsd[1-5]*) gl_cv_func_printf_infinite="guessing no";;
224 freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
225 # Guess yes on MacOS X >= 10.3.
226 darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";;
227 darwin*) gl_cv_func_printf_infinite="guessing yes";;
228 # Guess yes on HP-UX >= 11.
229 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
230 hpux*) gl_cv_func_printf_infinite="guessing yes";;
231 # Guess yes on NetBSD >= 3.
232 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
233 gl_cv_func_printf_infinite="guessing no";;
234 netbsd*) gl_cv_func_printf_infinite="guessing yes";;
235 # Guess yes on BeOS.
236 beos*) gl_cv_func_printf_infinite="guessing yes";;
237 # If we don't know, assume the worst.
238 *) gl_cv_func_printf_infinite="guessing no";;
239 esac
240 changequote([,])dnl
241 ])
242 ])
243 ])
244
245 dnl Test whether the *printf family of functions supports infinite and NaN
246 dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
247 dnl Result is gl_cv_func_printf_infinite_long_double.
248
249 AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
250 [
251 AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
252 AC_REQUIRE([AC_PROG_CC])
253 AC_REQUIRE([gl_BIGENDIAN])
254 AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
255 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
256 dnl The user can set or unset the variable gl_printf_safe to indicate
257 dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
258 if test -n "$gl_printf_safe"; then
259 AC_DEFINE([CHECK_PRINTF_SAFE], [1],
260 [Define if you wish *printf() functions that have a safe handling of
261 non-IEEE-754 'long double' values.])
262 fi
263 case "$gl_cv_func_printf_long_double" in
264 *yes)
265 AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
266 [gl_cv_func_printf_infinite_long_double],
267 [
268 AC_RUN_IFELSE(
269 [AC_LANG_SOURCE([[
270 ]GL_NOCRASH[
271 #include <float.h>
272 #include <stdio.h>
273 #include <string.h>
274 static int
275 strisnan (const char *string, size_t start_index, size_t end_index)
276 {
277 if (start_index < end_index)
278 {
279 if (string[start_index] == '-')
280 start_index++;
281 if (start_index + 3 <= end_index
282 && memcmp (string + start_index, "nan", 3) == 0)
283 {
284 start_index += 3;
285 if (start_index == end_index
286 || (string[start_index] == '(' && string[end_index - 1] == ')'))
287 return 1;
288 }
289 }
290 return 0;
291 }
292 static char buf[10000];
293 static long double zeroL = 0.0L;
294 int main ()
295 {
296 int result = 0;
297 nocrash_init();
298 if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
299 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
300 result |= 1;
301 if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
302 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
303 result |= 1;
304 if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
305 || !strisnan (buf, 0, strlen (buf)))
306 result |= 1;
307 if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
308 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
309 result |= 1;
310 if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
311 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
312 result |= 1;
313 if (sprintf (buf, "%Le", zeroL / zeroL) < 0
314 || !strisnan (buf, 0, strlen (buf)))
315 result |= 1;
316 if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
317 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
318 result |= 1;
319 if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
320 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
321 result |= 1;
322 if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
323 || !strisnan (buf, 0, strlen (buf)))
324 result |= 1;
325 #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_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
326 /* Representation of an 80-bit 'long double' as an initializer for a sequence
327 of 'unsigned int' words. */
328 # ifdef WORDS_BIGENDIAN
329 # define LDBL80_WORDS(exponent,manthi,mantlo) \
330 { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
331 ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \
332 (unsigned int) (mantlo) << 16 \
333 }
334 # else
335 # define LDBL80_WORDS(exponent,manthi,mantlo) \
336 { mantlo, manthi, exponent }
337 # endif
338 { /* Quiet NaN. */
339 static union { unsigned int word[4]; long double value; } x =
340 { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
341 if (sprintf (buf, "%Lf", x.value) < 0
342 || !strisnan (buf, 0, strlen (buf)))
343 result |= 2;
344 if (sprintf (buf, "%Le", x.value) < 0
345 || !strisnan (buf, 0, strlen (buf)))
346 result |= 2;
347 if (sprintf (buf, "%Lg", x.value) < 0
348 || !strisnan (buf, 0, strlen (buf)))
349 result |= 2;
350 }
351 {
352 /* Signalling NaN. */
353 static union { unsigned int word[4]; long double value; } x =
354 { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
355 if (sprintf (buf, "%Lf", x.value) < 0
356 || !strisnan (buf, 0, strlen (buf)))
357 result |= 2;
358 if (sprintf (buf, "%Le", x.value) < 0
359 || !strisnan (buf, 0, strlen (buf)))
360 result |= 2;
361 if (sprintf (buf, "%Lg", x.value) < 0
362 || !strisnan (buf, 0, strlen (buf)))
363 result |= 2;
364 }
365 { /* Pseudo-NaN. */
366 static union { unsigned int word[4]; long double value; } x =
367 { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
368 if (sprintf (buf, "%Lf", x.value) < 0
369 || !strisnan (buf, 0, strlen (buf)))
370 result |= 4;
371 if (sprintf (buf, "%Le", x.value) < 0
372 || !strisnan (buf, 0, strlen (buf)))
373 result |= 4;
374 if (sprintf (buf, "%Lg", x.value) < 0
375 || !strisnan (buf, 0, strlen (buf)))
376 result |= 4;
377 }
378 { /* Pseudo-Infinity. */
379 static union { unsigned int word[4]; long double value; } x =
380 { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
381 if (sprintf (buf, "%Lf", x.value) < 0
382 || !strisnan (buf, 0, strlen (buf)))
383 result |= 8;
384 if (sprintf (buf, "%Le", x.value) < 0
385 || !strisnan (buf, 0, strlen (buf)))
386 result |= 8;
387 if (sprintf (buf, "%Lg", x.value) < 0
388 || !strisnan (buf, 0, strlen (buf)))
389 result |= 8;
390 }
391 { /* Pseudo-Zero. */
392 static union { unsigned int word[4]; long double value; } x =
393 { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
394 if (sprintf (buf, "%Lf", x.value) < 0
395 || !strisnan (buf, 0, strlen (buf)))
396 result |= 16;
397 if (sprintf (buf, "%Le", x.value) < 0
398 || !strisnan (buf, 0, strlen (buf)))
399 result |= 16;
400 if (sprintf (buf, "%Lg", x.value) < 0
401 || !strisnan (buf, 0, strlen (buf)))
402 result |= 16;
403 }
404 { /* Unnormalized number. */
405 static union { unsigned int word[4]; long double value; } x =
406 { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
407 if (sprintf (buf, "%Lf", x.value) < 0
408 || !strisnan (buf, 0, strlen (buf)))
409 result |= 32;
410 if (sprintf (buf, "%Le", x.value) < 0
411 || !strisnan (buf, 0, strlen (buf)))
412 result |= 32;
413 if (sprintf (buf, "%Lg", x.value) < 0
414 || !strisnan (buf, 0, strlen (buf)))
415 result |= 32;
416 }
417 { /* Pseudo-Denormal. */
418 static union { unsigned int word[4]; long double value; } x =
419 { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
420 if (sprintf (buf, "%Lf", x.value) < 0
421 || !strisnan (buf, 0, strlen (buf)))
422 result |= 64;
423 if (sprintf (buf, "%Le", x.value) < 0
424 || !strisnan (buf, 0, strlen (buf)))
425 result |= 64;
426 if (sprintf (buf, "%Lg", x.value) < 0
427 || !strisnan (buf, 0, strlen (buf)))
428 result |= 64;
429 }
430 #endif
431 return result;
432 }]])],
433 [gl_cv_func_printf_infinite_long_double=yes],
434 [gl_cv_func_printf_infinite_long_double=no],
435 [
436 changequote(,)dnl
437 case "$host_cpu" in
438 # Guess no on ia64, x86_64, i386.
439 ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
440 *)
441 case "$host_os" in
442 # Guess yes on glibc systems.
443 *-gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";;
444 # Guess yes on FreeBSD >= 6.
445 freebsd[1-5]*) gl_cv_func_printf_infinite_long_double="guessing no";;
446 freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
447 # Guess yes on HP-UX >= 11.
448 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
449 hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";;
450 # If we don't know, assume the worst.
451 *) gl_cv_func_printf_infinite_long_double="guessing no";;
452 esac
453 ;;
454 esac
455 changequote([,])dnl
456 ])
457 ])
458 ;;
459 *)
460 gl_cv_func_printf_infinite_long_double="irrelevant"
461 ;;
462 esac
463 ])
464
465 dnl Test whether the *printf family of functions supports the 'a' and 'A'
466 dnl conversion specifier for hexadecimal output of floating-point numbers.
467 dnl (ISO C99, POSIX:2001)
468 dnl Result is gl_cv_func_printf_directive_a.
469
470 AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
471 [
472 AC_REQUIRE([AC_PROG_CC])
473 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
474 AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
475 [gl_cv_func_printf_directive_a],
476 [
477 AC_RUN_IFELSE(
478 [AC_LANG_SOURCE([[
479 #include <stdio.h>
480 #include <string.h>
481 static char buf[100];
482 static double zero = 0.0;
483 int main ()
484 {
485 int result = 0;
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))
491 result |= 1;
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))
497 result |= 2;
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))
504 result |= 4;
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 / zero, 33, 44, 55) < 0
508 || buf[0] == '0')
509 result |= 8;
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))
516 result |= 16;
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))
524 result |= 32;
525 return result;
526 }]])],
527 [gl_cv_func_printf_directive_a=yes],
528 [gl_cv_func_printf_directive_a=no],
529 [
530 case "$host_os" in
531 # Guess yes on glibc >= 2.5 systems.
532 *-gnu*)
533 AC_EGREP_CPP([BZ2908], [
534 #include <features.h>
535 #ifdef __GNU_LIBRARY__
536 #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
537 BZ2908
538 #endif
539 #endif
540 ],
541 [gl_cv_func_printf_directive_a="guessing yes"],
542 [gl_cv_func_printf_directive_a="guessing no"])
543 ;;
544 # If we don't know, assume the worst.
545 *) gl_cv_func_printf_directive_a="guessing no";;
546 esac
547 ])
548 ])
549 ])
550
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.
554
555 AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
556 [
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],
561 [
562 AC_RUN_IFELSE(
563 [AC_LANG_SOURCE([[
564 #include <stdio.h>
565 #include <string.h>
566 static char buf[100];
567 static double zero = 0.0;
568 int main ()
569 {
570 int result = 0;
571 if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
572 || strcmp (buf, "1234567.000000 33") != 0)
573 result |= 1;
574 if (sprintf (buf, "%F", 1.0 / zero) < 0
575 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
576 result |= 2;
577 /* This catches a Cygwin 1.5.x bug. */
578 if (sprintf (buf, "%.F", 1234.0) < 0
579 || strcmp (buf, "1234") != 0)
580 result |= 4;
581 return result;
582 }]])],
583 [gl_cv_func_printf_directive_f=yes],
584 [gl_cv_func_printf_directive_f=no],
585 [
586 changequote(,)dnl
587 case "$host_os" in
588 # Guess yes on glibc systems.
589 *-gnu*) gl_cv_func_printf_directive_f="guessing yes";;
590 # Guess yes on FreeBSD >= 6.
591 freebsd[1-5]*) gl_cv_func_printf_directive_f="guessing no";;
592 freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
593 # Guess yes on MacOS X >= 10.3.
594 darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";;
595 darwin*) gl_cv_func_printf_directive_f="guessing yes";;
596 # Guess yes on Solaris >= 2.10.
597 solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
598 solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
599 # If we don't know, assume the worst.
600 *) gl_cv_func_printf_directive_f="guessing no";;
601 esac
602 changequote([,])dnl
603 ])
604 ])
605 ])
606
607 dnl Test whether the *printf family of functions supports the %n format
608 dnl directive. (ISO C99, POSIX:2001)
609 dnl Result is gl_cv_func_printf_directive_n.
610
611 AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
612 [
613 AC_REQUIRE([AC_PROG_CC])
614 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
615 AC_CACHE_CHECK([whether printf supports the 'n' directive],
616 [gl_cv_func_printf_directive_n],
617 [
618 AC_RUN_IFELSE(
619 [AC_LANG_SOURCE([[
620 #include <stdio.h>
621 #include <stdlib.h>
622 #include <string.h>
623 #ifdef _MSC_VER
624 /* See page about "Parameter Validation" on msdn.microsoft.com. */
625 static void cdecl
626 invalid_parameter_handler (const wchar_t *expression,
627 const wchar_t *function,
628 const wchar_t *file, unsigned int line,
629 uintptr_t dummy)
630 {
631 exit (1);
632 }
633 #endif
634 static char fmtstring[10];
635 static char buf[100];
636 int main ()
637 {
638 int count = -1;
639 #ifdef _MSC_VER
640 _set_invalid_parameter_handler (invalid_parameter_handler);
641 #endif
642 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
643 support %n in format strings in read-only memory but not in writable
644 memory. */
645 strcpy (fmtstring, "%d %n");
646 if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
647 || strcmp (buf, "123 ") != 0
648 || count != 4)
649 return 1;
650 return 0;
651 }]])],
652 [gl_cv_func_printf_directive_n=yes],
653 [gl_cv_func_printf_directive_n=no],
654 [
655 changequote(,)dnl
656 case "$host_os" in
657 mingw*) gl_cv_func_printf_directive_n="guessing no";;
658 *) gl_cv_func_printf_directive_n="guessing yes";;
659 esac
660 changequote([,])dnl
661 ])
662 ])
663 ])
664
665 dnl Test whether the *printf family of functions supports the %ls format
666 dnl directive and in particular, when a precision is specified, whether
667 dnl the functions stop converting the wide string argument when the number
668 dnl of bytes that have been produced by this conversion equals or exceeds
669 dnl the precision.
670 dnl Result is gl_cv_func_printf_directive_ls.
671
672 AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
673 [
674 AC_REQUIRE([AC_PROG_CC])
675 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
676 AC_CACHE_CHECK([whether printf supports the 'ls' directive],
677 [gl_cv_func_printf_directive_ls],
678 [
679 AC_RUN_IFELSE(
680 [AC_LANG_SOURCE([[
681 /* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
682 <wchar.h>.
683 BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
684 included before <wchar.h>. */
685 #include <stddef.h>
686 #include <stdio.h>
687 #include <time.h>
688 #include <wchar.h>
689 #include <string.h>
690 int main ()
691 {
692 int result = 0;
693 char buf[100];
694 /* Test whether %ls works at all.
695 This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
696 Cygwin 1.5. */
697 {
698 static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
699 buf[0] = '\0';
700 if (sprintf (buf, "%ls", wstring) < 0
701 || strcmp (buf, "abc") != 0)
702 result |= 1;
703 }
704 /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
705 assertion failure inside libc), but not on OpenBSD 4.0. */
706 {
707 static const wchar_t wstring[] = { 'a', 0 };
708 buf[0] = '\0';
709 if (sprintf (buf, "%ls", wstring) < 0
710 || strcmp (buf, "a") != 0)
711 result |= 2;
712 }
713 /* Test whether precisions in %ls are supported as specified in ISO C 99
714 section 7.19.6.1:
715 "If a precision is specified, no more than that many bytes are written
716 (including shift sequences, if any), and the array shall contain a
717 null wide character if, to equal the multibyte character sequence
718 length given by the precision, the function would need to access a
719 wide character one past the end of the array."
720 This test fails on Solaris 10. */
721 {
722 static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
723 buf[0] = '\0';
724 if (sprintf (buf, "%.2ls", wstring) < 0
725 || strcmp (buf, "ab") != 0)
726 result |= 8;
727 }
728 return result;
729 }]])],
730 [gl_cv_func_printf_directive_ls=yes],
731 [gl_cv_func_printf_directive_ls=no],
732 [
733 changequote(,)dnl
734 case "$host_os" in
735 openbsd*) gl_cv_func_printf_directive_ls="guessing no";;
736 irix*) gl_cv_func_printf_directive_ls="guessing no";;
737 solaris*) gl_cv_func_printf_directive_ls="guessing no";;
738 cygwin*) gl_cv_func_printf_directive_ls="guessing no";;
739 beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";;
740 *) gl_cv_func_printf_directive_ls="guessing yes";;
741 esac
742 changequote([,])dnl
743 ])
744 ])
745 ])
746
747 dnl Test whether the *printf family of functions supports POSIX/XSI format
748 dnl strings with positions. (POSIX:2001)
749 dnl Result is gl_cv_func_printf_positions.
750
751 AC_DEFUN([gl_PRINTF_POSITIONS],
752 [
753 AC_REQUIRE([AC_PROG_CC])
754 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
755 AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
756 [gl_cv_func_printf_positions],
757 [
758 AC_RUN_IFELSE(
759 [AC_LANG_SOURCE([[
760 #include <stdio.h>
761 #include <string.h>
762 /* The string "%2$d %1$d", with dollar characters protected from the shell's
763 dollar expansion (possibly an autoconf bug). */
764 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
765 static char buf[100];
766 int main ()
767 {
768 sprintf (buf, format, 33, 55);
769 return (strcmp (buf, "55 33") != 0);
770 }]])],
771 [gl_cv_func_printf_positions=yes],
772 [gl_cv_func_printf_positions=no],
773 [
774 changequote(,)dnl
775 case "$host_os" in
776 netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
777 gl_cv_func_printf_positions="guessing no";;
778 beos*) gl_cv_func_printf_positions="guessing no";;
779 mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
780 *) gl_cv_func_printf_positions="guessing yes";;
781 esac
782 changequote([,])dnl
783 ])
784 ])
785 ])
786
787 dnl Test whether the *printf family of functions supports POSIX/XSI format
788 dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
789 dnl Result is gl_cv_func_printf_flag_grouping.
790
791 AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
792 [
793 AC_REQUIRE([AC_PROG_CC])
794 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
795 AC_CACHE_CHECK([whether printf supports the grouping flag],
796 [gl_cv_func_printf_flag_grouping],
797 [
798 AC_RUN_IFELSE(
799 [AC_LANG_SOURCE([[
800 #include <stdio.h>
801 #include <string.h>
802 static char buf[100];
803 int main ()
804 {
805 if (sprintf (buf, "%'d %d", 1234567, 99) < 0
806 || buf[strlen (buf) - 1] != '9')
807 return 1;
808 return 0;
809 }]])],
810 [gl_cv_func_printf_flag_grouping=yes],
811 [gl_cv_func_printf_flag_grouping=no],
812 [
813 changequote(,)dnl
814 case "$host_os" in
815 cygwin*) gl_cv_func_printf_flag_grouping="guessing no";;
816 netbsd*) gl_cv_func_printf_flag_grouping="guessing no";;
817 mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
818 *) gl_cv_func_printf_flag_grouping="guessing yes";;
819 esac
820 changequote([,])dnl
821 ])
822 ])
823 ])
824
825 dnl Test whether the *printf family of functions supports the - flag correctly.
826 dnl (ISO C99.) See
827 dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html>
828 dnl Result is gl_cv_func_printf_flag_leftadjust.
829
830 AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
831 [
832 AC_REQUIRE([AC_PROG_CC])
833 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
834 AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
835 [gl_cv_func_printf_flag_leftadjust],
836 [
837 AC_RUN_IFELSE(
838 [AC_LANG_SOURCE([[
839 #include <stdio.h>
840 #include <string.h>
841 static char buf[100];
842 int main ()
843 {
844 /* Check that a '-' flag is not annihilated by a negative width. */
845 if (sprintf (buf, "a%-*sc", -3, "b") < 0
846 || strcmp (buf, "ab c") != 0)
847 return 1;
848 return 0;
849 }]])],
850 [gl_cv_func_printf_flag_leftadjust=yes],
851 [gl_cv_func_printf_flag_leftadjust=no],
852 [
853 changequote(,)dnl
854 case "$host_os" in
855 # Guess yes on HP-UX 11.
856 hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
857 # Guess no on HP-UX 10 and older.
858 hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";;
859 # Guess yes otherwise.
860 *) gl_cv_func_printf_flag_leftadjust="guessing yes";;
861 esac
862 changequote([,])dnl
863 ])
864 ])
865 ])
866
867 dnl Test whether the *printf family of functions supports padding of non-finite
868 dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
869 dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
870 dnl Result is gl_cv_func_printf_flag_zero.
871
872 AC_DEFUN([gl_PRINTF_FLAG_ZERO],
873 [
874 AC_REQUIRE([AC_PROG_CC])
875 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
876 AC_CACHE_CHECK([whether printf supports the zero flag correctly],
877 [gl_cv_func_printf_flag_zero],
878 [
879 AC_RUN_IFELSE(
880 [AC_LANG_SOURCE([[
881 #include <stdio.h>
882 #include <string.h>
883 static char buf[100];
884 static double zero = 0.0;
885 int main ()
886 {
887 if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
888 || (strcmp (buf, " inf") != 0
889 && strcmp (buf, " infinity") != 0))
890 return 1;
891 return 0;
892 }]])],
893 [gl_cv_func_printf_flag_zero=yes],
894 [gl_cv_func_printf_flag_zero=no],
895 [
896 changequote(,)dnl
897 case "$host_os" in
898 # Guess yes on glibc systems.
899 *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
900 # Guess yes on BeOS.
901 beos*) gl_cv_func_printf_flag_zero="guessing yes";;
902 # If we don't know, assume the worst.
903 *) gl_cv_func_printf_flag_zero="guessing no";;
904 esac
905 changequote([,])dnl
906 ])
907 ])
908 ])
909
910 dnl Test whether the *printf family of functions supports large precisions.
911 dnl On mingw, precisions larger than 512 are treated like 512, in integer,
912 dnl floating-point or pointer output. On Solaris 10/x86, precisions larger
913 dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC,
914 dnl precisions larger than 510 in floating-point output yield wrong results.
915 dnl On AIX 7.1, precisions larger than 998 in floating-point output yield
916 dnl wrong results. On BeOS, precisions larger than 1044 crash the program.
917 dnl Result is gl_cv_func_printf_precision.
918
919 AC_DEFUN([gl_PRINTF_PRECISION],
920 [
921 AC_REQUIRE([AC_PROG_CC])
922 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
923 AC_CACHE_CHECK([whether printf supports large precisions],
924 [gl_cv_func_printf_precision],
925 [
926 AC_RUN_IFELSE(
927 [AC_LANG_SOURCE([[
928 #include <stdio.h>
929 #include <string.h>
930 static char buf[5000];
931 int main ()
932 {
933 int result = 0;
934 #ifdef __BEOS__
935 /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
936 return 1;
937 #endif
938 if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
939 result |= 1;
940 if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
941 result |= 2;
942 if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
943 || buf[0] != '1')
944 result |= 4;
945 if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
946 || buf[0] != '1')
947 result |= 4;
948 return result;
949 }]])],
950 [gl_cv_func_printf_precision=yes],
951 [gl_cv_func_printf_precision=no],
952 [
953 changequote(,)dnl
954 case "$host_os" in
955 # Guess no only on Solaris, native Windows, and BeOS systems.
956 solaris*) gl_cv_func_printf_precision="guessing no" ;;
957 mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
958 beos*) gl_cv_func_printf_precision="guessing no" ;;
959 *) gl_cv_func_printf_precision="guessing yes" ;;
960 esac
961 changequote([,])dnl
962 ])
963 ])
964 ])
965
966 dnl Test whether the *printf family of functions recovers gracefully in case
967 dnl of an out-of-memory condition, or whether it crashes the entire program.
968 dnl Result is gl_cv_func_printf_enomem.
969
970 AC_DEFUN([gl_PRINTF_ENOMEM],
971 [
972 AC_REQUIRE([AC_PROG_CC])
973 AC_REQUIRE([gl_MULTIARCH])
974 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
975 AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
976 [gl_cv_func_printf_enomem],
977 [
978 gl_cv_func_printf_enomem="guessing no"
979 if test "$cross_compiling" = no; then
980 if test $APPLE_UNIVERSAL_BUILD = 0; then
981 AC_LANG_CONFTEST([AC_LANG_SOURCE([
982 ]GL_NOCRASH[
983 changequote(,)dnl
984 #include <stdio.h>
985 #include <sys/types.h>
986 #include <sys/time.h>
987 #include <sys/resource.h>
988 #include <errno.h>
989 int main()
990 {
991 struct rlimit limit;
992 int ret;
993 nocrash_init ();
994 /* Some printf implementations allocate temporary space with malloc. */
995 /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
996 #ifdef RLIMIT_DATA
997 if (getrlimit (RLIMIT_DATA, &limit) < 0)
998 return 77;
999 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
1000 limit.rlim_max = 5000000;
1001 limit.rlim_cur = limit.rlim_max;
1002 if (setrlimit (RLIMIT_DATA, &limit) < 0)
1003 return 77;
1004 #endif
1005 /* On Linux systems, malloc() is limited by RLIMIT_AS. */
1006 #ifdef RLIMIT_AS
1007 if (getrlimit (RLIMIT_AS, &limit) < 0)
1008 return 77;
1009 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
1010 limit.rlim_max = 5000000;
1011 limit.rlim_cur = limit.rlim_max;
1012 if (setrlimit (RLIMIT_AS, &limit) < 0)
1013 return 77;
1014 #endif
1015 /* Some printf implementations allocate temporary space on the stack. */
1016 #ifdef RLIMIT_STACK
1017 if (getrlimit (RLIMIT_STACK, &limit) < 0)
1018 return 77;
1019 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
1020 limit.rlim_max = 5000000;
1021 limit.rlim_cur = limit.rlim_max;
1022 if (setrlimit (RLIMIT_STACK, &limit) < 0)
1023 return 77;
1024 #endif
1025 ret = printf ("%.5000000f", 1.0);
1026 return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
1027 }
1028 changequote([,])dnl
1029 ])])
1030 if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
1031 (./conftest
1032 result=$?
1033 if test $result != 0 && test $result != 77; then result=1; fi
1034 exit $result
1035 ) >/dev/null 2>/dev/null
1036 case $? in
1037 0) gl_cv_func_printf_enomem="yes" ;;
1038 77) gl_cv_func_printf_enomem="guessing no" ;;
1039 *) gl_cv_func_printf_enomem="no" ;;
1040 esac
1041 else
1042 gl_cv_func_printf_enomem="guessing no"
1043 fi
1044 rm -fr conftest*
1045 else
1046 dnl A universal build on Apple MacOS X platforms.
1047 dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
1048 dnl But we need a configuration result that is valid in both modes.
1049 gl_cv_func_printf_enomem="guessing no"
1050 fi
1051 fi
1052 if test "$gl_cv_func_printf_enomem" = "guessing no"; then
1053 changequote(,)dnl
1054 case "$host_os" in
1055 # Guess yes on glibc systems.
1056 *-gnu*) gl_cv_func_printf_enomem="guessing yes";;
1057 # Guess yes on Solaris.
1058 solaris*) gl_cv_func_printf_enomem="guessing yes";;
1059 # Guess yes on AIX.
1060 aix*) gl_cv_func_printf_enomem="guessing yes";;
1061 # Guess yes on HP-UX/hppa.
1062 hpux*) case "$host_cpu" in
1063 hppa*) gl_cv_func_printf_enomem="guessing yes";;
1064 *) gl_cv_func_printf_enomem="guessing no";;
1065 esac
1066 ;;
1067 # Guess yes on IRIX.
1068 irix*) gl_cv_func_printf_enomem="guessing yes";;
1069 # Guess yes on OSF/1.
1070 osf*) gl_cv_func_printf_enomem="guessing yes";;
1071 # Guess yes on BeOS.
1072 beos*) gl_cv_func_printf_enomem="guessing yes";;
1073 # Guess yes on Haiku.
1074 haiku*) gl_cv_func_printf_enomem="guessing yes";;
1075 # If we don't know, assume the worst.
1076 *) gl_cv_func_printf_enomem="guessing no";;
1077 esac
1078 changequote([,])dnl
1079 fi
1080 ])
1081 ])
1082
1083 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
1084 dnl Result is ac_cv_func_snprintf.
1085
1086 AC_DEFUN([gl_SNPRINTF_PRESENCE],
1087 [
1088 AC_CHECK_FUNCS_ONCE([snprintf])
1089 ])
1090
1091 dnl Test whether the string produced by the snprintf function is always NUL
1092 dnl terminated. (ISO C99, POSIX:2001)
1093 dnl Result is gl_cv_func_snprintf_truncation_c99.
1094
1095 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
1096 [
1097 AC_REQUIRE([AC_PROG_CC])
1098 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1099 AC_REQUIRE([gl_SNPRINTF_PRESENCE])
1100 AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
1101 [gl_cv_func_snprintf_truncation_c99],
1102 [
1103 AC_RUN_IFELSE(
1104 [AC_LANG_SOURCE([[
1105 #include <stdio.h>
1106 #include <string.h>
1107 #if HAVE_SNPRINTF
1108 # define my_snprintf snprintf
1109 #else
1110 # include <stdarg.h>
1111 static int my_snprintf (char *buf, int size, const char *format, ...)
1112 {
1113 va_list args;
1114 int ret;
1115 va_start (args, format);
1116 ret = vsnprintf (buf, size, format, args);
1117 va_end (args);
1118 return ret;
1119 }
1120 #endif
1121 static char buf[100];
1122 int main ()
1123 {
1124 strcpy (buf, "ABCDEF");
1125 my_snprintf (buf, 3, "%d %d", 4567, 89);
1126 if (memcmp (buf, "45\0DEF", 6) != 0)
1127 return 1;
1128 return 0;
1129 }]])],
1130 [gl_cv_func_snprintf_truncation_c99=yes],
1131 [gl_cv_func_snprintf_truncation_c99=no],
1132 [
1133 changequote(,)dnl
1134 case "$host_os" in
1135 # Guess yes on glibc systems.
1136 *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1137 # Guess yes on FreeBSD >= 5.
1138 freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1139 freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1140 # Guess yes on MacOS X >= 10.3.
1141 darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1142 darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1143 # Guess yes on OpenBSD >= 3.9.
1144 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1145 gl_cv_func_snprintf_truncation_c99="guessing no";;
1146 openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1147 # Guess yes on Solaris >= 2.6.
1148 solaris2.[0-5] | solaris2.[0-5].*)
1149 gl_cv_func_snprintf_truncation_c99="guessing no";;
1150 solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1151 # Guess yes on AIX >= 4.
1152 aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1153 aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1154 # Guess yes on HP-UX >= 11.
1155 hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1156 hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1157 # Guess yes on IRIX >= 6.5.
1158 irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1159 # Guess yes on OSF/1 >= 5.
1160 osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
1161 osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1162 # Guess yes on NetBSD >= 3.
1163 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1164 gl_cv_func_snprintf_truncation_c99="guessing no";;
1165 netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1166 # Guess yes on BeOS.
1167 beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
1168 # If we don't know, assume the worst.
1169 *) gl_cv_func_snprintf_truncation_c99="guessing no";;
1170 esac
1171 changequote([,])dnl
1172 ])
1173 ])
1174 ])
1175
1176 dnl Test whether the return value of the snprintf function is the number
1177 dnl of bytes (excluding the terminating NUL) that would have been produced
1178 dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
1179 dnl For example, this test program fails on IRIX 6.5:
1180 dnl ---------------------------------------------------------------------
1181 dnl #include <stdio.h>
1182 dnl int main()
1183 dnl {
1184 dnl static char buf[8];
1185 dnl int retval = snprintf (buf, 3, "%d", 12345);
1186 dnl return retval >= 0 && retval < 3;
1187 dnl }
1188 dnl ---------------------------------------------------------------------
1189 dnl Result is gl_cv_func_snprintf_retval_c99.
1190
1191 AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99],
1192 [
1193 AC_REQUIRE([AC_PROG_CC])
1194 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1195 AC_REQUIRE([gl_SNPRINTF_PRESENCE])
1196 AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
1197 [gl_cv_func_snprintf_retval_c99],
1198 [
1199 AC_RUN_IFELSE(
1200 [AC_LANG_SOURCE([[
1201 #include <stdio.h>
1202 #include <string.h>
1203 #if HAVE_SNPRINTF
1204 # define my_snprintf snprintf
1205 #else
1206 # include <stdarg.h>
1207 static int my_snprintf (char *buf, int size, const char *format, ...)
1208 {
1209 va_list args;
1210 int ret;
1211 va_start (args, format);
1212 ret = vsnprintf (buf, size, format, args);
1213 va_end (args);
1214 return ret;
1215 }
1216 #endif
1217 static char buf[100];
1218 int main ()
1219 {
1220 strcpy (buf, "ABCDEF");
1221 if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
1222 return 1;
1223 if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
1224 return 2;
1225 if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
1226 return 3;
1227 return 0;
1228 }]])],
1229 [gl_cv_func_snprintf_retval_c99=yes],
1230 [gl_cv_func_snprintf_retval_c99=no],
1231 [
1232 changequote(,)dnl
1233 case "$host_os" in
1234 # Guess yes on glibc systems.
1235 *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1236 # Guess yes on FreeBSD >= 5.
1237 freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1238 freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1239 # Guess yes on MacOS X >= 10.3.
1240 darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
1241 darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1242 # Guess yes on OpenBSD >= 3.9.
1243 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
1244 gl_cv_func_snprintf_retval_c99="guessing no";;
1245 openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1246 # Guess yes on Solaris >= 2.10.
1247 solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
1248 solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
1249 # Guess yes on AIX >= 4.
1250 aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
1251 aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1252 # Guess yes on NetBSD >= 3.
1253 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1254 gl_cv_func_snprintf_retval_c99="guessing no";;
1255 netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1256 # Guess yes on BeOS.
1257 beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
1258 # If we don't know, assume the worst.
1259 *) gl_cv_func_snprintf_retval_c99="guessing no";;
1260 esac
1261 changequote([,])dnl
1262 ])
1263 ])
1264 ])
1265
1266 dnl Test whether the snprintf function supports the %n format directive
1267 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
1268 dnl Result is gl_cv_func_snprintf_directive_n.
1269
1270 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
1271 [
1272 AC_REQUIRE([AC_PROG_CC])
1273 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1274 AC_REQUIRE([gl_SNPRINTF_PRESENCE])
1275 AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
1276 [gl_cv_func_snprintf_directive_n],
1277 [
1278 AC_RUN_IFELSE(
1279 [AC_LANG_SOURCE([[
1280 #include <stdio.h>
1281 #include <string.h>
1282 #if HAVE_SNPRINTF
1283 # define my_snprintf snprintf
1284 #else
1285 # include <stdarg.h>
1286 static int my_snprintf (char *buf, int size, const char *format, ...)
1287 {
1288 va_list args;
1289 int ret;
1290 va_start (args, format);
1291 ret = vsnprintf (buf, size, format, args);
1292 va_end (args);
1293 return ret;
1294 }
1295 #endif
1296 static char fmtstring[10];
1297 static char buf[100];
1298 int main ()
1299 {
1300 int count = -1;
1301 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
1302 support %n in format strings in read-only memory but not in writable
1303 memory. */
1304 strcpy (fmtstring, "%d %n");
1305 my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
1306 if (count != 6)
1307 return 1;
1308 return 0;
1309 }]])],
1310 [gl_cv_func_snprintf_directive_n=yes],
1311 [gl_cv_func_snprintf_directive_n=no],
1312 [
1313 changequote(,)dnl
1314 case "$host_os" in
1315 # Guess yes on glibc systems.
1316 *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";;
1317 # Guess yes on FreeBSD >= 5.
1318 freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1319 freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1320 # Guess yes on MacOS X >= 10.3.
1321 darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
1322 darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
1323 # Guess yes on Solaris >= 2.6.
1324 solaris2.[0-5] | solaris2.[0-5].*)
1325 gl_cv_func_snprintf_directive_n="guessing no";;
1326 solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
1327 # Guess yes on AIX >= 4.
1328 aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
1329 aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
1330 # Guess yes on IRIX >= 6.5.
1331 irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
1332 # Guess yes on OSF/1 >= 5.
1333 osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
1334 osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
1335 # Guess yes on NetBSD >= 3.
1336 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1337 gl_cv_func_snprintf_directive_n="guessing no";;
1338 netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
1339 # Guess yes on BeOS.
1340 beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
1341 # If we don't know, assume the worst.
1342 *) gl_cv_func_snprintf_directive_n="guessing no";;
1343 esac
1344 changequote([,])dnl
1345 ])
1346 ])
1347 ])
1348
1349 dnl Test whether the snprintf function, when passed a size = 1, writes any
1350 dnl output without bounds in this case, behaving like sprintf. This is the
1351 dnl case on Linux libc5.
1352 dnl Result is gl_cv_func_snprintf_size1.
1353
1354 AC_DEFUN([gl_SNPRINTF_SIZE1],
1355 [
1356 AC_REQUIRE([AC_PROG_CC])
1357 AC_REQUIRE([gl_SNPRINTF_PRESENCE])
1358 AC_CACHE_CHECK([whether snprintf respects a size of 1],
1359 [gl_cv_func_snprintf_size1],
1360 [
1361 AC_RUN_IFELSE(
1362 [AC_LANG_SOURCE([[
1363 #include <stdio.h>
1364 #if HAVE_SNPRINTF
1365 # define my_snprintf snprintf
1366 #else
1367 # include <stdarg.h>
1368 static int my_snprintf (char *buf, int size, const char *format, ...)
1369 {
1370 va_list args;
1371 int ret;
1372 va_start (args, format);
1373 ret = vsnprintf (buf, size, format, args);
1374 va_end (args);
1375 return ret;
1376 }
1377 #endif
1378 int main()
1379 {
1380 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1381 my_snprintf (buf, 1, "%d", 12345);
1382 return buf[1] != 'E';
1383 }]])],
1384 [gl_cv_func_snprintf_size1=yes],
1385 [gl_cv_func_snprintf_size1=no],
1386 [gl_cv_func_snprintf_size1="guessing yes"])
1387 ])
1388 ])
1389
1390 dnl Test whether the vsnprintf function, when passed a zero size, produces no
1391 dnl output. (ISO C99, POSIX:2001)
1392 dnl For example, snprintf nevertheless writes a NUL byte in this case
1393 dnl on OSF/1 5.1:
1394 dnl ---------------------------------------------------------------------
1395 dnl #include <stdio.h>
1396 dnl int main()
1397 dnl {
1398 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1399 dnl snprintf (buf, 0, "%d", 12345);
1400 dnl return buf[0] != 'D';
1401 dnl }
1402 dnl ---------------------------------------------------------------------
1403 dnl And vsnprintf writes any output without bounds in this case, behaving like
1404 dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
1405 dnl ---------------------------------------------------------------------
1406 dnl #include <stdarg.h>
1407 dnl #include <stdio.h>
1408 dnl static int my_snprintf (char *buf, int size, const char *format, ...)
1409 dnl {
1410 dnl va_list args;
1411 dnl int ret;
1412 dnl va_start (args, format);
1413 dnl ret = vsnprintf (buf, size, format, args);
1414 dnl va_end (args);
1415 dnl return ret;
1416 dnl }
1417 dnl int main()
1418 dnl {
1419 dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1420 dnl my_snprintf (buf, 0, "%d", 12345);
1421 dnl return buf[0] != 'D';
1422 dnl }
1423 dnl ---------------------------------------------------------------------
1424 dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
1425
1426 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
1427 [
1428 AC_REQUIRE([AC_PROG_CC])
1429 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1430 AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
1431 [gl_cv_func_vsnprintf_zerosize_c99],
1432 [
1433 AC_RUN_IFELSE(
1434 [AC_LANG_SOURCE([[
1435 #include <stdarg.h>
1436 #include <stdio.h>
1437 static int my_snprintf (char *buf, int size, const char *format, ...)
1438 {
1439 va_list args;
1440 int ret;
1441 va_start (args, format);
1442 ret = vsnprintf (buf, size, format, args);
1443 va_end (args);
1444 return ret;
1445 }
1446 int main()
1447 {
1448 static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
1449 my_snprintf (buf, 0, "%d", 12345);
1450 return buf[0] != 'D';
1451 }]])],
1452 [gl_cv_func_vsnprintf_zerosize_c99=yes],
1453 [gl_cv_func_vsnprintf_zerosize_c99=no],
1454 [
1455 changequote(,)dnl
1456 case "$host_os" in
1457 # Guess yes on glibc systems.
1458 *-gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1459 # Guess yes on FreeBSD >= 5.
1460 freebsd[1-4]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1461 freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1462 # Guess yes on MacOS X >= 10.3.
1463 darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1464 darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1465 # Guess yes on Cygwin.
1466 cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1467 # Guess yes on Solaris >= 2.6.
1468 solaris2.[0-5] | solaris2.[0-5].*)
1469 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1470 solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1471 # Guess yes on AIX >= 4.
1472 aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1473 aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1474 # Guess yes on IRIX >= 6.5.
1475 irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1476 # Guess yes on NetBSD >= 3.
1477 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
1478 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1479 netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1480 # Guess yes on BeOS.
1481 beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1482 # Guess yes on mingw.
1483 mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
1484 # If we don't know, assume the worst.
1485 *) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
1486 esac
1487 changequote([,])dnl
1488 ])
1489 ])
1490 ])
1491
1492 dnl The results of these tests on various platforms are:
1493 dnl
1494 dnl 1 = gl_PRINTF_SIZES_C99
1495 dnl 2 = gl_PRINTF_LONG_DOUBLE
1496 dnl 3 = gl_PRINTF_INFINITE
1497 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
1498 dnl 5 = gl_PRINTF_DIRECTIVE_A
1499 dnl 6 = gl_PRINTF_DIRECTIVE_F
1500 dnl 7 = gl_PRINTF_DIRECTIVE_N
1501 dnl 8 = gl_PRINTF_DIRECTIVE_LS
1502 dnl 9 = gl_PRINTF_POSITIONS
1503 dnl 10 = gl_PRINTF_FLAG_GROUPING
1504 dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
1505 dnl 12 = gl_PRINTF_FLAG_ZERO
1506 dnl 13 = gl_PRINTF_PRECISION
1507 dnl 14 = gl_PRINTF_ENOMEM
1508 dnl 15 = gl_SNPRINTF_PRESENCE
1509 dnl 16 = gl_SNPRINTF_TRUNCATION_C99
1510 dnl 17 = gl_SNPRINTF_RETVAL_C99
1511 dnl 18 = gl_SNPRINTF_DIRECTIVE_N
1512 dnl 19 = gl_SNPRINTF_SIZE1
1513 dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
1514 dnl
1515 dnl 1 = checking whether printf supports size specifiers as in C99...
1516 dnl 2 = checking whether printf supports 'long double' arguments...
1517 dnl 3 = checking whether printf supports infinite 'double' arguments...
1518 dnl 4 = checking whether printf supports infinite 'long double' arguments...
1519 dnl 5 = checking whether printf supports the 'a' and 'A' directives...
1520 dnl 6 = checking whether printf supports the 'F' directive...
1521 dnl 7 = checking whether printf supports the 'n' directive...
1522 dnl 8 = checking whether printf supports the 'ls' directive...
1523 dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
1524 dnl 10 = checking whether printf supports the grouping flag...
1525 dnl 11 = checking whether printf supports the left-adjust flag correctly...
1526 dnl 12 = checking whether printf supports the zero flag correctly...
1527 dnl 13 = checking whether printf supports large precisions...
1528 dnl 14 = checking whether printf survives out-of-memory conditions...
1529 dnl 15 = checking for snprintf...
1530 dnl 16 = checking whether snprintf truncates the result as in C99...
1531 dnl 17 = checking whether snprintf returns a byte count as in C99...
1532 dnl 18 = checking whether snprintf fully supports the 'n' directive...
1533 dnl 19 = checking whether snprintf respects a size of 1...
1534 dnl 20 = checking whether vsnprintf respects a zero size as in C99...
1535 dnl
1536 dnl . = yes, # = no.
1537 dnl
1538 dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1539 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . .
1540 dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . .
1541 dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . .
1542 dnl MacOS X 10.5.8 . . . # # . . . . . . # . . . . . . . .
1543 dnl MacOS X 10.3.9 . . . . # . . . . . . # . # . . . . . .
1544 dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . .
1545 dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . .
1546 dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . .
1547 dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . .
1548 dnl Solaris 11 2011-11 . . # # # . . # . . . # . . . . . . . .
1549 dnl Solaris 10 . . # # # . . # . . . # # . . . . . . .
1550 dnl Solaris 2.6 ... 9 # . # # # # . # . . . # # . . . # . . .
1551 dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # #
1552 dnl AIX 7.1 . . # # # . . . . . . # # . . . . . . .
1553 dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . .
1554 dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . # . . .
1555 dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . .
1556 dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . #
1557 dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? #
1558 dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . .
1559 dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . #
1560 dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # #
1561 dnl NetBSD 5.0 . . . # # . . . . . . # . # . . . . . .
1562 dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ?
1563 dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . .
1564 dnl Haiku . . . # # # . # . . . . . ? . . ? . . .
1565 dnl BeOS # # . # # # . ? # . ? . # ? . . ? . . .
1566 dnl old mingw / msvcrt # # # # # # . . # # . # # ? . # # # . .
1567 dnl MSVC 9 # # # # # # # . # # . # # ? # # # # . .
1568 dnl mingw 2009-2011 . # . # . . . . # # . . . ? . . . . . .
1569 dnl mingw-w64 2011 # # # # # # . . # # . # # ? . # # # . .