Mercurial > hg-old > index.cgi
comparison m4/printf.m4 @ 272:d5392bb5da3c 2.5
Added generated files
author | lost |
---|---|
date | Sun, 16 Aug 2009 17:16:49 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
271:3b793ba7a6c6 | 272:d5392bb5da3c |
---|---|
1 # printf.m4 serial 25 | |
2 dnl Copyright (C) 2003, 2007-2008 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_TRY_RUN([ | |
21 #include <stddef.h> | |
22 #include <stdio.h> | |
23 #include <string.h> | |
24 #include <sys/types.h> | |
25 #if HAVE_STDINT_H_WITH_UINTMAX | |
26 # include <stdint.h> | |
27 #endif | |
28 #if HAVE_INTTYPES_H_WITH_UINTMAX | |
29 # include <inttypes.h> | |
30 #endif | |
31 static char buf[100]; | |
32 int main () | |
33 { | |
34 #if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX | |
35 buf[0] = '\0'; | |
36 if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0 | |
37 || strcmp (buf, "12345671 33") != 0) | |
38 return 1; | |
39 #endif | |
40 buf[0] = '\0'; | |
41 if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0 | |
42 || strcmp (buf, "12345672 33") != 0) | |
43 return 1; | |
44 buf[0] = '\0'; | |
45 if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0 | |
46 || strcmp (buf, "12345673 33") != 0) | |
47 return 1; | |
48 buf[0] = '\0'; | |
49 if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0 | |
50 || strcmp (buf, "1.5 33") != 0) | |
51 return 1; | |
52 return 0; | |
53 }], [gl_cv_func_printf_sizes_c99=yes], [gl_cv_func_printf_sizes_c99=no], | |
54 [ | |
55 changequote(,)dnl | |
56 case "$host_os" in | |
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";; | |
78 esac | |
79 changequote([,])dnl | |
80 ]) | |
81 ]) | |
82 ]) | |
83 | |
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. | |
87 | |
88 AC_DEFUN([gl_PRINTF_LONG_DOUBLE], | |
89 [ | |
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], | |
94 [ | |
95 AC_TRY_RUN([ | |
96 #include <stdio.h> | |
97 #include <string.h> | |
98 static char buf[10000]; | |
99 int main () | |
100 { | |
101 buf[0] = '\0'; | |
102 if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0 | |
103 || strcmp (buf, "1.750000 33") != 0) | |
104 return 1; | |
105 buf[0] = '\0'; | |
106 if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0 | |
107 || strcmp (buf, "1.750000e+00 33") != 0) | |
108 return 1; | |
109 buf[0] = '\0'; | |
110 if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0 | |
111 || strcmp (buf, "1.75 33") != 0) | |
112 return 1; | |
113 return 0; | |
114 }], [gl_cv_func_printf_long_double=yes], [gl_cv_func_printf_long_double=no], | |
115 [ | |
116 changequote(,)dnl | |
117 case "$host_os" in | |
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";; | |
121 esac | |
122 changequote([,])dnl | |
123 ]) | |
124 ]) | |
125 ]) | |
126 | |
127 dnl Test whether the *printf family of functions supports infinite and NaN | |
128 dnl 'double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001) | |
129 dnl Result is gl_cv_func_printf_infinite. | |
130 | |
131 AC_DEFUN([gl_PRINTF_INFINITE], | |
132 [ | |
133 AC_REQUIRE([AC_PROG_CC]) | |
134 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
135 AC_CACHE_CHECK([whether printf supports infinite 'double' arguments], | |
136 [gl_cv_func_printf_infinite], | |
137 [ | |
138 AC_TRY_RUN([ | |
139 #include <stdio.h> | |
140 #include <string.h> | |
141 static int | |
142 strisnan (const char *string, size_t start_index, size_t end_index) | |
143 { | |
144 if (start_index < end_index) | |
145 { | |
146 if (string[start_index] == '-') | |
147 start_index++; | |
148 if (start_index + 3 <= end_index | |
149 && memcmp (string + start_index, "nan", 3) == 0) | |
150 { | |
151 start_index += 3; | |
152 if (start_index == end_index | |
153 || (string[start_index] == '(' && string[end_index - 1] == ')')) | |
154 return 1; | |
155 } | |
156 } | |
157 return 0; | |
158 } | |
159 static char buf[10000]; | |
160 static double zero = 0.0; | |
161 int main () | |
162 { | |
163 if (sprintf (buf, "%f", 1.0 / 0.0) < 0 | |
164 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) | |
165 return 1; | |
166 if (sprintf (buf, "%f", -1.0 / 0.0) < 0 | |
167 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) | |
168 return 1; | |
169 if (sprintf (buf, "%f", zero / zero) < 0 | |
170 || !strisnan (buf, 0, strlen (buf))) | |
171 return 1; | |
172 if (sprintf (buf, "%e", 1.0 / 0.0) < 0 | |
173 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) | |
174 return 1; | |
175 if (sprintf (buf, "%e", -1.0 / 0.0) < 0 | |
176 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) | |
177 return 1; | |
178 if (sprintf (buf, "%e", zero / zero) < 0 | |
179 || !strisnan (buf, 0, strlen (buf))) | |
180 return 1; | |
181 if (sprintf (buf, "%g", 1.0 / 0.0) < 0 | |
182 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) | |
183 return 1; | |
184 if (sprintf (buf, "%g", -1.0 / 0.0) < 0 | |
185 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) | |
186 return 1; | |
187 if (sprintf (buf, "%g", zero / zero) < 0 | |
188 || !strisnan (buf, 0, strlen (buf))) | |
189 return 1; | |
190 return 0; | |
191 }], [gl_cv_func_printf_infinite=yes], [gl_cv_func_printf_infinite=no], | |
192 [ | |
193 changequote(,)dnl | |
194 case "$host_os" in | |
195 # Guess yes on glibc systems. | |
196 *-gnu*) gl_cv_func_printf_infinite="guessing yes";; | |
197 # Guess yes on FreeBSD >= 6. | |
198 freebsd[1-5]*) gl_cv_func_printf_infinite="guessing no";; | |
199 freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";; | |
200 # Guess yes on MacOS X >= 10.3. | |
201 darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";; | |
202 darwin*) gl_cv_func_printf_infinite="guessing yes";; | |
203 # Guess yes on HP-UX >= 11. | |
204 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";; | |
205 hpux*) gl_cv_func_printf_infinite="guessing yes";; | |
206 # Guess yes on NetBSD >= 3. | |
207 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) | |
208 gl_cv_func_printf_infinite="guessing no";; | |
209 netbsd*) gl_cv_func_printf_infinite="guessing yes";; | |
210 # Guess yes on BeOS. | |
211 beos*) gl_cv_func_printf_infinite="guessing yes";; | |
212 # If we don't know, assume the worst. | |
213 *) gl_cv_func_printf_infinite="guessing no";; | |
214 esac | |
215 changequote([,])dnl | |
216 ]) | |
217 ]) | |
218 ]) | |
219 | |
220 dnl Test whether the *printf family of functions supports infinite and NaN | |
221 dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001) | |
222 dnl Result is gl_cv_func_printf_infinite_long_double. | |
223 | |
224 AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE], | |
225 [ | |
226 AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) | |
227 AC_REQUIRE([AC_PROG_CC]) | |
228 AC_REQUIRE([AC_C_BIGENDIAN]) | |
229 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
230 dnl The user can set or unset the variable gl_printf_safe to indicate | |
231 dnl that he wishes a safe handling of non-IEEE-754 'long double' values. | |
232 if test -n "$gl_printf_safe"; then | |
233 AC_DEFINE([CHECK_PRINTF_SAFE], 1, | |
234 [Define if you wish *printf() functions that have a safe handling of | |
235 non-IEEE-754 'long double' values.]) | |
236 fi | |
237 case "$gl_cv_func_printf_long_double" in | |
238 *yes) | |
239 AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments], | |
240 [gl_cv_func_printf_infinite_long_double], | |
241 [ | |
242 AC_TRY_RUN([ | |
243 ]GL_NOCRASH[ | |
244 #include <float.h> | |
245 #include <stdio.h> | |
246 #include <string.h> | |
247 static int | |
248 strisnan (const char *string, size_t start_index, size_t end_index) | |
249 { | |
250 if (start_index < end_index) | |
251 { | |
252 if (string[start_index] == '-') | |
253 start_index++; | |
254 if (start_index + 3 <= end_index | |
255 && memcmp (string + start_index, "nan", 3) == 0) | |
256 { | |
257 start_index += 3; | |
258 if (start_index == end_index | |
259 || (string[start_index] == '(' && string[end_index - 1] == ')')) | |
260 return 1; | |
261 } | |
262 } | |
263 return 0; | |
264 } | |
265 static char buf[10000]; | |
266 static long double zeroL = 0.0L; | |
267 int main () | |
268 { | |
269 nocrash_init(); | |
270 if (sprintf (buf, "%Lf", 1.0L / 0.0L) < 0 | |
271 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) | |
272 return 1; | |
273 if (sprintf (buf, "%Lf", -1.0L / 0.0L) < 0 | |
274 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) | |
275 return 1; | |
276 if (sprintf (buf, "%Lf", zeroL / zeroL) < 0 | |
277 || !strisnan (buf, 0, strlen (buf))) | |
278 return 1; | |
279 if (sprintf (buf, "%Le", 1.0L / 0.0L) < 0 | |
280 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) | |
281 return 1; | |
282 if (sprintf (buf, "%Le", -1.0L / 0.0L) < 0 | |
283 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) | |
284 return 1; | |
285 if (sprintf (buf, "%Le", zeroL / zeroL) < 0 | |
286 || !strisnan (buf, 0, strlen (buf))) | |
287 return 1; | |
288 if (sprintf (buf, "%Lg", 1.0L / 0.0L) < 0 | |
289 || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0)) | |
290 return 1; | |
291 if (sprintf (buf, "%Lg", -1.0L / 0.0L) < 0 | |
292 || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0)) | |
293 return 1; | |
294 if (sprintf (buf, "%Lg", zeroL / zeroL) < 0 | |
295 || !strisnan (buf, 0, strlen (buf))) | |
296 return 1; | |
297 #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_)) | |
298 /* Representation of an 80-bit 'long double' as an initializer for a sequence | |
299 of 'unsigned int' words. */ | |
300 # ifdef WORDS_BIGENDIAN | |
301 # define LDBL80_WORDS(exponent,manthi,mantlo) \ | |
302 { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \ | |
303 ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16), \ | |
304 (unsigned int) (mantlo) << 16 \ | |
305 } | |
306 # else | |
307 # define LDBL80_WORDS(exponent,manthi,mantlo) \ | |
308 { mantlo, manthi, exponent } | |
309 # endif | |
310 { /* Quiet NaN. */ | |
311 static union { unsigned int word[4]; long double value; } x = | |
312 { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) }; | |
313 if (sprintf (buf, "%Lf", x.value) < 0 | |
314 || !strisnan (buf, 0, strlen (buf))) | |
315 return 1; | |
316 if (sprintf (buf, "%Le", x.value) < 0 | |
317 || !strisnan (buf, 0, strlen (buf))) | |
318 return 1; | |
319 if (sprintf (buf, "%Lg", x.value) < 0 | |
320 || !strisnan (buf, 0, strlen (buf))) | |
321 return 1; | |
322 } | |
323 { | |
324 /* Signalling NaN. */ | |
325 static union { unsigned int word[4]; long double value; } x = | |
326 { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) }; | |
327 if (sprintf (buf, "%Lf", x.value) < 0 | |
328 || !strisnan (buf, 0, strlen (buf))) | |
329 return 1; | |
330 if (sprintf (buf, "%Le", x.value) < 0 | |
331 || !strisnan (buf, 0, strlen (buf))) | |
332 return 1; | |
333 if (sprintf (buf, "%Lg", x.value) < 0 | |
334 || !strisnan (buf, 0, strlen (buf))) | |
335 return 1; | |
336 } | |
337 { /* Pseudo-NaN. */ | |
338 static union { unsigned int word[4]; long double value; } x = | |
339 { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) }; | |
340 if (sprintf (buf, "%Lf", x.value) < 0 | |
341 || !strisnan (buf, 0, strlen (buf))) | |
342 return 1; | |
343 if (sprintf (buf, "%Le", x.value) < 0 | |
344 || !strisnan (buf, 0, strlen (buf))) | |
345 return 1; | |
346 if (sprintf (buf, "%Lg", x.value) < 0 | |
347 || !strisnan (buf, 0, strlen (buf))) | |
348 return 1; | |
349 } | |
350 { /* Pseudo-Infinity. */ | |
351 static union { unsigned int word[4]; long double value; } x = | |
352 { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) }; | |
353 if (sprintf (buf, "%Lf", x.value) < 0 | |
354 || !strisnan (buf, 0, strlen (buf))) | |
355 return 1; | |
356 if (sprintf (buf, "%Le", x.value) < 0 | |
357 || !strisnan (buf, 0, strlen (buf))) | |
358 return 1; | |
359 if (sprintf (buf, "%Lg", x.value) < 0 | |
360 || !strisnan (buf, 0, strlen (buf))) | |
361 return 1; | |
362 } | |
363 { /* Pseudo-Zero. */ | |
364 static union { unsigned int word[4]; long double value; } x = | |
365 { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) }; | |
366 if (sprintf (buf, "%Lf", x.value) < 0 | |
367 || !strisnan (buf, 0, strlen (buf))) | |
368 return 1; | |
369 if (sprintf (buf, "%Le", x.value) < 0 | |
370 || !strisnan (buf, 0, strlen (buf))) | |
371 return 1; | |
372 if (sprintf (buf, "%Lg", x.value) < 0 | |
373 || !strisnan (buf, 0, strlen (buf))) | |
374 return 1; | |
375 } | |
376 { /* Unnormalized number. */ | |
377 static union { unsigned int word[4]; long double value; } x = | |
378 { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) }; | |
379 if (sprintf (buf, "%Lf", x.value) < 0 | |
380 || !strisnan (buf, 0, strlen (buf))) | |
381 return 1; | |
382 if (sprintf (buf, "%Le", x.value) < 0 | |
383 || !strisnan (buf, 0, strlen (buf))) | |
384 return 1; | |
385 if (sprintf (buf, "%Lg", x.value) < 0 | |
386 || !strisnan (buf, 0, strlen (buf))) | |
387 return 1; | |
388 } | |
389 { /* Pseudo-Denormal. */ | |
390 static union { unsigned int word[4]; long double value; } x = | |
391 { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) }; | |
392 if (sprintf (buf, "%Lf", x.value) < 0 | |
393 || !strisnan (buf, 0, strlen (buf))) | |
394 return 1; | |
395 if (sprintf (buf, "%Le", x.value) < 0 | |
396 || !strisnan (buf, 0, strlen (buf))) | |
397 return 1; | |
398 if (sprintf (buf, "%Lg", x.value) < 0 | |
399 || !strisnan (buf, 0, strlen (buf))) | |
400 return 1; | |
401 } | |
402 #endif | |
403 return 0; | |
404 }], | |
405 [gl_cv_func_printf_infinite_long_double=yes], | |
406 [gl_cv_func_printf_infinite_long_double=no], | |
407 [ | |
408 changequote(,)dnl | |
409 case "$host_cpu" in | |
410 # Guess no on ia64, x86_64, i386. | |
411 ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";; | |
412 *) | |
413 case "$host_os" in | |
414 # Guess yes on glibc systems. | |
415 *-gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";; | |
416 # Guess yes on FreeBSD >= 6. | |
417 freebsd[1-5]*) gl_cv_func_printf_infinite_long_double="guessing no";; | |
418 freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; | |
419 # Guess yes on MacOS X >= 10.3. | |
420 darwin[1-6].*) gl_cv_func_printf_infinite_long_double="guessing no";; | |
421 darwin*) gl_cv_func_printf_infinite_long_double="guessing yes";; | |
422 # Guess yes on HP-UX >= 11. | |
423 hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";; | |
424 hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";; | |
425 # Guess yes on NetBSD >= 3. | |
426 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) | |
427 gl_cv_func_printf_infinite_long_double="guessing no";; | |
428 netbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";; | |
429 # If we don't know, assume the worst. | |
430 *) gl_cv_func_printf_infinite_long_double="guessing no";; | |
431 esac | |
432 ;; | |
433 esac | |
434 changequote([,])dnl | |
435 ]) | |
436 ]) | |
437 ;; | |
438 *) | |
439 gl_cv_func_printf_infinite_long_double="irrelevant" | |
440 ;; | |
441 esac | |
442 ]) | |
443 | |
444 dnl Test whether the *printf family of functions supports the 'a' and 'A' | |
445 dnl conversion specifier for hexadecimal output of floating-point numbers. | |
446 dnl (ISO C99, POSIX:2001) | |
447 dnl Result is gl_cv_func_printf_directive_a. | |
448 | |
449 AC_DEFUN([gl_PRINTF_DIRECTIVE_A], | |
450 [ | |
451 AC_REQUIRE([AC_PROG_CC]) | |
452 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
453 AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives], | |
454 [gl_cv_func_printf_directive_a], | |
455 [ | |
456 AC_TRY_RUN([ | |
457 #include <stdio.h> | |
458 #include <string.h> | |
459 static char buf[100]; | |
460 int main () | |
461 { | |
462 if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0 | |
463 || (strcmp (buf, "0x1.922p+1 33") != 0 | |
464 && strcmp (buf, "0x3.244p+0 33") != 0 | |
465 && strcmp (buf, "0x6.488p-1 33") != 0 | |
466 && strcmp (buf, "0xc.91p-2 33") != 0)) | |
467 return 1; | |
468 if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0 | |
469 || (strcmp (buf, "-0X1.922P+1 33") != 0 | |
470 && strcmp (buf, "-0X3.244P+0 33") != 0 | |
471 && strcmp (buf, "-0X6.488P-1 33") != 0 | |
472 && strcmp (buf, "-0XC.91P-2 33") != 0)) | |
473 return 1; | |
474 /* This catches a FreeBSD 6.1 bug: it doesn't round. */ | |
475 if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0 | |
476 || (strcmp (buf, "0x1.83p+0 33") != 0 | |
477 && strcmp (buf, "0x3.05p-1 33") != 0 | |
478 && strcmp (buf, "0x6.0ap-2 33") != 0 | |
479 && strcmp (buf, "0xc.14p-3 33") != 0)) | |
480 return 1; | |
481 /* This catches a FreeBSD 6.1 bug. See | |
482 <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */ | |
483 if (sprintf (buf, "%010a %d", 1.0 / 0.0, 33, 44, 55) < 0 | |
484 || buf[0] == '0') | |
485 return 1; | |
486 /* This catches a MacOS X 10.3.9 (Darwin 7.9) bug. */ | |
487 if (sprintf (buf, "%.1a", 1.999) < 0 | |
488 || (strcmp (buf, "0x1.0p+1") != 0 | |
489 && strcmp (buf, "0x2.0p+0") != 0 | |
490 && strcmp (buf, "0x4.0p-1") != 0 | |
491 && strcmp (buf, "0x8.0p-2") != 0)) | |
492 return 1; | |
493 /* This catches the same MacOS X 10.3.9 (Darwin 7.9) bug and also a | |
494 glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */ | |
495 if (sprintf (buf, "%.1La", 1.999L) < 0 | |
496 || (strcmp (buf, "0x1.0p+1") != 0 | |
497 && strcmp (buf, "0x2.0p+0") != 0 | |
498 && strcmp (buf, "0x4.0p-1") != 0 | |
499 && strcmp (buf, "0x8.0p-2") != 0)) | |
500 return 1; | |
501 return 0; | |
502 }], [gl_cv_func_printf_directive_a=yes], [gl_cv_func_printf_directive_a=no], | |
503 [ | |
504 case "$host_os" in | |
505 # Guess yes on glibc >= 2.5 systems. | |
506 *-gnu*) | |
507 AC_EGREP_CPP([BZ2908], [ | |
508 #include <features.h> | |
509 #ifdef __GNU_LIBRARY__ | |
510 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2) | |
511 BZ2908 | |
512 #endif | |
513 #endif | |
514 ], | |
515 [gl_cv_func_printf_directive_a="guessing yes"], | |
516 [gl_cv_func_printf_directive_a="guessing no"]) | |
517 ;; | |
518 # If we don't know, assume the worst. | |
519 *) gl_cv_func_printf_directive_a="guessing no";; | |
520 esac | |
521 ]) | |
522 ]) | |
523 ]) | |
524 | |
525 dnl Test whether the *printf family of functions supports the %F format | |
526 dnl directive. (ISO C99, POSIX:2001) | |
527 dnl Result is gl_cv_func_printf_directive_f. | |
528 | |
529 AC_DEFUN([gl_PRINTF_DIRECTIVE_F], | |
530 [ | |
531 AC_REQUIRE([AC_PROG_CC]) | |
532 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
533 AC_CACHE_CHECK([whether printf supports the 'F' directive], | |
534 [gl_cv_func_printf_directive_f], | |
535 [ | |
536 AC_TRY_RUN([ | |
537 #include <stdio.h> | |
538 #include <string.h> | |
539 static char buf[100]; | |
540 int main () | |
541 { | |
542 if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0 | |
543 || strcmp (buf, "1234567.000000 33") != 0) | |
544 return 1; | |
545 if (sprintf (buf, "%F", 1.0 / 0.0) < 0 | |
546 || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0)) | |
547 return 1; | |
548 /* This catches a Cygwin 2007 bug. */ | |
549 if (sprintf (buf, "%.F", 1234.0) < 0 | |
550 || strcmp (buf, "1234") != 0) | |
551 return 1; | |
552 return 0; | |
553 }], [gl_cv_func_printf_directive_f=yes], [gl_cv_func_printf_directive_f=no], | |
554 [ | |
555 changequote(,)dnl | |
556 case "$host_os" in | |
557 # Guess yes on glibc systems. | |
558 *-gnu*) gl_cv_func_printf_directive_f="guessing yes";; | |
559 # Guess yes on FreeBSD >= 6. | |
560 freebsd[1-5]*) gl_cv_func_printf_directive_f="guessing no";; | |
561 freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";; | |
562 # Guess yes on MacOS X >= 10.3. | |
563 darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";; | |
564 darwin*) gl_cv_func_printf_directive_f="guessing yes";; | |
565 # Guess yes on Solaris >= 2.10. | |
566 solaris2.[0-9]*) gl_cv_func_printf_directive_f="guessing no";; | |
567 solaris*) gl_cv_func_printf_directive_f="guessing yes";; | |
568 # If we don't know, assume the worst. | |
569 *) gl_cv_func_printf_directive_f="guessing no";; | |
570 esac | |
571 changequote([,])dnl | |
572 ]) | |
573 ]) | |
574 ]) | |
575 | |
576 dnl Test whether the *printf family of functions supports the %n format | |
577 dnl directive. (ISO C99, POSIX:2001) | |
578 dnl Result is gl_cv_func_printf_directive_n. | |
579 | |
580 AC_DEFUN([gl_PRINTF_DIRECTIVE_N], | |
581 [ | |
582 AC_REQUIRE([AC_PROG_CC]) | |
583 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
584 AC_CACHE_CHECK([whether printf supports the 'n' directive], | |
585 [gl_cv_func_printf_directive_n], | |
586 [ | |
587 AC_TRY_RUN([ | |
588 #include <stdio.h> | |
589 #include <string.h> | |
590 static char fmtstring[10]; | |
591 static char buf[100]; | |
592 int main () | |
593 { | |
594 int count = -1; | |
595 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) | |
596 support %n in format strings in read-only memory but not in writable | |
597 memory. */ | |
598 strcpy (fmtstring, "%d %n"); | |
599 if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0 | |
600 || strcmp (buf, "123 ") != 0 | |
601 || count != 4) | |
602 return 1; | |
603 return 0; | |
604 }], [gl_cv_func_printf_directive_n=yes], [gl_cv_func_printf_directive_n=no], | |
605 [ | |
606 changequote(,)dnl | |
607 case "$host_os" in | |
608 *) gl_cv_func_printf_directive_n="guessing yes";; | |
609 esac | |
610 changequote([,])dnl | |
611 ]) | |
612 ]) | |
613 ]) | |
614 | |
615 dnl Test whether the *printf family of functions supports POSIX/XSI format | |
616 dnl strings with positions. (POSIX:2001) | |
617 dnl Result is gl_cv_func_printf_positions. | |
618 | |
619 AC_DEFUN([gl_PRINTF_POSITIONS], | |
620 [ | |
621 AC_REQUIRE([AC_PROG_CC]) | |
622 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
623 AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions], | |
624 [gl_cv_func_printf_positions], | |
625 [ | |
626 AC_TRY_RUN([ | |
627 #include <stdio.h> | |
628 #include <string.h> | |
629 /* The string "%2$d %1$d", with dollar characters protected from the shell's | |
630 dollar expansion (possibly an autoconf bug). */ | |
631 static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; | |
632 static char buf[100]; | |
633 int main () | |
634 { | |
635 sprintf (buf, format, 33, 55); | |
636 return (strcmp (buf, "55 33") != 0); | |
637 }], [gl_cv_func_printf_positions=yes], [gl_cv_func_printf_positions=no], | |
638 [ | |
639 changequote(,)dnl | |
640 case "$host_os" in | |
641 netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*) | |
642 gl_cv_func_printf_positions="guessing no";; | |
643 beos*) gl_cv_func_printf_positions="guessing no";; | |
644 mingw* | pw*) gl_cv_func_printf_positions="guessing no";; | |
645 *) gl_cv_func_printf_positions="guessing yes";; | |
646 esac | |
647 changequote([,])dnl | |
648 ]) | |
649 ]) | |
650 ]) | |
651 | |
652 dnl Test whether the *printf family of functions supports POSIX/XSI format | |
653 dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001) | |
654 dnl Result is gl_cv_func_printf_flag_grouping. | |
655 | |
656 AC_DEFUN([gl_PRINTF_FLAG_GROUPING], | |
657 [ | |
658 AC_REQUIRE([AC_PROG_CC]) | |
659 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
660 AC_CACHE_CHECK([whether printf supports the grouping flag], | |
661 [gl_cv_func_printf_flag_grouping], | |
662 [ | |
663 AC_TRY_RUN([ | |
664 #include <stdio.h> | |
665 #include <string.h> | |
666 static char buf[100]; | |
667 int main () | |
668 { | |
669 if (sprintf (buf, "%'d %d", 1234567, 99) < 0 | |
670 || buf[strlen (buf) - 1] != '9') | |
671 return 1; | |
672 return 0; | |
673 }], [gl_cv_func_printf_flag_grouping=yes], [gl_cv_func_printf_flag_grouping=no], | |
674 [ | |
675 changequote(,)dnl | |
676 case "$host_os" in | |
677 cygwin*) gl_cv_func_printf_flag_grouping="guessing no";; | |
678 netbsd*) gl_cv_func_printf_flag_grouping="guessing no";; | |
679 mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";; | |
680 *) gl_cv_func_printf_flag_grouping="guessing yes";; | |
681 esac | |
682 changequote([,])dnl | |
683 ]) | |
684 ]) | |
685 ]) | |
686 | |
687 dnl Test whether the *printf family of functions supports the - flag correctly. | |
688 dnl (ISO C99.) See | |
689 dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html> | |
690 dnl Result is gl_cv_func_printf_flag_leftadjust. | |
691 | |
692 AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST], | |
693 [ | |
694 AC_REQUIRE([AC_PROG_CC]) | |
695 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
696 AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly], | |
697 [gl_cv_func_printf_flag_leftadjust], | |
698 [ | |
699 AC_TRY_RUN([ | |
700 #include <stdio.h> | |
701 #include <string.h> | |
702 static char buf[100]; | |
703 int main () | |
704 { | |
705 /* Check that a '-' flag is not annihilated by a negative width. */ | |
706 if (sprintf (buf, "a%-*sc", -3, "b") < 0 | |
707 || strcmp (buf, "ab c") != 0) | |
708 return 1; | |
709 return 0; | |
710 }], | |
711 [gl_cv_func_printf_flag_leftadjust=yes], | |
712 [gl_cv_func_printf_flag_leftadjust=no], | |
713 [ | |
714 changequote(,)dnl | |
715 case "$host_os" in | |
716 # Guess yes on HP-UX 11. | |
717 hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";; | |
718 # Guess no on HP-UX 10 and older. | |
719 hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";; | |
720 # Guess yes otherwise. | |
721 *) gl_cv_func_printf_flag_leftadjust="guessing yes";; | |
722 esac | |
723 changequote([,])dnl | |
724 ]) | |
725 ]) | |
726 ]) | |
727 | |
728 dnl Test whether the *printf family of functions supports padding of non-finite | |
729 dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See | |
730 dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> | |
731 dnl Result is gl_cv_func_printf_flag_zero. | |
732 | |
733 AC_DEFUN([gl_PRINTF_FLAG_ZERO], | |
734 [ | |
735 AC_REQUIRE([AC_PROG_CC]) | |
736 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
737 AC_CACHE_CHECK([whether printf supports the zero flag correctly], | |
738 [gl_cv_func_printf_flag_zero], | |
739 [ | |
740 AC_TRY_RUN([ | |
741 #include <stdio.h> | |
742 #include <string.h> | |
743 static char buf[100]; | |
744 int main () | |
745 { | |
746 if (sprintf (buf, "%010f", 1.0 / 0.0, 33, 44, 55) < 0 | |
747 || (strcmp (buf, " inf") != 0 | |
748 && strcmp (buf, " infinity") != 0)) | |
749 return 1; | |
750 return 0; | |
751 }], [gl_cv_func_printf_flag_zero=yes], [gl_cv_func_printf_flag_zero=no], | |
752 [ | |
753 changequote(,)dnl | |
754 case "$host_os" in | |
755 # Guess yes on glibc systems. | |
756 *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";; | |
757 # Guess yes on BeOS. | |
758 beos*) gl_cv_func_printf_flag_zero="guessing yes";; | |
759 # If we don't know, assume the worst. | |
760 *) gl_cv_func_printf_flag_zero="guessing no";; | |
761 esac | |
762 changequote([,])dnl | |
763 ]) | |
764 ]) | |
765 ]) | |
766 | |
767 dnl Test whether the *printf family of functions supports large precisions. | |
768 dnl On mingw, precisions larger than 512 are treated like 512, in integer, | |
769 dnl floating-point or pointer output. On BeOS, precisions larger than 1044 | |
770 dnl crash the program. | |
771 dnl Result is gl_cv_func_printf_precision. | |
772 | |
773 AC_DEFUN([gl_PRINTF_PRECISION], | |
774 [ | |
775 AC_REQUIRE([AC_PROG_CC]) | |
776 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
777 AC_CACHE_CHECK([whether printf supports large precisions], | |
778 [gl_cv_func_printf_precision], | |
779 [ | |
780 AC_TRY_RUN([ | |
781 #include <stdio.h> | |
782 #include <string.h> | |
783 static char buf[5000]; | |
784 int main () | |
785 { | |
786 #ifdef __BEOS__ | |
787 /* On BeOS, this would crash and show a dialog box. Avoid the crash. */ | |
788 return 1; | |
789 #endif | |
790 if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3) | |
791 return 1; | |
792 return 0; | |
793 }], [gl_cv_func_printf_precision=yes], [gl_cv_func_printf_precision=no], | |
794 [ | |
795 changequote(,)dnl | |
796 case "$host_os" in | |
797 # Guess no only on native Win32 and BeOS systems. | |
798 mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;; | |
799 beos*) gl_cv_func_printf_precision="guessing no" ;; | |
800 *) gl_cv_func_printf_precision="guessing yes" ;; | |
801 esac | |
802 changequote([,])dnl | |
803 ]) | |
804 ]) | |
805 ]) | |
806 | |
807 dnl Test whether the *printf family of functions recovers gracefully in case | |
808 dnl of an out-of-memory condition, or whether it crashes the entire program. | |
809 dnl Result is gl_cv_func_printf_enomem. | |
810 | |
811 AC_DEFUN([gl_PRINTF_ENOMEM], | |
812 [ | |
813 AC_REQUIRE([AC_PROG_CC]) | |
814 AC_REQUIRE([gl_MULTIARCH]) | |
815 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
816 AC_CACHE_CHECK([whether printf survives out-of-memory conditions], | |
817 [gl_cv_func_printf_enomem], | |
818 [ | |
819 gl_cv_func_printf_enomem="guessing no" | |
820 if test "$cross_compiling" = no; then | |
821 if test $APPLE_UNIVERSAL_BUILD = 0; then | |
822 AC_LANG_CONFTEST([AC_LANG_SOURCE([ | |
823 ]GL_NOCRASH[ | |
824 changequote(,)dnl | |
825 #include <stdio.h> | |
826 #include <sys/types.h> | |
827 #include <sys/time.h> | |
828 #include <sys/resource.h> | |
829 #include <errno.h> | |
830 int main() | |
831 { | |
832 struct rlimit limit; | |
833 int ret; | |
834 nocrash_init (); | |
835 /* Some printf implementations allocate temporary space with malloc. */ | |
836 /* On BSD systems, malloc() is limited by RLIMIT_DATA. */ | |
837 #ifdef RLIMIT_DATA | |
838 if (getrlimit (RLIMIT_DATA, &limit) < 0) | |
839 return 77; | |
840 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) | |
841 limit.rlim_max = 5000000; | |
842 limit.rlim_cur = limit.rlim_max; | |
843 if (setrlimit (RLIMIT_DATA, &limit) < 0) | |
844 return 77; | |
845 #endif | |
846 /* On Linux systems, malloc() is limited by RLIMIT_AS. */ | |
847 #ifdef RLIMIT_AS | |
848 if (getrlimit (RLIMIT_AS, &limit) < 0) | |
849 return 77; | |
850 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) | |
851 limit.rlim_max = 5000000; | |
852 limit.rlim_cur = limit.rlim_max; | |
853 if (setrlimit (RLIMIT_AS, &limit) < 0) | |
854 return 77; | |
855 #endif | |
856 /* Some printf implementations allocate temporary space on the stack. */ | |
857 #ifdef RLIMIT_STACK | |
858 if (getrlimit (RLIMIT_STACK, &limit) < 0) | |
859 return 77; | |
860 if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000) | |
861 limit.rlim_max = 5000000; | |
862 limit.rlim_cur = limit.rlim_max; | |
863 if (setrlimit (RLIMIT_STACK, &limit) < 0) | |
864 return 77; | |
865 #endif | |
866 ret = printf ("%.5000000f", 1.0); | |
867 return !(ret == 5000002 || (ret < 0 && errno == ENOMEM)); | |
868 } | |
869 changequote([,])dnl | |
870 ])]) | |
871 if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then | |
872 (./conftest | |
873 result=$? | |
874 if test $result != 0 && test $result != 77; then result=1; fi | |
875 exit $result | |
876 ) >/dev/null 2>/dev/null | |
877 case $? in | |
878 0) gl_cv_func_printf_enomem="yes" ;; | |
879 77) gl_cv_func_printf_enomem="guessing no" ;; | |
880 *) gl_cv_func_printf_enomem="no" ;; | |
881 esac | |
882 else | |
883 gl_cv_func_printf_enomem="guessing no" | |
884 fi | |
885 rm -fr conftest* | |
886 else | |
887 dnl A universal build on Apple MacOS X platforms. | |
888 dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode. | |
889 dnl But we need a configuration result that is valid in both modes. | |
890 gl_cv_func_printf_enomem="guessing no" | |
891 fi | |
892 fi | |
893 if test "$gl_cv_func_printf_enomem" = "guessing no"; then | |
894 changequote(,)dnl | |
895 case "$host_os" in | |
896 # Guess yes on glibc systems. | |
897 *-gnu*) gl_cv_func_printf_enomem="guessing yes";; | |
898 # Guess yes on Solaris. | |
899 solaris*) gl_cv_func_printf_enomem="guessing yes";; | |
900 # Guess yes on AIX. | |
901 aix*) gl_cv_func_printf_enomem="guessing yes";; | |
902 # Guess yes on HP-UX/hppa. | |
903 hpux*) case "$host_cpu" in | |
904 hppa*) gl_cv_func_printf_enomem="guessing yes";; | |
905 *) gl_cv_func_printf_enomem="guessing no";; | |
906 esac | |
907 ;; | |
908 # Guess yes on IRIX. | |
909 irix*) gl_cv_func_printf_enomem="guessing yes";; | |
910 # Guess yes on OSF/1. | |
911 osf*) gl_cv_func_printf_enomem="guessing yes";; | |
912 # Guess yes on BeOS. | |
913 beos*) gl_cv_func_printf_enomem="guessing yes";; | |
914 # Guess yes on Haiku. | |
915 haiku*) gl_cv_func_printf_enomem="guessing yes";; | |
916 # If we don't know, assume the worst. | |
917 *) gl_cv_func_printf_enomem="guessing no";; | |
918 esac | |
919 changequote([,])dnl | |
920 fi | |
921 ]) | |
922 ]) | |
923 | |
924 dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001) | |
925 dnl Result is ac_cv_func_snprintf. | |
926 | |
927 AC_DEFUN([gl_SNPRINTF_PRESENCE], | |
928 [ | |
929 AC_CHECK_FUNCS_ONCE([snprintf]) | |
930 ]) | |
931 | |
932 dnl Test whether the string produced by the snprintf function is always NUL | |
933 dnl terminated. (ISO C99, POSIX:2001) | |
934 dnl Result is gl_cv_func_snprintf_truncation_c99. | |
935 | |
936 AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99], | |
937 [ | |
938 AC_REQUIRE([AC_PROG_CC]) | |
939 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
940 AC_CACHE_CHECK([whether snprintf truncates the result as in C99], | |
941 [gl_cv_func_snprintf_truncation_c99], | |
942 [ | |
943 AC_TRY_RUN([ | |
944 #include <stdio.h> | |
945 #include <string.h> | |
946 static char buf[100]; | |
947 int main () | |
948 { | |
949 strcpy (buf, "ABCDEF"); | |
950 snprintf (buf, 3, "%d %d", 4567, 89); | |
951 if (memcmp (buf, "45\0DEF", 6) != 0) | |
952 return 1; | |
953 return 0; | |
954 }], [gl_cv_func_snprintf_truncation_c99=yes], [gl_cv_func_snprintf_truncation_c99=no], | |
955 [ | |
956 changequote(,)dnl | |
957 case "$host_os" in | |
958 # Guess yes on glibc systems. | |
959 *-gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
960 # Guess yes on FreeBSD >= 5. | |
961 freebsd[1-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; | |
962 freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
963 # Guess yes on MacOS X >= 10.3. | |
964 darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";; | |
965 darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
966 # Guess yes on OpenBSD >= 3.9. | |
967 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) | |
968 gl_cv_func_snprintf_truncation_c99="guessing no";; | |
969 openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
970 # Guess yes on Solaris >= 2.6. | |
971 solaris2.[0-5]*) gl_cv_func_snprintf_truncation_c99="guessing no";; | |
972 solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
973 # Guess yes on AIX >= 4. | |
974 aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";; | |
975 aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
976 # Guess yes on HP-UX >= 11. | |
977 hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";; | |
978 hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
979 # Guess yes on IRIX >= 6.5. | |
980 irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
981 # Guess yes on OSF/1 >= 5. | |
982 osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";; | |
983 osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
984 # Guess yes on NetBSD >= 3. | |
985 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) | |
986 gl_cv_func_snprintf_truncation_c99="guessing no";; | |
987 netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
988 # Guess yes on BeOS. | |
989 beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";; | |
990 # If we don't know, assume the worst. | |
991 *) gl_cv_func_snprintf_truncation_c99="guessing no";; | |
992 esac | |
993 changequote([,])dnl | |
994 ]) | |
995 ]) | |
996 ]) | |
997 | |
998 dnl Test whether the return value of the snprintf function is the number | |
999 dnl of bytes (excluding the terminating NUL) that would have been produced | |
1000 dnl if the buffer had been large enough. (ISO C99, POSIX:2001) | |
1001 dnl For example, this test program fails on IRIX 6.5: | |
1002 dnl --------------------------------------------------------------------- | |
1003 dnl #include <stdio.h> | |
1004 dnl int main() | |
1005 dnl { | |
1006 dnl static char buf[8]; | |
1007 dnl int retval = snprintf (buf, 3, "%d", 12345); | |
1008 dnl return retval >= 0 && retval < 3; | |
1009 dnl } | |
1010 dnl --------------------------------------------------------------------- | |
1011 dnl Result is gl_cv_func_snprintf_retval_c99. | |
1012 | |
1013 AC_DEFUN([gl_SNPRINTF_RETVAL_C99], | |
1014 [ | |
1015 AC_REQUIRE([AC_PROG_CC]) | |
1016 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
1017 AC_CACHE_CHECK([whether snprintf returns a byte count as in C99], | |
1018 [gl_cv_func_snprintf_retval_c99], | |
1019 [ | |
1020 AC_TRY_RUN([ | |
1021 #include <stdio.h> | |
1022 #include <string.h> | |
1023 static char buf[100]; | |
1024 int main () | |
1025 { | |
1026 strcpy (buf, "ABCDEF"); | |
1027 if (snprintf (buf, 3, "%d %d", 4567, 89) != 7) | |
1028 return 1; | |
1029 return 0; | |
1030 }], [gl_cv_func_snprintf_retval_c99=yes], [gl_cv_func_snprintf_retval_c99=no], | |
1031 [ | |
1032 changequote(,)dnl | |
1033 case "$host_os" in | |
1034 # Guess yes on glibc systems. | |
1035 *-gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";; | |
1036 # Guess yes on FreeBSD >= 5. | |
1037 freebsd[1-4]*) gl_cv_func_snprintf_retval_c99="guessing no";; | |
1038 freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; | |
1039 # Guess yes on MacOS X >= 10.3. | |
1040 darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";; | |
1041 darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";; | |
1042 # Guess yes on OpenBSD >= 3.9. | |
1043 openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*) | |
1044 gl_cv_func_snprintf_retval_c99="guessing no";; | |
1045 openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; | |
1046 # Guess yes on Solaris >= 2.6. | |
1047 solaris2.[0-5]*) gl_cv_func_snprintf_retval_c99="guessing no";; | |
1048 solaris*) gl_cv_func_snprintf_retval_c99="guessing yes";; | |
1049 # Guess yes on AIX >= 4. | |
1050 aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";; | |
1051 aix*) gl_cv_func_snprintf_retval_c99="guessing yes";; | |
1052 # Guess yes on NetBSD >= 3. | |
1053 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) | |
1054 gl_cv_func_snprintf_retval_c99="guessing no";; | |
1055 netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";; | |
1056 # Guess yes on BeOS. | |
1057 beos*) gl_cv_func_snprintf_retval_c99="guessing yes";; | |
1058 # If we don't know, assume the worst. | |
1059 *) gl_cv_func_snprintf_retval_c99="guessing no";; | |
1060 esac | |
1061 changequote([,])dnl | |
1062 ]) | |
1063 ]) | |
1064 ]) | |
1065 | |
1066 dnl Test whether the snprintf function supports the %n format directive | |
1067 dnl also in truncated portions of the format string. (ISO C99, POSIX:2001) | |
1068 dnl Result is gl_cv_func_snprintf_directive_n. | |
1069 | |
1070 AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N], | |
1071 [ | |
1072 AC_REQUIRE([AC_PROG_CC]) | |
1073 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
1074 AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive], | |
1075 [gl_cv_func_snprintf_directive_n], | |
1076 [ | |
1077 AC_TRY_RUN([ | |
1078 #include <stdio.h> | |
1079 #include <string.h> | |
1080 static char fmtstring[10]; | |
1081 static char buf[100]; | |
1082 int main () | |
1083 { | |
1084 int count = -1; | |
1085 /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2) | |
1086 support %n in format strings in read-only memory but not in writable | |
1087 memory. */ | |
1088 strcpy (fmtstring, "%d %n"); | |
1089 snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55); | |
1090 if (count != 6) | |
1091 return 1; | |
1092 return 0; | |
1093 }], [gl_cv_func_snprintf_directive_n=yes], [gl_cv_func_snprintf_directive_n=no], | |
1094 [ | |
1095 changequote(,)dnl | |
1096 case "$host_os" in | |
1097 # Guess yes on glibc systems. | |
1098 *-gnu*) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1099 # Guess yes on FreeBSD >= 5. | |
1100 freebsd[1-4]*) gl_cv_func_snprintf_directive_n="guessing no";; | |
1101 freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1102 # Guess yes on MacOS X >= 10.3. | |
1103 darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";; | |
1104 darwin*) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1105 # Guess yes on Solaris >= 2.6. | |
1106 solaris2.[0-5]*) gl_cv_func_snprintf_directive_n="guessing no";; | |
1107 solaris*) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1108 # Guess yes on AIX >= 4. | |
1109 aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";; | |
1110 aix*) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1111 # Guess yes on IRIX >= 6.5. | |
1112 irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1113 # Guess yes on OSF/1 >= 5. | |
1114 osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";; | |
1115 osf*) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1116 # Guess yes on NetBSD >= 3. | |
1117 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) | |
1118 gl_cv_func_snprintf_directive_n="guessing no";; | |
1119 netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1120 # Guess yes on BeOS. | |
1121 beos*) gl_cv_func_snprintf_directive_n="guessing yes";; | |
1122 # If we don't know, assume the worst. | |
1123 *) gl_cv_func_snprintf_directive_n="guessing no";; | |
1124 esac | |
1125 changequote([,])dnl | |
1126 ]) | |
1127 ]) | |
1128 ]) | |
1129 | |
1130 dnl Test whether the snprintf function, when passed a size = 1, writes any | |
1131 dnl output without bounds in this case, behaving like sprintf. This is the | |
1132 dnl case on Linux libc5. | |
1133 dnl Result is gl_cv_func_snprintf_size1. | |
1134 | |
1135 AC_DEFUN([gl_SNPRINTF_SIZE1], | |
1136 [ | |
1137 AC_REQUIRE([AC_PROG_CC]) | |
1138 AC_CACHE_CHECK([whether snprintf respects a size of 1], | |
1139 [gl_cv_func_snprintf_size1], | |
1140 [ | |
1141 AC_TRY_RUN([ | |
1142 #include <stdio.h> | |
1143 int main() | |
1144 { | |
1145 static char buf[8] = "DEADBEEF"; | |
1146 snprintf (buf, 1, "%d", 12345); | |
1147 return buf[1] != 'E'; | |
1148 }], | |
1149 [gl_cv_func_snprintf_size1=yes], | |
1150 [gl_cv_func_snprintf_size1=no], | |
1151 [gl_cv_func_snprintf_size1="guessing yes"]) | |
1152 ]) | |
1153 ]) | |
1154 | |
1155 dnl Test whether the vsnprintf function, when passed a zero size, produces no | |
1156 dnl output. (ISO C99, POSIX:2001) | |
1157 dnl For example, snprintf nevertheless writes a NUL byte in this case | |
1158 dnl on OSF/1 5.1: | |
1159 dnl --------------------------------------------------------------------- | |
1160 dnl #include <stdio.h> | |
1161 dnl int main() | |
1162 dnl { | |
1163 dnl static char buf[8] = "DEADBEEF"; | |
1164 dnl snprintf (buf, 0, "%d", 12345); | |
1165 dnl return buf[0] != 'D'; | |
1166 dnl } | |
1167 dnl --------------------------------------------------------------------- | |
1168 dnl And vsnprintf writes any output without bounds in this case, behaving like | |
1169 dnl vsprintf, on HP-UX 11 and OSF/1 5.1: | |
1170 dnl --------------------------------------------------------------------- | |
1171 dnl #include <stdarg.h> | |
1172 dnl #include <stdio.h> | |
1173 dnl static int my_snprintf (char *buf, int size, const char *format, ...) | |
1174 dnl { | |
1175 dnl va_list args; | |
1176 dnl int ret; | |
1177 dnl va_start (args, format); | |
1178 dnl ret = vsnprintf (buf, size, format, args); | |
1179 dnl va_end (args); | |
1180 dnl return ret; | |
1181 dnl } | |
1182 dnl int main() | |
1183 dnl { | |
1184 dnl static char buf[8] = "DEADBEEF"; | |
1185 dnl my_snprintf (buf, 0, "%d", 12345); | |
1186 dnl return buf[0] != 'D'; | |
1187 dnl } | |
1188 dnl --------------------------------------------------------------------- | |
1189 dnl Result is gl_cv_func_vsnprintf_zerosize_c99. | |
1190 | |
1191 AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99], | |
1192 [ | |
1193 AC_REQUIRE([AC_PROG_CC]) | |
1194 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles | |
1195 AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99], | |
1196 [gl_cv_func_vsnprintf_zerosize_c99], | |
1197 [ | |
1198 AC_TRY_RUN([ | |
1199 #include <stdarg.h> | |
1200 #include <stdio.h> | |
1201 static int my_snprintf (char *buf, int size, const char *format, ...) | |
1202 { | |
1203 va_list args; | |
1204 int ret; | |
1205 va_start (args, format); | |
1206 ret = vsnprintf (buf, size, format, args); | |
1207 va_end (args); | |
1208 return ret; | |
1209 } | |
1210 int main() | |
1211 { | |
1212 static char buf[8] = "DEADBEEF"; | |
1213 my_snprintf (buf, 0, "%d", 12345); | |
1214 return buf[0] != 'D'; | |
1215 }], | |
1216 [gl_cv_func_vsnprintf_zerosize_c99=yes], | |
1217 [gl_cv_func_vsnprintf_zerosize_c99=no], | |
1218 [ | |
1219 changequote(,)dnl | |
1220 case "$host_os" in | |
1221 # Guess yes on glibc systems. | |
1222 *-gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1223 # Guess yes on FreeBSD >= 5. | |
1224 freebsd[1-4]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; | |
1225 freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1226 # Guess yes on MacOS X >= 10.3. | |
1227 darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; | |
1228 darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1229 # Guess yes on Cygwin. | |
1230 cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1231 # Guess yes on Solaris >= 2.6. | |
1232 solaris2.[0-5]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; | |
1233 solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1234 # Guess yes on AIX >= 4. | |
1235 aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; | |
1236 aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1237 # Guess yes on IRIX >= 6.5. | |
1238 irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1239 # Guess yes on NetBSD >= 3. | |
1240 netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*) | |
1241 gl_cv_func_vsnprintf_zerosize_c99="guessing no";; | |
1242 netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1243 # Guess yes on BeOS. | |
1244 beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1245 # Guess yes on mingw. | |
1246 mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";; | |
1247 # If we don't know, assume the worst. | |
1248 *) gl_cv_func_vsnprintf_zerosize_c99="guessing no";; | |
1249 esac | |
1250 changequote([,])dnl | |
1251 ]) | |
1252 ]) | |
1253 ]) | |
1254 | |
1255 dnl The results of these tests on various platforms are: | |
1256 dnl | |
1257 dnl 1 = gl_PRINTF_SIZES_C99 | |
1258 dnl 2 = gl_PRINTF_LONG_DOUBLE | |
1259 dnl 3 = gl_PRINTF_INFINITE | |
1260 dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE | |
1261 dnl 5 = gl_PRINTF_DIRECTIVE_A | |
1262 dnl 6 = gl_PRINTF_DIRECTIVE_F | |
1263 dnl 7 = gl_PRINTF_DIRECTIVE_N | |
1264 dnl 8 = gl_PRINTF_POSITIONS | |
1265 dnl 9 = gl_PRINTF_FLAG_GROUPING | |
1266 dnl 10 = gl_PRINTF_FLAG_LEFTADJUST | |
1267 dnl 11 = gl_PRINTF_FLAG_ZERO | |
1268 dnl 12 = gl_PRINTF_PRECISION | |
1269 dnl 13 = gl_PRINTF_ENOMEM | |
1270 dnl 14 = gl_SNPRINTF_PRESENCE | |
1271 dnl 15 = gl_SNPRINTF_TRUNCATION_C99 | |
1272 dnl 16 = gl_SNPRINTF_RETVAL_C99 | |
1273 dnl 17 = gl_SNPRINTF_DIRECTIVE_N | |
1274 dnl 18 = gl_SNPRINTF_SIZE1 | |
1275 dnl 19 = gl_VSNPRINTF_ZEROSIZE_C99 | |
1276 dnl | |
1277 dnl 1 = checking whether printf supports size specifiers as in C99... | |
1278 dnl 2 = checking whether printf supports 'long double' arguments... | |
1279 dnl 3 = checking whether printf supports infinite 'double' arguments... | |
1280 dnl 4 = checking whether printf supports infinite 'long double' arguments... | |
1281 dnl 5 = checking whether printf supports the 'a' and 'A' directives... | |
1282 dnl 6 = checking whether printf supports the 'F' directive... | |
1283 dnl 7 = checking whether printf supports the 'n' directive... | |
1284 dnl 8 = checking whether printf supports POSIX/XSI format strings with positions... | |
1285 dnl 9 = checking whether printf supports the grouping flag... | |
1286 dnl 10 = checking whether printf supports the left-adjust flag correctly... | |
1287 dnl 11 = checking whether printf supports the zero flag correctly... | |
1288 dnl 12 = checking whether printf supports large precisions... | |
1289 dnl 13 = checking whether printf survives out-of-memory conditions... | |
1290 dnl 14 = checking for snprintf... | |
1291 dnl 15 = checking whether snprintf truncates the result as in C99... | |
1292 dnl 16 = checking whether snprintf returns a byte count as in C99... | |
1293 dnl 17 = checking whether snprintf fully supports the 'n' directive... | |
1294 dnl 18 = checking whether snprintf respects a size of 1... | |
1295 dnl 19 = checking whether vsnprintf respects a zero size as in C99... | |
1296 dnl | |
1297 dnl . = yes, # = no. | |
1298 dnl | |
1299 dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1300 dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . | |
1301 dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . | |
1302 dnl FreeBSD 5.4, 6.1 . . . . # . . . . . # . # . . . . . . | |
1303 dnl MacOS X 10.3.9 . . . . # . . . . . # . # . . . . . . | |
1304 dnl OpenBSD 3.9, 4.0 . . # # # # . . # . # . # . . . . . . | |
1305 dnl Cygwin 2007 (= Cygwin 1.5.24) . . . . # # . . . ? # ? ? . . . . . . | |
1306 dnl Cygwin 2006 (= Cygwin 1.5.19) # . . . # # . . # ? # ? ? . . . . . . | |
1307 dnl Solaris 10 . . # # # . . . . . # . . . . . . . . | |
1308 dnl Solaris 2.6 ... 9 # . # # # # . . . . # . . . . . . . . | |
1309 dnl Solaris 2.5.1 # . # # # # . . . . # . . # # # # # # | |
1310 dnl AIX 5.2 . . # # # . . . . . # . . . . . . . . | |
1311 dnl AIX 4.3.2, 5.1 # . # # # # . . . . # . . . . . . . . | |
1312 dnl HP-UX 11.31 . . . . # . . . . . # . . . . # # . . | |
1313 dnl HP-UX 11.{00,11,23} # . . . # # . . . . # . . . . # # . # | |
1314 dnl HP-UX 10.20 # . . . # # . . . # # . . . . # # ? # | |
1315 dnl IRIX 6.5 # . # # # # . . . . # . . . . # . . . | |
1316 dnl OSF/1 5.1 # . # # # # . . . . # . . . . # . . # | |
1317 dnl OSF/1 4.0d # . # # # # . . . . # . . # # # # # # | |
1318 dnl NetBSD 4.0 . ? ? ? ? ? . . ? ? ? ? ? . . . ? ? ? | |
1319 dnl NetBSD 3.0 . . . . # # . # # ? # . # . . . . . . | |
1320 dnl Haiku . . . # # # . . . . . . ? . . . . . . | |
1321 dnl BeOS # # . # # # . # . ? . # ? . . . . . . | |
1322 dnl mingw # # # # # # . # # . # # ? . # # # . . |