d7f021c84863fdaa00d8dc2fddeea48090b8dac8
[gnulib.git] / m4 / inttypes.m4
1 # inttypes.m4 serial 3
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 #ifdef INT64_MAX
64   PRId64 PRIi64
65 #endif
66 #ifdef UINT64_MAX
67   PRIo64 PRIu64 PRIx64 PRIX64
68 #endif
69   PRIdLEAST8 PRIiLEAST8 PRIoLEAST8 PRIuLEAST8 PRIxLEAST8 PRIXLEAST8
70   PRIdLEAST16 PRIiLEAST16 PRIoLEAST16 PRIuLEAST16 PRIxLEAST16 PRIXLEAST16
71   PRIdLEAST32 PRIiLEAST32 PRIoLEAST32 PRIuLEAST32 PRIxLEAST32 PRIXLEAST32
72   PRIdLEAST64 PRIiLEAST64
73   PRIoLEAST64 PRIuLEAST64 PRIxLEAST64 PRIXLEAST64
74   PRIdFAST8 PRIiFAST8 PRIoFAST8 PRIuFAST8 PRIxFAST8 PRIXFAST8
75   PRIdFAST16 PRIiFAST16 PRIoFAST16 PRIuFAST16 PRIxFAST16 PRIXFAST16
76   PRIdFAST32 PRIiFAST32 PRIoFAST32 PRIuFAST32 PRIxFAST32 PRIXFAST32
77   PRIdFAST64 PRIiFAST64
78   PRIoFAST64 PRIuFAST64 PRIxFAST64 PRIXFAST64
79   PRIdMAX PRIiMAX PRIoMAX PRIuMAX PRIxMAX PRIXMAX
80 #ifdef INTPTR_MAX
81   PRIdPTR PRIiPTR
82 #endif
83 #ifdef UINTPTR_MAX
84   PRIoPTR PRIuPTR PRIxPTR PRIXPTR
85 #endif
86   ;
87 const char *l = /* implicit string concatenation */
88 #ifdef INT8_MAX
89   SCNd8 SCNi8
90 #endif
91 #ifdef UINT8_MAX
92   SCNo8 SCNu8 SCNx8
93 #endif
94 #ifdef INT16_MAX
95   SCNd16 SCNi16
96 #endif
97 #ifdef UINT16_MAX
98   SCNo16 SCNu16 SCNx16
99 #endif
100 #ifdef INT32_MAX
101   SCNd32 SCNi32
102 #endif
103 #ifdef UINT32_MAX
104   SCNo32 SCNu32 SCNx32
105 #endif
106 #ifdef INT64_MAX
107   SCNd64 SCNi64
108 #endif
109 #ifdef UINT64_MAX
110   SCNo64 SCNu64 SCNx64
111 #endif
112   SCNdLEAST8 SCNiLEAST8 SCNoLEAST8 SCNuLEAST8 SCNxLEAST8
113   SCNdLEAST16 SCNiLEAST16 SCNoLEAST16 SCNuLEAST16 SCNxLEAST16
114   SCNdLEAST32 SCNiLEAST32 SCNoLEAST32 SCNuLEAST32 SCNxLEAST32
115   SCNdLEAST64 SCNiLEAST64
116   SCNoLEAST64 SCNuLEAST64 SCNxLEAST64
117   SCNdFAST8 SCNiFAST8 SCNoFAST8 SCNuFAST8 SCNxFAST8
118   SCNdFAST16 SCNiFAST16 SCNoFAST16 SCNuFAST16 SCNxFAST16
119   SCNdFAST32 SCNiFAST32 SCNoFAST32 SCNuFAST32 SCNxFAST32
120   SCNdFAST64 SCNiFAST64
121   SCNoFAST64 SCNuFAST64 SCNxFAST64
122   SCNdMAX SCNiMAX SCNoMAX SCNuMAX SCNxMAX
123 #ifdef INTPTR_MAX
124   SCNdPTR SCNiPTR
125 #endif
126 #ifdef UINTPTR_MAX
127   SCNoPTR SCNuPTR SCNxPTR
128 #endif
129   ;
130       ])],
131       [gl_cv_header_working_inttypes_h=yes])
132   fi
133   if test $gl_cv_header_working_inttypes_h = yes; then
134     dnl Use the existing <inttypes.h>.
135     INTTYPES_H=''
136   else
137
138     dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
139     if test $ac_cv_header_inttypes_h = yes; then
140       gl_ABSOLUTE_HEADER([inttypes.h])
141       ABSOLUTE_INTTYPES_H=\"$gl_cv_absolute_inttypes_h\"
142     else
143       ABSOLUTE_INTTYPES_H=\"no/such/file/inttypes.h\"
144     fi
145     AC_SUBST([ABSOLUTE_INTTYPES_H])
146
147     PRIPTR_PREFIX=
148     if test -n "$STDINT_H"; then
149       dnl Using the gnulib <stdint.h>. It always defines intptr_t to 'long'.
150       PRIPTR_PREFIX='"l"'
151     else
152       dnl Using the system's <stdint.h>.
153       for glpfx in '' l ll I64; do
154         case $glpfx in
155           '')  gltype1='int';;
156           l)   gltype1='long int';;
157           ll)  gltype1='long long int';;
158           I64) gltype1='__int64';;
159         esac
160         AC_COMPILE_IFELSE(
161           [AC_LANG_PROGRAM([#include <stdint.h>
162              extern intptr_t foo;
163              extern $gltype1 foo;])],
164           [PRIPTR_PREFIX='"'$glpfx'"'])
165         test -n "$PRIPTR_PREFIX" && break
166       done
167     fi
168     AC_SUBST([PRIPTR_PREFIX])
169
170     if test "$ac_cv_have_decl_imaxabs" = yes; then
171       HAVE_DECL_IMAXABS=1
172     else
173       HAVE_DECL_IMAXABS=0
174     fi
175     AC_SUBST([HAVE_DECL_IMAXABS])
176
177     if test "$ac_cv_have_decl_imaxdiv" = yes; then
178       HAVE_DECL_IMAXDIV=1
179     else
180       HAVE_DECL_IMAXDIV=0
181     fi
182     AC_SUBST([HAVE_DECL_IMAXDIV])
183
184     if test "$ac_cv_have_decl_strtoimax" = yes; then
185       HAVE_DECL_STRTOIMAX=1
186     else
187       HAVE_DECL_STRTOIMAX=0
188     fi
189     AC_SUBST([HAVE_DECL_STRTOIMAX])
190
191     if test "$ac_cv_have_decl_strtoumax" = yes; then
192       HAVE_DECL_STRTOUMAX=1
193     else
194       HAVE_DECL_STRTOUMAX=0
195     fi
196     AC_SUBST([HAVE_DECL_STRTOUMAX])
197
198     INTTYPES_H='inttypes.h'
199   fi
200   AC_SUBST(INTTYPES_H)
201 ])