1# inttypes.m4 serial 8
2dnl Copyright (C) 2006-2007 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7dnl From Derek Price, Bruno Haible.
8dnl Test whether <inttypes.h> is supported or must be substituted.
9
10AC_DEFUN([gl_INTTYPES_H],
11[
12  AC_REQUIRE([gl_STDINT_H])
13  AC_REQUIRE([gt_INTTYPES_PRI])
14  AC_CHECK_DECLS_ONCE([imaxabs])
15  AC_CHECK_DECLS_ONCE([imaxdiv])
16  AC_CHECK_DECLS_ONCE([strtoimax])
17  AC_CHECK_DECLS_ONCE([strtoumax])
18
19  dnl Now see if we need a substitute <inttypes.h>.
20  dnl A complete <inttypes.h> requires
21  dnl   - a complete <stdint.h>,
22  dnl   - the existence of an <inttypes.h>,
23  dnl   - that imaxabs, imaxdiv, strtoimax, strtoumax are declared,
24  dnl   - some additional tests.
25  AC_CACHE_CHECK([whether inttypes.h conforms to C99],
26    [gl_cv_header_working_inttypes_h],
27    [gl_cv_header_working_inttypes_h=no
28     if test "$gl_cv_header_working_stdint_h" = yes \
29	&& test $ac_cv_header_inttypes_h = yes \
30	&& test "$ac_cv_have_decl_imaxabs" = yes \
31	&& test "$ac_cv_have_decl_imaxdiv" = yes \
32	&& test "$ac_cv_have_decl_strtoimax" = yes \
33	&& test "$ac_cv_have_decl_strtoumax" = yes; then
34       AC_COMPILE_IFELSE([
35	 AC_LANG_PROGRAM([
36#include <stddef.h>
37#define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
38#define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
39#define __STDC_FORMAT_MACROS 1 /* to make it work also in C++ mode */
40#include ABSOLUTE_INTTYPES_H
41
42/* No need to duplicate the tests of stdint.m4; they are subsumed by
43   $gl_cv_header_working_stdint_h = yes.  */
44
45/* Tests for macros supposed to be defined in inttypes.h.  */
46
47const char *k = /* implicit string concatenation */
48#ifdef INT8_MAX
49  PRId8 PRIi8
50#endif
51#ifdef UINT8_MAX
52  PRIo8 PRIu8 PRIx8 PRIX8
53#endif
54#ifdef INT16_MAX
55  PRId16 PRIi16
56#endif
57#ifdef UINT16_MAX
58  PRIo16 PRIu16 PRIx16 PRIX16
59#endif
60#ifdef INT32_MAX
61  PRId32 PRIi32
62#endif
63#ifdef UINT32_MAX
64  PRIo32 PRIu32 PRIx32 PRIX32
65#endif
66#ifdef INT64_MAX
67  PRId64 PRIi64
68#endif
69#ifdef UINT64_MAX
70  PRIo64 PRIu64 PRIx64 PRIX64
71#endif
72  PRIdLEAST8 PRIiLEAST8 PRIoLEAST8 PRIuLEAST8 PRIxLEAST8 PRIXLEAST8
73  PRIdLEAST16 PRIiLEAST16 PRIoLEAST16 PRIuLEAST16 PRIxLEAST16 PRIXLEAST16
74  PRIdLEAST32 PRIiLEAST32 PRIoLEAST32 PRIuLEAST32 PRIxLEAST32 PRIXLEAST32
75  PRIdLEAST64 PRIiLEAST64
76  PRIoLEAST64 PRIuLEAST64 PRIxLEAST64 PRIXLEAST64
77  PRIdFAST8 PRIiFAST8 PRIoFAST8 PRIuFAST8 PRIxFAST8 PRIXFAST8
78  PRIdFAST16 PRIiFAST16 PRIoFAST16 PRIuFAST16 PRIxFAST16 PRIXFAST16
79  PRIdFAST32 PRIiFAST32 PRIoFAST32 PRIuFAST32 PRIxFAST32 PRIXFAST32
80  PRIdFAST64 PRIiFAST64
81  PRIoFAST64 PRIuFAST64 PRIxFAST64 PRIXFAST64
82  PRIdMAX PRIiMAX PRIoMAX PRIuMAX PRIxMAX PRIXMAX
83#ifdef INTPTR_MAX
84  PRIdPTR PRIiPTR
85#endif
86#ifdef UINTPTR_MAX
87  PRIoPTR PRIuPTR PRIxPTR PRIXPTR
88#endif
89  ;
90const char *l = /* implicit string concatenation */
91#ifdef INT8_MAX
92  SCNd8 SCNi8
93#endif
94#ifdef UINT8_MAX
95  SCNo8 SCNu8 SCNx8
96#endif
97#ifdef INT16_MAX
98  SCNd16 SCNi16
99#endif
100#ifdef UINT16_MAX
101  SCNo16 SCNu16 SCNx16
102#endif
103#ifdef INT32_MAX
104  SCNd32 SCNi32
105#endif
106#ifdef UINT32_MAX
107  SCNo32 SCNu32 SCNx32
108#endif
109#ifdef INT64_MAX
110  SCNd64 SCNi64
111#endif
112#ifdef UINT64_MAX
113  SCNo64 SCNu64 SCNx64
114#endif
115  SCNdLEAST8 SCNiLEAST8 SCNoLEAST8 SCNuLEAST8 SCNxLEAST8
116  SCNdLEAST16 SCNiLEAST16 SCNoLEAST16 SCNuLEAST16 SCNxLEAST16
117  SCNdLEAST32 SCNiLEAST32 SCNoLEAST32 SCNuLEAST32 SCNxLEAST32
118  SCNdLEAST64 SCNiLEAST64
119  SCNoLEAST64 SCNuLEAST64 SCNxLEAST64
120  SCNdFAST8 SCNiFAST8 SCNoFAST8 SCNuFAST8 SCNxFAST8
121  SCNdFAST16 SCNiFAST16 SCNoFAST16 SCNuFAST16 SCNxFAST16
122  SCNdFAST32 SCNiFAST32 SCNoFAST32 SCNuFAST32 SCNxFAST32
123  SCNdFAST64 SCNiFAST64
124  SCNoFAST64 SCNuFAST64 SCNxFAST64
125  SCNdMAX SCNiMAX SCNoMAX SCNuMAX SCNxMAX
126#ifdef INTPTR_MAX
127  SCNdPTR SCNiPTR
128#endif
129#ifdef UINTPTR_MAX
130  SCNoPTR SCNuPTR SCNxPTR
131#endif
132  ;
133	 ])],
134	 [gl_cv_header_working_inttypes_h=yes])
135     fi])
136
137  dnl Override <inttypes.h> always, so that the portability warnings work.
138  if false && test $gl_cv_header_working_inttypes_h = yes; then
139    dnl Use the existing <inttypes.h>.
140    INTTYPES_H=''
141  else
142
143    AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
144    dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
145    if test $ac_cv_header_inttypes_h = yes; then
146      gl_ABSOLUTE_HEADER([inttypes.h])
147      ABSOLUTE_INTTYPES_H=\"$gl_cv_absolute_inttypes_h\"
148    else
149      ABSOLUTE_INTTYPES_H=\"no/such/file/inttypes.h\"
150    fi
151    AC_SUBST([ABSOLUTE_INTTYPES_H])
152
153    PRIPTR_PREFIX=
154    if test -n "$STDINT_H"; then
155      dnl Using the gnulib <stdint.h>. It always defines intptr_t to 'long'.
156      PRIPTR_PREFIX='"l"'
157    else
158      dnl Using the system's <stdint.h>.
159      for glpfx in '' l ll I64; do
160        case $glpfx in
161          '')  gltype1='int';;
162          l)   gltype1='long int';;
163          ll)  gltype1='long long int';;
164          I64) gltype1='__int64';;
165        esac
166        AC_COMPILE_IFELSE(
167          [AC_LANG_PROGRAM([#include <stdint.h>
168             extern intptr_t foo;
169             extern $gltype1 foo;])],
170          [PRIPTR_PREFIX='"'$glpfx'"'])
171        test -n "$PRIPTR_PREFIX" && break
172      done
173    fi
174    AC_SUBST([PRIPTR_PREFIX])
175
176    if test "$ac_cv_have_decl_imaxabs" = yes; then
177      HAVE_DECL_IMAXABS=1
178    else
179      HAVE_DECL_IMAXABS=0
180    fi
181
182    if test "$ac_cv_have_decl_imaxdiv" = yes; then
183      HAVE_DECL_IMAXDIV=1
184    else
185      HAVE_DECL_IMAXDIV=0
186    fi
187
188    if test "$ac_cv_have_decl_strtoimax" = yes; then
189      HAVE_DECL_STRTOIMAX=1
190    else
191      HAVE_DECL_STRTOIMAX=0
192    fi
193
194    if test "$ac_cv_have_decl_strtoumax" = yes; then
195      HAVE_DECL_STRTOUMAX=1
196    else
197      HAVE_DECL_STRTOUMAX=0
198    fi
199
200    INTTYPES_H='inttypes.h'
201  fi
202  AC_SUBST(INTTYPES_H)
203])
204
205AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR],
206[
207  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
208  AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
209  GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
210])
211
212AC_DEFUN([gl_INTTYPES_H_DEFAULTS],
213[
214  GNULIB_IMAXABS=0;      AC_SUBST([GNULIB_IMAXABS])
215  GNULIB_IMAXDIV=0;      AC_SUBST([GNULIB_IMAXDIV])
216  GNULIB_STRTOIMAX=0;    AC_SUBST([GNULIB_STRTOIMAX])
217  GNULIB_STRTOUMAX=0;    AC_SUBST([GNULIB_STRTOUMAX])
218  dnl Assume proper GNU behavior unless another module says otherwise.
219  HAVE_DECL_IMAXABS=1;   AC_SUBST([HAVE_DECL_IMAXABS])
220  HAVE_DECL_IMAXDIV=1;   AC_SUBST([HAVE_DECL_IMAXDIV])
221  HAVE_DECL_STRTOIMAX=1; AC_SUBST([HAVE_DECL_STRTOIMAX])
222  HAVE_DECL_STRTOUMAX=1; AC_SUBST([HAVE_DECL_STRTOUMAX])
223])
224