1# inttypes.m4 serial 36 2dnl Copyright (C) 2006-2022 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_ONCE([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 AC_REQUIRE([AC_C_RESTRICT]) 33]) 34 35# Ensure that the PRI* and SCN* macros are defined appropriately. 36AC_DEFUN([gl_INTTYPES_PRI_SCN], 37[ 38 PRIPTR_PREFIX= 39 if $GL_GENERATE_STDINT_H; then 40 dnl Using the gnulib <stdint.h>. It defines intptr_t to 'long' or 41 dnl 'long long', depending on _WIN64. 42 AC_COMPILE_IFELSE( 43 [AC_LANG_PROGRAM([[ 44 #ifdef _WIN64 45 LLP64 46 #endif 47 ]]) 48 ], 49 [PRIPTR_PREFIX='"l"'], 50 [PRIPTR_PREFIX='"ll"']) 51 else 52 dnl Using the system's <stdint.h>. 53 for glpfx in '' l ll I64; do 54 case $glpfx in 55 '') gltype1='int';; 56 l) gltype1='long int';; 57 ll) gltype1='long long int';; 58 I64) gltype1='__int64';; 59 esac 60 AC_COMPILE_IFELSE( 61 [AC_LANG_PROGRAM([[#include <stdint.h> 62 extern intptr_t foo; 63 extern $gltype1 foo;]])], 64 [PRIPTR_PREFIX='"'$glpfx'"']) 65 test -n "$PRIPTR_PREFIX" && break 66 done 67 fi 68 AC_SUBST([PRIPTR_PREFIX]) 69 70 gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( 71 [INT32_MAX_LT_INTMAX_MAX], 72 [defined INT32_MAX && defined INTMAX_MAX], 73 [INT32_MAX < INTMAX_MAX], 74 [sizeof (int) < sizeof (long long int)]) 75 if test $APPLE_UNIVERSAL_BUILD = 0; then 76 gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( 77 [INT64_MAX_EQ_LONG_MAX], 78 [defined INT64_MAX], 79 [INT64_MAX == LONG_MAX], 80 [sizeof (long long int) == sizeof (long int)]) 81 else 82 INT64_MAX_EQ_LONG_MAX=-1 83 fi 84 gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( 85 [UINT32_MAX_LT_UINTMAX_MAX], 86 [defined UINT32_MAX && defined UINTMAX_MAX], 87 [UINT32_MAX < UINTMAX_MAX], 88 [sizeof (unsigned int) < sizeof (unsigned long long int)]) 89 if test $APPLE_UNIVERSAL_BUILD = 0; then 90 gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( 91 [UINT64_MAX_EQ_ULONG_MAX], 92 [defined UINT64_MAX], 93 [UINT64_MAX == ULONG_MAX], 94 [sizeof (unsigned long long int) == sizeof (unsigned long int)]) 95 else 96 UINT64_MAX_EQ_ULONG_MAX=-1 97 fi 98]) 99 100# Define the symbol $1 to be 1 if the condition is true, 0 otherwise. 101# If $2 is true, the condition is $3; otherwise if long long int is supported 102# approximate the condition with $4; otherwise, assume the condition is false. 103# The condition should work on all C99 platforms; the approximations should be 104# good enough to work on all practical pre-C99 platforms. 105# $2 is evaluated by the C preprocessor, $3 and $4 as compile-time constants. 106AC_DEFUN([gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION], 107[ 108 AC_CACHE_CHECK([whether $3], 109 [gl_cv_test_$1], 110 [AC_COMPILE_IFELSE( 111 [AC_LANG_PROGRAM( 112 [[/* Work also in C++ mode. */ 113 #define __STDC_LIMIT_MACROS 1 114 115 /* Work if build is not clean. */ 116 #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 117 118 #include <limits.h> 119 #if HAVE_STDINT_H 120 #include <stdint.h> 121 #endif 122 123 #if $2 124 #define CONDITION ($3) 125 #else 126 #define CONDITION ($4) 127 #endif 128 int test[CONDITION ? 1 : -1];]])], 129 [gl_cv_test_$1=yes], 130 [gl_cv_test_$1=no])]) 131 if test $gl_cv_test_$1 = yes; then 132 $1=1; 133 else 134 $1=0; 135 fi 136 AC_SUBST([$1]) 137]) 138 139# gl_INTTYPES_MODULE_INDICATOR([modulename]) 140# sets the shell variable that indicates the presence of the given module 141# to a C preprocessor expression that will evaluate to 1. 142# This macro invocation must not occur in macros that are AC_REQUIREd. 143AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR], 144[ 145 dnl Ensure to expand the default settings once only. 146 gl_INTTYPES_H_REQUIRE_DEFAULTS 147 gl_MODULE_INDICATOR_SET_VARIABLE([$1]) 148]) 149 150# Initializes the default values for AC_SUBSTed shell variables. 151# This macro must not be AC_REQUIREd. It must only be invoked, and only 152# outside of macros or in macros that are not AC_REQUIREd. 153AC_DEFUN([gl_INTTYPES_H_REQUIRE_DEFAULTS], 154[ 155 m4_defun(GL_MODULE_INDICATOR_PREFIX[_INTTYPES_H_MODULE_INDICATOR_DEFAULTS], [ 156 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IMAXABS]) 157 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_IMAXDIV]) 158 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOIMAX]) 159 gl_MODULE_INDICATOR_INIT_VARIABLE([GNULIB_STRTOUMAX]) 160 ]) 161 m4_require(GL_MODULE_INDICATOR_PREFIX[_INTTYPES_H_MODULE_INDICATOR_DEFAULTS]) 162 AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) 163]) 164 165AC_DEFUN([gl_INTTYPES_H_DEFAULTS], 166[ 167 dnl Assume proper GNU behavior unless another module says otherwise. 168 HAVE_DECL_IMAXABS=1; AC_SUBST([HAVE_DECL_IMAXABS]) 169 HAVE_DECL_IMAXDIV=1; AC_SUBST([HAVE_DECL_IMAXDIV]) 170 HAVE_DECL_STRTOIMAX=1; AC_SUBST([HAVE_DECL_STRTOIMAX]) 171 HAVE_DECL_STRTOUMAX=1; AC_SUBST([HAVE_DECL_STRTOUMAX]) 172 HAVE_IMAXDIV_T=1; AC_SUBST([HAVE_IMAXDIV_T]) 173 REPLACE_STRTOIMAX=0; AC_SUBST([REPLACE_STRTOIMAX]) 174 REPLACE_STRTOUMAX=0; AC_SUBST([REPLACE_STRTOUMAX]) 175 INT32_MAX_LT_INTMAX_MAX=1; AC_SUBST([INT32_MAX_LT_INTMAX_MAX]) 176 INT64_MAX_EQ_LONG_MAX='defined _LP64'; AC_SUBST([INT64_MAX_EQ_LONG_MAX]) 177 PRIPTR_PREFIX=__PRIPTR_PREFIX; AC_SUBST([PRIPTR_PREFIX]) 178 UINT32_MAX_LT_UINTMAX_MAX=1; AC_SUBST([UINT32_MAX_LT_UINTMAX_MAX]) 179 UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; AC_SUBST([UINT64_MAX_EQ_ULONG_MAX]) 180]) 181