diff options
Diffstat (limited to 'gl/m4/stdint.m4')
-rw-r--r-- | gl/m4/stdint.m4 | 369 |
1 files changed, 369 insertions, 0 deletions
diff --git a/gl/m4/stdint.m4 b/gl/m4/stdint.m4 new file mode 100644 index 0000000..1a4b4a6 --- /dev/null +++ b/gl/m4/stdint.m4 | |||
@@ -0,0 +1,369 @@ | |||
1 | # stdint.m4 serial 22 | ||
2 | dnl Copyright (C) 2001-2002, 2004-2007 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 From Paul Eggert and Bruno Haible. | ||
8 | dnl Test whether <stdint.h> is supported or must be substituted. | ||
9 | |||
10 | AC_DEFUN([gl_STDINT_H], | ||
11 | [ | ||
12 | AC_PREREQ(2.59)dnl | ||
13 | |||
14 | dnl Check for long long int and unsigned long long int. | ||
15 | AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) | ||
16 | if test $ac_cv_type_long_long_int = yes; then | ||
17 | HAVE_LONG_LONG_INT=1 | ||
18 | else | ||
19 | HAVE_LONG_LONG_INT=0 | ||
20 | fi | ||
21 | AC_SUBST([HAVE_LONG_LONG_INT]) | ||
22 | AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT]) | ||
23 | if test $ac_cv_type_unsigned_long_long_int = yes; then | ||
24 | HAVE_UNSIGNED_LONG_LONG_INT=1 | ||
25 | else | ||
26 | HAVE_UNSIGNED_LONG_LONG_INT=0 | ||
27 | fi | ||
28 | AC_SUBST([HAVE_UNSIGNED_LONG_LONG_INT]) | ||
29 | |||
30 | dnl Check for <inttypes.h>. | ||
31 | dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h. | ||
32 | if test $ac_cv_header_inttypes_h = yes; then | ||
33 | HAVE_INTTYPES_H=1 | ||
34 | else | ||
35 | HAVE_INTTYPES_H=0 | ||
36 | fi | ||
37 | AC_SUBST([HAVE_INTTYPES_H]) | ||
38 | |||
39 | dnl Check for <sys/types.h>. | ||
40 | dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_sys_types_h. | ||
41 | if test $ac_cv_header_sys_types_h = yes; then | ||
42 | HAVE_SYS_TYPES_H=1 | ||
43 | else | ||
44 | HAVE_SYS_TYPES_H=0 | ||
45 | fi | ||
46 | AC_SUBST([HAVE_SYS_TYPES_H]) | ||
47 | |||
48 | dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_stdint_h. | ||
49 | if test $ac_cv_header_stdint_h = yes; then | ||
50 | gl_ABSOLUTE_HEADER([stdint.h]) | ||
51 | ABSOLUTE_STDINT_H=\"$gl_cv_absolute_stdint_h\" | ||
52 | HAVE_STDINT_H=1 | ||
53 | else | ||
54 | ABSOLUTE_STDINT_H=\"no/such/file/stdint.h\" | ||
55 | HAVE_STDINT_H=0 | ||
56 | fi | ||
57 | AC_SUBST([ABSOLUTE_STDINT_H]) | ||
58 | AC_SUBST([HAVE_STDINT_H]) | ||
59 | |||
60 | dnl Now see whether we need a substitute <stdint.h>. Use | ||
61 | dnl ABSOLUTE_STDINT_H, not <stdint.h>, so that it also works during | ||
62 | dnl a "config.status --recheck" if a stdint.h has been | ||
63 | dnl created in the build directory. | ||
64 | if test $ac_cv_header_stdint_h = yes; then | ||
65 | AC_CACHE_CHECK([whether stdint.h conforms to C99], | ||
66 | [gl_cv_header_working_stdint_h], | ||
67 | [gl_cv_header_working_stdint_h=no | ||
68 | AC_COMPILE_IFELSE([ | ||
69 | AC_LANG_PROGRAM([[ | ||
70 | #include <stddef.h> | ||
71 | #define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */ | ||
72 | #define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */ | ||
73 | #include ABSOLUTE_STDINT_H | ||
74 | #ifdef INT8_MAX | ||
75 | int8_t a1 = INT8_MAX; | ||
76 | int8_t a1min = INT8_MIN; | ||
77 | #endif | ||
78 | #ifdef INT16_MAX | ||
79 | int16_t a2 = INT16_MAX; | ||
80 | int16_t a2min = INT16_MIN; | ||
81 | #endif | ||
82 | #ifdef INT32_MAX | ||
83 | int32_t a3 = INT32_MAX; | ||
84 | int32_t a3min = INT32_MIN; | ||
85 | #endif | ||
86 | #ifdef INT64_MAX | ||
87 | int64_t a4 = INT64_MAX; | ||
88 | int64_t a4min = INT64_MIN; | ||
89 | #endif | ||
90 | #ifdef UINT8_MAX | ||
91 | uint8_t b1 = UINT8_MAX; | ||
92 | #else | ||
93 | typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; | ||
94 | #endif | ||
95 | #ifdef UINT16_MAX | ||
96 | uint16_t b2 = UINT16_MAX; | ||
97 | #endif | ||
98 | #ifdef UINT32_MAX | ||
99 | uint32_t b3 = UINT32_MAX; | ||
100 | #endif | ||
101 | #ifdef UINT64_MAX | ||
102 | uint64_t b4 = UINT64_MAX; | ||
103 | #endif | ||
104 | int_least8_t c1 = INT8_C (0x7f); | ||
105 | int_least8_t c1max = INT_LEAST8_MAX; | ||
106 | int_least8_t c1min = INT_LEAST8_MIN; | ||
107 | int_least16_t c2 = INT16_C (0x7fff); | ||
108 | int_least16_t c2max = INT_LEAST16_MAX; | ||
109 | int_least16_t c2min = INT_LEAST16_MIN; | ||
110 | int_least32_t c3 = INT32_C (0x7fffffff); | ||
111 | int_least32_t c3max = INT_LEAST32_MAX; | ||
112 | int_least32_t c3min = INT_LEAST32_MIN; | ||
113 | int_least64_t c4 = INT64_C (0x7fffffffffffffff); | ||
114 | int_least64_t c4max = INT_LEAST64_MAX; | ||
115 | int_least64_t c4min = INT_LEAST64_MIN; | ||
116 | uint_least8_t d1 = UINT8_C (0xff); | ||
117 | uint_least8_t d1max = UINT_LEAST8_MAX; | ||
118 | uint_least16_t d2 = UINT16_C (0xffff); | ||
119 | uint_least16_t d2max = UINT_LEAST16_MAX; | ||
120 | uint_least32_t d3 = UINT32_C (0xffffffff); | ||
121 | uint_least32_t d3max = UINT_LEAST32_MAX; | ||
122 | uint_least64_t d4 = UINT64_C (0xffffffffffffffff); | ||
123 | uint_least64_t d4max = UINT_LEAST64_MAX; | ||
124 | int_fast8_t e1 = INT_FAST8_MAX; | ||
125 | int_fast8_t e1min = INT_FAST8_MIN; | ||
126 | int_fast16_t e2 = INT_FAST16_MAX; | ||
127 | int_fast16_t e2min = INT_FAST16_MIN; | ||
128 | int_fast32_t e3 = INT_FAST32_MAX; | ||
129 | int_fast32_t e3min = INT_FAST32_MIN; | ||
130 | int_fast64_t e4 = INT_FAST64_MAX; | ||
131 | int_fast64_t e4min = INT_FAST64_MIN; | ||
132 | uint_fast8_t f1 = UINT_FAST8_MAX; | ||
133 | uint_fast16_t f2 = UINT_FAST16_MAX; | ||
134 | uint_fast32_t f3 = UINT_FAST32_MAX; | ||
135 | uint_fast64_t f4 = UINT_FAST64_MAX; | ||
136 | #ifdef INTPTR_MAX | ||
137 | intptr_t g = INTPTR_MAX; | ||
138 | intptr_t gmin = INTPTR_MIN; | ||
139 | #endif | ||
140 | #ifdef UINTPTR_MAX | ||
141 | uintptr_t h = UINTPTR_MAX; | ||
142 | #endif | ||
143 | intmax_t i = INTMAX_MAX; | ||
144 | uintmax_t j = UINTMAX_MAX; | ||
145 | struct s { | ||
146 | int check_PTRDIFF: PTRDIFF_MIN < 0 && 0 < PTRDIFF_MAX ? 1 : -1; | ||
147 | int check_SIG_ATOMIC: SIG_ATOMIC_MIN <= 0 && 0 < SIG_ATOMIC_MAX ? 1 : -1; | ||
148 | int check_SIZE: 0 < SIZE_MAX ? 1 : -1; | ||
149 | int check_WCHAR: WCHAR_MIN <= 0 && 0 < WCHAR_MAX ? 1 : -1; | ||
150 | int check_WINT: WINT_MIN <= 0 && 0 < WINT_MAX ? 1 : -1; | ||
151 | |||
152 | /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ | ||
153 | int check_UINT8_C: | ||
154 | (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; | ||
155 | int check_UINT16_C: | ||
156 | (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; | ||
157 | |||
158 | /* Detect bugs in OpenBSD 3.9 stdint.h. */ | ||
159 | #ifdef UINT8_MAX | ||
160 | int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; | ||
161 | #endif | ||
162 | #ifdef UINT16_MAX | ||
163 | int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; | ||
164 | #endif | ||
165 | #ifdef UINT32_MAX | ||
166 | int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; | ||
167 | #endif | ||
168 | #ifdef UINT64_MAX | ||
169 | int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; | ||
170 | #endif | ||
171 | int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; | ||
172 | int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; | ||
173 | int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; | ||
174 | int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; | ||
175 | int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; | ||
176 | int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; | ||
177 | int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; | ||
178 | int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; | ||
179 | int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; | ||
180 | int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; | ||
181 | int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; | ||
182 | }; | ||
183 | ]])], | ||
184 | [gl_cv_header_working_stdint_h=yes])]) | ||
185 | fi | ||
186 | if test "$gl_cv_header_working_stdint_h" = yes; then | ||
187 | STDINT_H= | ||
188 | else | ||
189 | dnl Check for <sys/inttypes.h>, and for | ||
190 | dnl <sys/bitypes.h> (used in Linux libc4 >= 4.6.7 and libc5). | ||
191 | AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h]) | ||
192 | if test $ac_cv_header_sys_inttypes_h = yes; then | ||
193 | HAVE_SYS_INTTYPES_H=1 | ||
194 | else | ||
195 | HAVE_SYS_INTTYPES_H=0 | ||
196 | fi | ||
197 | AC_SUBST([HAVE_SYS_INTTYPES_H]) | ||
198 | if test $ac_cv_header_sys_bitypes_h = yes; then | ||
199 | HAVE_SYS_BITYPES_H=1 | ||
200 | else | ||
201 | HAVE_SYS_BITYPES_H=0 | ||
202 | fi | ||
203 | AC_SUBST([HAVE_SYS_BITYPES_H]) | ||
204 | |||
205 | gl_STDINT_TYPE_PROPERTIES | ||
206 | STDINT_H=stdint.h | ||
207 | fi | ||
208 | AC_SUBST(STDINT_H) | ||
209 | ]) | ||
210 | |||
211 | dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES) | ||
212 | dnl Determine the size of each of the given types in bits. | ||
213 | AC_DEFUN([gl_STDINT_BITSIZEOF], | ||
214 | [ | ||
215 | dnl Use a shell loop, to avoid bloating configure, and | ||
216 | dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into | ||
217 | dnl config.h.in, | ||
218 | dnl - extra AC_SUBST calls, so that the right substitutions are made. | ||
219 | AC_FOREACH([gltype], [$1], | ||
220 | [AH_TEMPLATE([BITSIZEOF_]translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]), | ||
221 | [Define to the number of bits in type ']gltype['.])]) | ||
222 | for gltype in $1 ; do | ||
223 | AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}], | ||
224 | [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT], | ||
225 | [$2 | ||
226 | #include <limits.h>], [result=unknown]) | ||
227 | eval gl_cv_bitsizeof_${gltype}=\$result | ||
228 | ]) | ||
229 | eval result=\$gl_cv_bitsizeof_${gltype} | ||
230 | if test $result = unknown; then | ||
231 | dnl Use a nonempty default, because some compilers, such as IRIX 5 cc, | ||
232 | dnl do a syntax check even on unused #if conditions and give an error | ||
233 | dnl on valid C code like this: | ||
234 | dnl #if 0 | ||
235 | dnl # if > 32 | ||
236 | dnl # endif | ||
237 | dnl #endif | ||
238 | result=0 | ||
239 | fi | ||
240 | GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` | ||
241 | AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result]) | ||
242 | eval BITSIZEOF_${GLTYPE}=\$result | ||
243 | done | ||
244 | AC_FOREACH([gltype], [$1], | ||
245 | [AC_SUBST([BITSIZEOF_]translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))]) | ||
246 | ]) | ||
247 | |||
248 | dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES) | ||
249 | dnl Determine the signedness of each of the given types. | ||
250 | dnl Define HAVE_SIGNED_TYPE if type is signed. | ||
251 | AC_DEFUN([gl_CHECK_TYPES_SIGNED], | ||
252 | [ | ||
253 | dnl Use a shell loop, to avoid bloating configure, and | ||
254 | dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into | ||
255 | dnl config.h.in, | ||
256 | dnl - extra AC_SUBST calls, so that the right substitutions are made. | ||
257 | AC_FOREACH([gltype], [$1], | ||
258 | [AH_TEMPLATE([HAVE_SIGNED_]translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]), | ||
259 | [Define to 1 if ']gltype[' is a signed integer type.])]) | ||
260 | for gltype in $1 ; do | ||
261 | AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed], | ||
262 | [AC_COMPILE_IFELSE( | ||
263 | [AC_LANG_PROGRAM([$2[ | ||
264 | int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])], | ||
265 | result=yes, result=no) | ||
266 | eval gl_cv_type_${gltype}_signed=\$result | ||
267 | ]) | ||
268 | eval result=\$gl_cv_type_${gltype}_signed | ||
269 | GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` | ||
270 | if test "$result" = yes; then | ||
271 | AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], 1) | ||
272 | eval HAVE_SIGNED_${GLTYPE}=1 | ||
273 | else | ||
274 | eval HAVE_SIGNED_${GLTYPE}=0 | ||
275 | fi | ||
276 | done | ||
277 | AC_FOREACH([gltype], [$1], | ||
278 | [AC_SUBST([HAVE_SIGNED_]translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))]) | ||
279 | ]) | ||
280 | |||
281 | dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES) | ||
282 | dnl Determine the suffix to use for integer constants of the given types. | ||
283 | dnl Define t_SUFFIX for each such type. | ||
284 | AC_DEFUN([gl_INTEGER_TYPE_SUFFIX], | ||
285 | [ | ||
286 | dnl Use a shell loop, to avoid bloating configure, and | ||
287 | dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into | ||
288 | dnl config.h.in, | ||
289 | dnl - extra AC_SUBST calls, so that the right substitutions are made. | ||
290 | AC_FOREACH([gltype], [$1], | ||
291 | [AH_TEMPLATE(translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX], | ||
292 | [Define to l, ll, u, ul, ull, etc., as suitable for | ||
293 | constants of type ']gltype['.])]) | ||
294 | for gltype in $1 ; do | ||
295 | AC_CACHE_CHECK([for $gltype integer literal suffix], | ||
296 | [gl_cv_type_${gltype}_suffix], | ||
297 | [eval gl_cv_type_${gltype}_suffix=no | ||
298 | eval result=\$gl_cv_type_${gltype}_signed | ||
299 | if test "$result" = yes; then | ||
300 | glsufu= | ||
301 | else | ||
302 | glsufu=u | ||
303 | fi | ||
304 | for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do | ||
305 | case $glsuf in | ||
306 | '') gltype1='int';; | ||
307 | l) gltype1='long int';; | ||
308 | ll) gltype1='long long int';; | ||
309 | i64) gltype1='__int64';; | ||
310 | u) gltype1='unsigned int';; | ||
311 | ul) gltype1='unsigned long int';; | ||
312 | ull) gltype1='unsigned long long int';; | ||
313 | ui64)gltype1='unsigned __int64';; | ||
314 | esac | ||
315 | AC_COMPILE_IFELSE( | ||
316 | [AC_LANG_PROGRAM([$2 | ||
317 | extern $gltype foo; | ||
318 | extern $gltype1 foo;])], | ||
319 | [eval gl_cv_type_${gltype}_suffix=\$glsuf]) | ||
320 | eval result=\$gl_cv_type_${gltype}_suffix | ||
321 | test "$result" != no && break | ||
322 | done]) | ||
323 | GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'` | ||
324 | eval result=\$gl_cv_type_${gltype}_suffix | ||
325 | test "$result" = no && result= | ||
326 | eval ${GLTYPE}_SUFFIX=\$result | ||
327 | AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], $result) | ||
328 | done | ||
329 | AC_FOREACH([gltype], [$1], | ||
330 | [AC_SUBST(translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])]) | ||
331 | ]) | ||
332 | |||
333 | dnl gl_STDINT_INCLUDES | ||
334 | AC_DEFUN([gl_STDINT_INCLUDES], | ||
335 | [[ | ||
336 | /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be | ||
337 | included before <wchar.h>. */ | ||
338 | #include <stddef.h> | ||
339 | #include <signal.h> | ||
340 | #include <stdio.h> | ||
341 | #include <time.h> | ||
342 | #include <wchar.h> | ||
343 | ]]) | ||
344 | |||
345 | dnl gl_STDINT_TYPE_PROPERTIES | ||
346 | dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t | ||
347 | dnl of interest to stdint_.h. | ||
348 | AC_DEFUN([gl_STDINT_TYPE_PROPERTIES], | ||
349 | [ | ||
350 | gl_STDINT_BITSIZEOF([ptrdiff_t sig_atomic_t size_t wchar_t wint_t], | ||
351 | [gl_STDINT_INCLUDES]) | ||
352 | gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t], | ||
353 | [gl_STDINT_INCLUDES]) | ||
354 | gl_cv_type_ptrdiff_t_signed=yes | ||
355 | gl_cv_type_size_t_signed=no | ||
356 | gl_INTEGER_TYPE_SUFFIX([ptrdiff_t sig_atomic_t size_t wchar_t wint_t], | ||
357 | [gl_STDINT_INCLUDES]) | ||
358 | ]) | ||
359 | |||
360 | dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in. | ||
361 | dnl Remove this when we can assume autoconf >= 2.61. | ||
362 | m4_ifdef([AC_COMPUTE_INT], [], [ | ||
363 | AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])]) | ||
364 | ]) | ||
365 | |||
366 | # Hey Emacs! | ||
367 | # Local Variables: | ||
368 | # indent-tabs-mode: nil | ||
369 | # End: | ||