3a43c0ac03aff4c2c813f89c550ffdf0f04e863b
[gnulib.git] / m4 / inttypes.m4
1 # inttypes.m4 serial 4
2 dnl Copyright (C) 2006 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 Derek Price, Bruno Haible.
8 dnl Test whether <inttypes.h> is supported or must be substituted.
9
10 AC_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   gl_cv_header_working_inttypes_h=no
26   if test $gl_cv_header_working_stdint_h = yes \
27      && test $gl_cv_header_inttypes_h = yes \
28      && test "$ac_cv_have_decl_imaxabs" = yes \
29      && test "$ac_cv_have_decl_imaxdiv" = yes \
30      && test "$ac_cv_have_decl_strtoimax" = yes \
31      && test "$ac_cv_have_decl_strtoumax" = yes; then
32     AC_COMPILE_IFELSE([
33       AC_LANG_PROGRAM([
34 #include <stddef.h>
35 #define __STDC_LIMIT_MACROS 1 /* to make it work also in C++ mode */
36 #define __STDC_CONSTANT_MACROS 1 /* to make it work also in C++ mode */
37 #define __STDC_FORMAT_MACROS 1 /* to make it work also in C++ mode */
38 #include ABSOLUTE_INTTYPES_H
39
40 /* No need to duplicate the tests of stdint.m4; they are subsumed by
41    $gl_cv_header_working_stdint_h = yes.  */
42
43 /* Tests for macros supposed to be defined in inttypes.h.  */
44
45 const char *k = /* implicit string concatenation */
46 #ifdef INT8_MAX
47   PRId8 PRIi8
48 #endif
49 #ifdef UINT8_MAX
50   PRIo8 PRIu8 PRIx8 PRIX8
51 #endif
52 #ifdef INT16_MAX
53   PRId16 PRIi16
54 #endif
55 #ifdef UINT16_MAX
56   PRIo16 PRIu16 PRIx16 PRIX16
57 #endif
58 #ifdef INT32_MAX
59   PRId32 PRIi32
60 #endif
61 #ifdef UINT32_MAX
62   PRIo32 PRIu32 PRIx32 PRIX32
63 #endif
64 #ifdef INT64_MAX
65   PRId64 PRIi64
66 #endif
67 #ifdef UINT64_MAX
68   PRIo64 PRIu64 PRIx64 PRIX64
69 #endif
70   PRIdLEAST8 PRIiLEAST8 PRIoLEAST8 PRIuLEAST8 PRIxLEAST8 PRIXLEAST8
71   PRIdLEAST16 PRIiLEAST16 PRIoLEAST16 PRIuLEAST16 PRIxLEAST16 PRIXLEAST16
72   PRIdLEAST32 PRIiLEAST32 PRIoLEAST32 PRIuLEAST32 PRIxLEAST32 PRIXLEAST32
73   PRIdLEAST64 PRIiLEAST64
74   PRIoLEAST64 PRIuLEAST64 PRIxLEAST64 PRIXLEAST64
75   PRIdFAST8 PRIiFAST8 PRIoFAST8 PRIuFAST8 PRIxFAST8 PRIXFAST8
76   PRIdFAST16 PRIiFAST16 PRIoFAST16 PRIuFAST16 PRIxFAST16 PRIXFAST16
77   PRIdFAST32 PRIiFAST32 PRIoFAST32 PRIuFAST32 PRIxFAST32 PRIXFAST32
78   PRIdFAST64 PRIiFAST64
79   PRIoFAST64 PRIuFAST64 PRIxFAST64 PRIXFAST64
80   PRIdMAX PRIiMAX PRIoMAX PRIuMAX PRIxMAX PRIXMAX
81 #ifdef INTPTR_MAX
82   PRIdPTR PRIiPTR
83 #endif
84 #ifdef UINTPTR_MAX
85   PRIoPTR PRIuPTR PRIxPTR PRIXPTR
86 #endif
87   ;
88 const char *l = /* implicit string concatenation */
89 #ifdef INT8_MAX
90   SCNd8 SCNi8
91 #endif
92 #ifdef UINT8_MAX
93   SCNo8 SCNu8 SCNx8
94 #endif
95 #ifdef INT16_MAX
96   SCNd16 SCNi16
97 #endif
98 #ifdef UINT16_MAX
99   SCNo16 SCNu16 SCNx16
100 #endif
101 #ifdef INT32_MAX
102   SCNd32 SCNi32
103 #endif
104 #ifdef UINT32_MAX
105   SCNo32 SCNu32 SCNx32
106 #endif
107 #ifdef INT64_MAX
108   SCNd64 SCNi64
109 #endif
110 #ifdef UINT64_MAX
111   SCNo64 SCNu64 SCNx64
112 #endif
113   SCNdLEAST8 SCNiLEAST8 SCNoLEAST8 SCNuLEAST8 SCNxLEAST8
114   SCNdLEAST16 SCNiLEAST16 SCNoLEAST16 SCNuLEAST16 SCNxLEAST16
115   SCNdLEAST32 SCNiLEAST32 SCNoLEAST32 SCNuLEAST32 SCNxLEAST32
116   SCNdLEAST64 SCNiLEAST64
117   SCNoLEAST64 SCNuLEAST64 SCNxLEAST64
118   SCNdFAST8 SCNiFAST8 SCNoFAST8 SCNuFAST8 SCNxFAST8
119   SCNdFAST16 SCNiFAST16 SCNoFAST16 SCNuFAST16 SCNxFAST16
120   SCNdFAST32 SCNiFAST32 SCNoFAST32 SCNuFAST32 SCNxFAST32
121   SCNdFAST64 SCNiFAST64
122   SCNoFAST64 SCNuFAST64 SCNxFAST64
123   SCNdMAX SCNiMAX SCNoMAX SCNuMAX SCNxMAX
124 #ifdef INTPTR_MAX
125   SCNdPTR SCNiPTR
126 #endif
127 #ifdef UINTPTR_MAX
128   SCNoPTR SCNuPTR SCNxPTR
129 #endif
130   ;
131       ])],
132       [gl_cv_header_working_inttypes_h=yes])
133   fi
134   if test $gl_cv_header_working_inttypes_h = yes; then
135     dnl Use the existing <inttypes.h>.
136     INTTYPES_H=''
137   else
138
139     dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
140     if test $ac_cv_header_inttypes_h = yes; then
141       gl_ABSOLUTE_HEADER([inttypes.h])
142       ABSOLUTE_INTTYPES_H=\"$gl_cv_absolute_inttypes_h\"
143     else
144       ABSOLUTE_INTTYPES_H=\"no/such/file/inttypes.h\"
145     fi
146     AC_SUBST([ABSOLUTE_INTTYPES_H])
147
148     PRIPTR_PREFIX=
149     if test -n "$STDINT_H"; then
150       dnl Using the gnulib <stdint.h>. It always defines intptr_t to 'long'.
151       PRIPTR_PREFIX='"l"'
152     else
153       dnl Using the system's <stdint.h>.
154       for glpfx in '' l ll I64; do
155         case $glpfx in
156           '')  gltype1='int';;
157           l)   gltype1='long int';;
158           ll)  gltype1='long long int';;
159           I64) gltype1='__int64';;
160         esac
161         AC_COMPILE_IFELSE(
162           [AC_LANG_PROGRAM([#include <stdint.h>
163              extern intptr_t foo;
164              extern $gltype1 foo;])],
165           [PRIPTR_PREFIX='"'$glpfx'"'])
166         test -n "$PRIPTR_PREFIX" && break
167       done
168     fi
169     AC_SUBST([PRIPTR_PREFIX])
170
171     if test "$ac_cv_have_decl_imaxabs" = yes; then
172       HAVE_DECL_IMAXABS=1
173     else
174       HAVE_DECL_IMAXABS=0
175     fi
176     AC_SUBST([HAVE_DECL_IMAXABS])
177
178     if test "$ac_cv_have_decl_imaxdiv" = yes; then
179       HAVE_DECL_IMAXDIV=1
180     else
181       HAVE_DECL_IMAXDIV=0
182     fi
183     AC_SUBST([HAVE_DECL_IMAXDIV])
184
185     if test "$ac_cv_have_decl_strtoimax" = yes; then
186       HAVE_DECL_STRTOIMAX=1
187     else
188       HAVE_DECL_STRTOIMAX=0
189     fi
190     AC_SUBST([HAVE_DECL_STRTOIMAX])
191
192     if test "$ac_cv_have_decl_strtoumax" = yes; then
193       HAVE_DECL_STRTOUMAX=1
194     else
195       HAVE_DECL_STRTOUMAX=0
196     fi
197     AC_SUBST([HAVE_DECL_STRTOUMAX])
198
199     INTTYPES_H='inttypes.h'
200   fi
201   AC_SUBST(INTTYPES_H)
202 ])