1# inttypes.m4 serial 26 2dnl Copyright (C) 2006-2012 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_INTTYPES_INCOMPLETE]) 13 gl_INTTYPES_PRI_SCN 14]) 15 16AC_DEFUN_ONCE([gl_INTTYPES_INCOMPLETE], 17[ 18 AC_REQUIRE([gl_STDINT_H]) 19 AC_CHECK_HEADERS_ONCE([inttypes.h]) 20 21 dnl Override <inttypes.h> always, so that the portability warnings work. 22 AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) 23 gl_CHECK_NEXT_HEADERS([inttypes.h]) 24 25 AC_REQUIRE([gl_MULTIARCH]) 26 27 dnl Check for declarations of anything we want to poison if the 28 dnl corresponding gnulib module is not in use. 29 gl_WARN_ON_USE_PREPARE([[#include <inttypes.h> 30 ]], [imaxabs imaxdiv strtoimax strtoumax]) 31]) 32 33# Ensure that the PRI* and SCN* macros are defined appropriately. 34AC_DEFUN([gl_INTTYPES_PRI_SCN], 35[ 36 AC_REQUIRE([gt_INTTYPES_PRI]) 37 38 PRIPTR_PREFIX= 39 if test -n "$STDINT_H"; then 40 dnl Using the gnulib <stdint.h>. It always defines intptr_t to 'long'. 41 PRIPTR_PREFIX='"l"' 42 else 43 dnl Using the system's <stdint.h>. 44 for glpfx in '' l ll I64; do 45 case $glpfx in 46 '') gltype1='int';; 47 l) gltype1='long int';; 48 ll) gltype1='long long int';; 49 I64) gltype1='__int64';; 50 esac 51 AC_COMPILE_IFELSE( 52 [AC_LANG_PROGRAM([[#include <stdint.h> 53 extern intptr_t foo; 54 extern $gltype1 foo;]])], 55 [PRIPTR_PREFIX='"'$glpfx'"']) 56 test -n "$PRIPTR_PREFIX" && break 57 done 58 fi 59 AC_SUBST([PRIPTR_PREFIX]) 60 61 gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( 62 [INT32_MAX_LT_INTMAX_MAX], 63 [defined INT32_MAX && defined INTMAX_MAX], 64 [INT32_MAX < INTMAX_MAX], 65 [sizeof (int) < sizeof (long long int)]) 66 if test $APPLE_UNIVERSAL_BUILD = 0; then 67 gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( 68 [INT64_MAX_EQ_LONG_MAX], 69 [defined INT64_MAX], 70 [INT64_MAX == LONG_MAX], 71 [sizeof (long long int) == sizeof (long int)]) 72 else 73 INT64_MAX_EQ_LONG_MAX=-1 74 fi 75 gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( 76 [UINT32_MAX_LT_UINTMAX_MAX], 77 [defined UINT32_MAX && defined UINTMAX_MAX], 78 [UINT32_MAX < UINTMAX_MAX], 79 [sizeof (unsigned int) < sizeof (unsigned long long int)]) 80 if test $APPLE_UNIVERSAL_BUILD = 0; then 81 gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( 82 [UINT64_MAX_EQ_ULONG_MAX], 83 [defined UINT64_MAX], 84 [UINT64_MAX == ULONG_MAX], 85 [sizeof (unsigned long long int) == sizeof (unsigned long int)]) 86 else 87 UINT64_MAX_EQ_ULONG_MAX=-1 88 fi 89]) 90 91# Define the symbol $1 to be 1 if the condition is true, 0 otherwise. 92# If $2 is true, the condition is $3; otherwise if long long int is supported 93# approximate the condition with $4; otherwise, assume the condition is false. 94# The condition should work on all C99 platforms; the approximations should be 95# good enough to work on all practical pre-C99 platforms. 96# $2 is evaluated by the C preprocessor, $3 and $4 as compile-time constants. 97AC_DEFUN([gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION], 98[ 99 AC_CACHE_CHECK([whether $3], 100 [gl_cv_test_$1], 101 [AC_COMPILE_IFELSE( 102 [AC_LANG_PROGRAM( 103 [[/* Work also in C++ mode. */ 104 #define __STDC_LIMIT_MACROS 1 105 106 /* Work if build is not clean. */ 107 #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 108 109 #include <limits.h> 110 #if HAVE_STDINT_H 111 #include <stdint.h> 112 #endif 113 114 #if $2 115 #define CONDITION ($3) 116 #elif HAVE_LONG_LONG_INT 117 #define CONDITION ($4) 118 #else 119 #define CONDITION 0 120 #endif 121 int test[CONDITION ? 1 : -1];]])], 122 [gl_cv_test_$1=yes], 123 [gl_cv_test_$1=no])]) 124 if test $gl_cv_test_$1 = yes; then 125 $1=1; 126 else 127 $1=0; 128 fi 129 AC_SUBST([$1]) 130]) 131 132AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR], 133[ 134 dnl Use AC_REQUIRE here, so that the default settings are expanded once only. 135 AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) 136 gl_MODULE_INDICATOR_SET_VARIABLE([$1]) 137]) 138 139AC_DEFUN([gl_INTTYPES_H_DEFAULTS], 140[ 141 GNULIB_IMAXABS=0; AC_SUBST([GNULIB_IMAXABS]) 142 GNULIB_IMAXDIV=0; AC_SUBST([GNULIB_IMAXDIV]) 143 GNULIB_STRTOIMAX=0; AC_SUBST([GNULIB_STRTOIMAX]) 144 GNULIB_STRTOUMAX=0; AC_SUBST([GNULIB_STRTOUMAX]) 145 dnl Assume proper GNU behavior unless another module says otherwise. 146 HAVE_DECL_IMAXABS=1; AC_SUBST([HAVE_DECL_IMAXABS]) 147 HAVE_DECL_IMAXDIV=1; AC_SUBST([HAVE_DECL_IMAXDIV]) 148 HAVE_DECL_STRTOIMAX=1; AC_SUBST([HAVE_DECL_STRTOIMAX]) 149 HAVE_DECL_STRTOUMAX=1; AC_SUBST([HAVE_DECL_STRTOUMAX]) 150 REPLACE_STRTOIMAX=0; AC_SUBST([REPLACE_STRTOIMAX]) 151 INT32_MAX_LT_INTMAX_MAX=1; AC_SUBST([INT32_MAX_LT_INTMAX_MAX]) 152 INT64_MAX_EQ_LONG_MAX='defined _LP64'; AC_SUBST([INT64_MAX_EQ_LONG_MAX]) 153 PRI_MACROS_BROKEN=0; AC_SUBST([PRI_MACROS_BROKEN]) 154 PRIPTR_PREFIX=__PRIPTR_PREFIX; AC_SUBST([PRIPTR_PREFIX]) 155 UINT32_MAX_LT_UINTMAX_MAX=1; AC_SUBST([UINT32_MAX_LT_UINTMAX_MAX]) 156 UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; AC_SUBST([UINT64_MAX_EQ_ULONG_MAX]) 157]) 158