Blame m4/stdint.m4

Packit 33f14e
# stdint.m4 serial 50
Packit 33f14e
dnl Copyright (C) 2001-2017 Free Software Foundation, Inc.
Packit 33f14e
dnl This file is free software; the Free Software Foundation
Packit 33f14e
dnl gives unlimited permission to copy and/or distribute it,
Packit 33f14e
dnl with or without modifications, as long as this notice is preserved.
Packit 33f14e
Packit 33f14e
dnl From Paul Eggert and Bruno Haible.
Packit 33f14e
dnl Test whether <stdint.h> is supported or must be substituted.
Packit 33f14e
Packit 33f14e
AC_DEFUN_ONCE([gl_STDINT_H],
Packit 33f14e
[
Packit 33f14e
  AC_PREREQ([2.59])dnl
Packit 33f14e
Packit 33f14e
  AC_REQUIRE([gl_LIMITS_H])
Packit 33f14e
  AC_REQUIRE([gt_TYPE_WINT_T])
Packit 33f14e
Packit 33f14e
  dnl Check for long long int and unsigned long long int.
Packit 33f14e
  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])
Packit 33f14e
  if test $ac_cv_type_long_long_int = yes; then
Packit 33f14e
    HAVE_LONG_LONG_INT=1
Packit 33f14e
  else
Packit 33f14e
    HAVE_LONG_LONG_INT=0
Packit 33f14e
  fi
Packit 33f14e
  AC_SUBST([HAVE_LONG_LONG_INT])
Packit 33f14e
  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
Packit 33f14e
  if test $ac_cv_type_unsigned_long_long_int = yes; then
Packit 33f14e
    HAVE_UNSIGNED_LONG_LONG_INT=1
Packit 33f14e
  else
Packit 33f14e
    HAVE_UNSIGNED_LONG_LONG_INT=0
Packit 33f14e
  fi
Packit 33f14e
  AC_SUBST([HAVE_UNSIGNED_LONG_LONG_INT])
Packit 33f14e
Packit 33f14e
  dnl Check for <wchar.h>, in the same way as gl_WCHAR_H does.
Packit 33f14e
  AC_CHECK_HEADERS_ONCE([wchar.h])
Packit 33f14e
  if test $ac_cv_header_wchar_h = yes; then
Packit 33f14e
    HAVE_WCHAR_H=1
Packit 33f14e
  else
Packit 33f14e
    HAVE_WCHAR_H=0
Packit 33f14e
  fi
Packit 33f14e
  AC_SUBST([HAVE_WCHAR_H])
Packit 33f14e
Packit 33f14e
  dnl Check for <inttypes.h>.
Packit 33f14e
  dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
Packit 33f14e
  if test $ac_cv_header_inttypes_h = yes; then
Packit 33f14e
    HAVE_INTTYPES_H=1
Packit 33f14e
  else
Packit 33f14e
    HAVE_INTTYPES_H=0
Packit 33f14e
  fi
Packit 33f14e
  AC_SUBST([HAVE_INTTYPES_H])
Packit 33f14e
Packit 33f14e
  dnl Check for <sys/types.h>.
Packit 33f14e
  dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_sys_types_h.
Packit 33f14e
  if test $ac_cv_header_sys_types_h = yes; then
Packit 33f14e
    HAVE_SYS_TYPES_H=1
Packit 33f14e
  else
Packit 33f14e
    HAVE_SYS_TYPES_H=0
Packit 33f14e
  fi
Packit 33f14e
  AC_SUBST([HAVE_SYS_TYPES_H])
Packit 33f14e
Packit 33f14e
  gl_CHECK_NEXT_HEADERS([stdint.h])
Packit 33f14e
  if test $ac_cv_header_stdint_h = yes; then
Packit 33f14e
    HAVE_STDINT_H=1
Packit 33f14e
  else
Packit 33f14e
    HAVE_STDINT_H=0
Packit 33f14e
  fi
Packit 33f14e
  AC_SUBST([HAVE_STDINT_H])
Packit 33f14e
Packit 33f14e
  dnl Now see whether we need a substitute <stdint.h>.
Packit 33f14e
  if test $ac_cv_header_stdint_h = yes; then
Packit 33f14e
    AC_CACHE_CHECK([whether stdint.h conforms to C99],
Packit 33f14e
      [gl_cv_header_working_stdint_h],
Packit 33f14e
      [gl_cv_header_working_stdint_h=no
Packit 33f14e
       AC_COMPILE_IFELSE([
Packit 33f14e
         AC_LANG_PROGRAM([[
Packit 33f14e
#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
Packit 33f14e
#define __STDC_CONSTANT_MACROS 1
Packit 33f14e
#define __STDC_LIMIT_MACROS 1
Packit 33f14e
#include <stdint.h>
Packit 33f14e
/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>.  */
Packit 33f14e
#if !(defined WCHAR_MIN && defined WCHAR_MAX)
Packit 33f14e
#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
Packit 33f14e
#endif
Packit 33f14e
]
Packit 33f14e
gl_STDINT_INCLUDES
Packit 33f14e
[
Packit 33f14e
#ifdef INT8_MAX
Packit 33f14e
int8_t a1 = INT8_MAX;
Packit 33f14e
int8_t a1min = INT8_MIN;
Packit 33f14e
#endif
Packit 33f14e
#ifdef INT16_MAX
Packit 33f14e
int16_t a2 = INT16_MAX;
Packit 33f14e
int16_t a2min = INT16_MIN;
Packit 33f14e
#endif
Packit 33f14e
#ifdef INT32_MAX
Packit 33f14e
int32_t a3 = INT32_MAX;
Packit 33f14e
int32_t a3min = INT32_MIN;
Packit 33f14e
#endif
Packit 33f14e
#ifdef INT64_MAX
Packit 33f14e
int64_t a4 = INT64_MAX;
Packit 33f14e
int64_t a4min = INT64_MIN;
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT8_MAX
Packit 33f14e
uint8_t b1 = UINT8_MAX;
Packit 33f14e
#else
Packit 33f14e
typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT16_MAX
Packit 33f14e
uint16_t b2 = UINT16_MAX;
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT32_MAX
Packit 33f14e
uint32_t b3 = UINT32_MAX;
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT64_MAX
Packit 33f14e
uint64_t b4 = UINT64_MAX;
Packit 33f14e
#endif
Packit 33f14e
int_least8_t c1 = INT8_C (0x7f);
Packit 33f14e
int_least8_t c1max = INT_LEAST8_MAX;
Packit 33f14e
int_least8_t c1min = INT_LEAST8_MIN;
Packit 33f14e
int_least16_t c2 = INT16_C (0x7fff);
Packit 33f14e
int_least16_t c2max = INT_LEAST16_MAX;
Packit 33f14e
int_least16_t c2min = INT_LEAST16_MIN;
Packit 33f14e
int_least32_t c3 = INT32_C (0x7fffffff);
Packit 33f14e
int_least32_t c3max = INT_LEAST32_MAX;
Packit 33f14e
int_least32_t c3min = INT_LEAST32_MIN;
Packit 33f14e
int_least64_t c4 = INT64_C (0x7fffffffffffffff);
Packit 33f14e
int_least64_t c4max = INT_LEAST64_MAX;
Packit 33f14e
int_least64_t c4min = INT_LEAST64_MIN;
Packit 33f14e
uint_least8_t d1 = UINT8_C (0xff);
Packit 33f14e
uint_least8_t d1max = UINT_LEAST8_MAX;
Packit 33f14e
uint_least16_t d2 = UINT16_C (0xffff);
Packit 33f14e
uint_least16_t d2max = UINT_LEAST16_MAX;
Packit 33f14e
uint_least32_t d3 = UINT32_C (0xffffffff);
Packit 33f14e
uint_least32_t d3max = UINT_LEAST32_MAX;
Packit 33f14e
uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
Packit 33f14e
uint_least64_t d4max = UINT_LEAST64_MAX;
Packit 33f14e
int_fast8_t e1 = INT_FAST8_MAX;
Packit 33f14e
int_fast8_t e1min = INT_FAST8_MIN;
Packit 33f14e
int_fast16_t e2 = INT_FAST16_MAX;
Packit 33f14e
int_fast16_t e2min = INT_FAST16_MIN;
Packit 33f14e
int_fast32_t e3 = INT_FAST32_MAX;
Packit 33f14e
int_fast32_t e3min = INT_FAST32_MIN;
Packit 33f14e
int_fast64_t e4 = INT_FAST64_MAX;
Packit 33f14e
int_fast64_t e4min = INT_FAST64_MIN;
Packit 33f14e
uint_fast8_t f1 = UINT_FAST8_MAX;
Packit 33f14e
uint_fast16_t f2 = UINT_FAST16_MAX;
Packit 33f14e
uint_fast32_t f3 = UINT_FAST32_MAX;
Packit 33f14e
uint_fast64_t f4 = UINT_FAST64_MAX;
Packit 33f14e
#ifdef INTPTR_MAX
Packit 33f14e
intptr_t g = INTPTR_MAX;
Packit 33f14e
intptr_t gmin = INTPTR_MIN;
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINTPTR_MAX
Packit 33f14e
uintptr_t h = UINTPTR_MAX;
Packit 33f14e
#endif
Packit 33f14e
intmax_t i = INTMAX_MAX;
Packit 33f14e
uintmax_t j = UINTMAX_MAX;
Packit 33f14e
Packit 33f14e
/* Check that SIZE_MAX has the correct type, if possible.  */
Packit 33f14e
#if 201112 <= __STDC_VERSION__
Packit 33f14e
int k = _Generic (SIZE_MAX, size_t: 0);
Packit 33f14e
#elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \
Packit 33f14e
       || (0x5110 <= __SUNPRO_C && !__STDC__))
Packit 33f14e
extern size_t k;
Packit 33f14e
extern __typeof__ (SIZE_MAX) k;
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
#include <limits.h> /* for CHAR_BIT */
Packit 33f14e
#define TYPE_MINIMUM(t) \
Packit 33f14e
  ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
Packit 33f14e
#define TYPE_MAXIMUM(t) \
Packit 33f14e
  ((t) ((t) 0 < (t) -1 \
Packit 33f14e
        ? (t) -1 \
Packit 33f14e
        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
Packit 33f14e
struct s {
Packit 33f14e
  int check_PTRDIFF:
Packit 33f14e
      PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
Packit 33f14e
      && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
Packit 33f14e
      ? 1 : -1;
Packit 33f14e
  /* Detect bug in FreeBSD 6.0 / ia64.  */
Packit 33f14e
  int check_SIG_ATOMIC:
Packit 33f14e
      SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
Packit 33f14e
      && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
Packit 33f14e
      ? 1 : -1;
Packit 33f14e
  int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
Packit 33f14e
  int check_WCHAR:
Packit 33f14e
      WCHAR_MIN == TYPE_MINIMUM (wchar_t)
Packit 33f14e
      && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
Packit 33f14e
      ? 1 : -1;
Packit 33f14e
  /* Detect bug in mingw.  */
Packit 33f14e
  int check_WINT:
Packit 33f14e
      WINT_MIN == TYPE_MINIMUM (wint_t)
Packit 33f14e
      && WINT_MAX == TYPE_MAXIMUM (wint_t)
Packit 33f14e
      ? 1 : -1;
Packit 33f14e
Packit 33f14e
  /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others.  */
Packit 33f14e
  int check_UINT8_C:
Packit 33f14e
        (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
Packit 33f14e
  int check_UINT16_C:
Packit 33f14e
        (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
Packit 33f14e
Packit 33f14e
  /* Detect bugs in OpenBSD 3.9 stdint.h.  */
Packit 33f14e
#ifdef UINT8_MAX
Packit 33f14e
  int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT16_MAX
Packit 33f14e
  int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT32_MAX
Packit 33f14e
  int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT64_MAX
Packit 33f14e
  int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
Packit 33f14e
#endif
Packit 33f14e
  int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
Packit 33f14e
  int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
Packit 33f14e
  int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
Packit 33f14e
  int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
Packit 33f14e
  int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
Packit 33f14e
  int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
Packit 33f14e
  int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
Packit 33f14e
  int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
Packit 33f14e
  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
Packit 33f14e
  int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
Packit 33f14e
  int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
Packit 33f14e
};
Packit 33f14e
         ]])],
Packit 33f14e
         [dnl Determine whether the various *_MIN, *_MAX macros are usable
Packit 33f14e
          dnl in preprocessor expression. We could do it by compiling a test
Packit 33f14e
          dnl program for each of these macros. It is faster to run a program
Packit 33f14e
          dnl that inspects the macro expansion.
Packit 33f14e
          dnl This detects a bug on HP-UX 11.23/ia64.
Packit 33f14e
          AC_RUN_IFELSE([
Packit 33f14e
            AC_LANG_PROGRAM([[
Packit 33f14e
#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
Packit 33f14e
#define __STDC_CONSTANT_MACROS 1
Packit 33f14e
#define __STDC_LIMIT_MACROS 1
Packit 33f14e
#include <stdint.h>
Packit 33f14e
]
Packit 33f14e
gl_STDINT_INCLUDES
Packit 33f14e
[
Packit 33f14e
#include <stdio.h>
Packit 33f14e
#include <string.h>
Packit 33f14e
#define MVAL(macro) MVAL1(macro)
Packit 33f14e
#define MVAL1(expression) #expression
Packit 33f14e
static const char *macro_values[] =
Packit 33f14e
  {
Packit 33f14e
#ifdef INT8_MAX
Packit 33f14e
    MVAL (INT8_MAX),
Packit 33f14e
#endif
Packit 33f14e
#ifdef INT16_MAX
Packit 33f14e
    MVAL (INT16_MAX),
Packit 33f14e
#endif
Packit 33f14e
#ifdef INT32_MAX
Packit 33f14e
    MVAL (INT32_MAX),
Packit 33f14e
#endif
Packit 33f14e
#ifdef INT64_MAX
Packit 33f14e
    MVAL (INT64_MAX),
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT8_MAX
Packit 33f14e
    MVAL (UINT8_MAX),
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT16_MAX
Packit 33f14e
    MVAL (UINT16_MAX),
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT32_MAX
Packit 33f14e
    MVAL (UINT32_MAX),
Packit 33f14e
#endif
Packit 33f14e
#ifdef UINT64_MAX
Packit 33f14e
    MVAL (UINT64_MAX),
Packit 33f14e
#endif
Packit 33f14e
    NULL
Packit 33f14e
  };
Packit 33f14e
]], [[
Packit 33f14e
  const char **mv;
Packit 33f14e
  for (mv = macro_values; *mv != NULL; mv++)
Packit 33f14e
    {
Packit 33f14e
      const char *value = *mv;
Packit 33f14e
      /* Test whether it looks like a cast expression.  */
Packit 33f14e
      if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
Packit 33f14e
          || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
Packit 33f14e
          || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
Packit 33f14e
          || strncmp (value, "((int)"/*)*/, 6) == 0
Packit 33f14e
          || strncmp (value, "((signed short)"/*)*/, 15) == 0
Packit 33f14e
          || strncmp (value, "((signed char)"/*)*/, 14) == 0)
Packit 33f14e
        return mv - macro_values + 1;
Packit 33f14e
    }
Packit 33f14e
  return 0;
Packit 33f14e
]])],
Packit 33f14e
              [gl_cv_header_working_stdint_h=yes],
Packit 33f14e
              [],
Packit 33f14e
              [dnl When cross-compiling, assume it works.
Packit 33f14e
               gl_cv_header_working_stdint_h=yes
Packit 33f14e
              ])
Packit 33f14e
         ])
Packit 33f14e
      ])
Packit 33f14e
  fi
Packit 33f14e
Packit 33f14e
  HAVE_C99_STDINT_H=0
Packit 33f14e
  HAVE_SYS_BITYPES_H=0
Packit 33f14e
  HAVE_SYS_INTTYPES_H=0
Packit 33f14e
  STDINT_H=stdint.h
Packit 33f14e
  if test "$gl_cv_header_working_stdint_h" = yes; then
Packit 33f14e
    HAVE_C99_STDINT_H=1
Packit 33f14e
    dnl Now see whether the system <stdint.h> works without
Packit 33f14e
    dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined.
Packit 33f14e
    AC_CACHE_CHECK([whether stdint.h predates C++11],
Packit 33f14e
      [gl_cv_header_stdint_predates_cxx11_h],
Packit 33f14e
      [gl_cv_header_stdint_predates_cxx11_h=yes
Packit 33f14e
       AC_COMPILE_IFELSE([
Packit 33f14e
         AC_LANG_PROGRAM([[
Packit 33f14e
#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
Packit 33f14e
#include <stdint.h>
Packit 33f14e
]
Packit 33f14e
gl_STDINT_INCLUDES
Packit 33f14e
[
Packit 33f14e
intmax_t im = INTMAX_MAX;
Packit 33f14e
int32_t i32 = INT32_C (0x7fffffff);
Packit 33f14e
         ]])],
Packit 33f14e
         [gl_cv_header_stdint_predates_cxx11_h=no])])
Packit 33f14e
Packit 33f14e
    if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then
Packit 33f14e
      AC_DEFINE([__STDC_CONSTANT_MACROS], [1],
Packit 33f14e
                [Define to 1 if the system <stdint.h> predates C++11.])
Packit 33f14e
      AC_DEFINE([__STDC_LIMIT_MACROS], [1],
Packit 33f14e
                [Define to 1 if the system <stdint.h> predates C++11.])
Packit 33f14e
    fi
Packit 33f14e
    AC_CACHE_CHECK([whether stdint.h has UINTMAX_WIDTH etc.],
Packit 33f14e
      [gl_cv_header_stdint_width],
Packit 33f14e
      [gl_cv_header_stdint_width=no
Packit 33f14e
       AC_COMPILE_IFELSE(
Packit 33f14e
         [AC_LANG_PROGRAM([[
Packit 33f14e
            /* Work if build is not clean.  */
Packit 33f14e
            #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
Packit 33f14e
            #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
Packit 33f14e
             #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
Packit 33f14e
            #endif
Packit 33f14e
            #include <stdint.h>
Packit 33f14e
            ]gl_STDINT_INCLUDES[
Packit 33f14e
            int iw = UINTMAX_WIDTH;
Packit 33f14e
            ]])],
Packit 33f14e
         [gl_cv_header_stdint_width=yes])])
Packit 33f14e
    if test "$gl_cv_header_stdint_width" = yes; then
Packit 33f14e
      STDINT_H=
Packit 33f14e
    fi
Packit 33f14e
  else
Packit 33f14e
    dnl Check for <sys/inttypes.h>, and for
Packit 33f14e
    dnl <sys/bitypes.h> (used in Linux libc4 >= 4.6.7 and libc5).
Packit 33f14e
    AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h])
Packit 33f14e
    if test $ac_cv_header_sys_inttypes_h = yes; then
Packit 33f14e
      HAVE_SYS_INTTYPES_H=1
Packit 33f14e
    fi
Packit 33f14e
    if test $ac_cv_header_sys_bitypes_h = yes; then
Packit 33f14e
      HAVE_SYS_BITYPES_H=1
Packit 33f14e
    fi
Packit 33f14e
    gl_STDINT_TYPE_PROPERTIES
Packit 33f14e
  fi
Packit 33f14e
Packit 33f14e
  dnl The substitute stdint.h needs the substitute limit.h's _GL_INTEGER_WIDTH.
Packit 33f14e
  LIMITS_H=limits.h
Packit 33f14e
  AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"])
Packit 33f14e
Packit 33f14e
  AC_SUBST([HAVE_C99_STDINT_H])
Packit 33f14e
  AC_SUBST([HAVE_SYS_BITYPES_H])
Packit 33f14e
  AC_SUBST([HAVE_SYS_INTTYPES_H])
Packit 33f14e
  AC_SUBST([STDINT_H])
Packit 33f14e
  AM_CONDITIONAL([GL_GENERATE_STDINT_H], [test -n "$STDINT_H"])
Packit 33f14e
])
Packit 33f14e
Packit 33f14e
dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES)
Packit 33f14e
dnl Determine the size of each of the given types in bits.
Packit 33f14e
AC_DEFUN([gl_STDINT_BITSIZEOF],
Packit 33f14e
[
Packit 33f14e
  dnl Use a shell loop, to avoid bloating configure, and
Packit 33f14e
  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
Packit 33f14e
  dnl   config.h.in,
Packit 33f14e
  dnl - extra AC_SUBST calls, so that the right substitutions are made.
Packit 33f14e
  m4_foreach_w([gltype], [$1],
Packit 33f14e
    [AH_TEMPLATE([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
Packit 33f14e
       [Define to the number of bits in type ']gltype['.])])
Packit 33f14e
  for gltype in $1 ; do
Packit 33f14e
    AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}],
Packit 33f14e
      [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT],
Packit 33f14e
         [$2
Packit 33f14e
#include <limits.h>], [result=unknown])
Packit 33f14e
       eval gl_cv_bitsizeof_${gltype}=\$result
Packit 33f14e
      ])
Packit 33f14e
    eval result=\$gl_cv_bitsizeof_${gltype}
Packit 33f14e
    if test $result = unknown; then
Packit 33f14e
      dnl Use a nonempty default, because some compilers, such as IRIX 5 cc,
Packit 33f14e
      dnl do a syntax check even on unused #if conditions and give an error
Packit 33f14e
      dnl on valid C code like this:
Packit 33f14e
      dnl   #if 0
Packit 33f14e
      dnl   # if  > 32
Packit 33f14e
      dnl   # endif
Packit 33f14e
      dnl   #endif
Packit 33f14e
      result=0
Packit 33f14e
    fi
Packit 33f14e
    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
Packit 33f14e
    AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result])
Packit 33f14e
    eval BITSIZEOF_${GLTYPE}=\$result
Packit 33f14e
  done
Packit 33f14e
  m4_foreach_w([gltype], [$1],
Packit 33f14e
    [AC_SUBST([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
Packit 33f14e
])
Packit 33f14e
Packit 33f14e
dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES)
Packit 33f14e
dnl Determine the signedness of each of the given types.
Packit 33f14e
dnl Define HAVE_SIGNED_TYPE if type is signed.
Packit 33f14e
AC_DEFUN([gl_CHECK_TYPES_SIGNED],
Packit 33f14e
[
Packit 33f14e
  dnl Use a shell loop, to avoid bloating configure, and
Packit 33f14e
  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
Packit 33f14e
  dnl   config.h.in,
Packit 33f14e
  dnl - extra AC_SUBST calls, so that the right substitutions are made.
Packit 33f14e
  m4_foreach_w([gltype], [$1],
Packit 33f14e
    [AH_TEMPLATE([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
Packit 33f14e
       [Define to 1 if ']gltype[' is a signed integer type.])])
Packit 33f14e
  for gltype in $1 ; do
Packit 33f14e
    AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed],
Packit 33f14e
      [AC_COMPILE_IFELSE(
Packit 33f14e
         [AC_LANG_PROGRAM([$2[
Packit 33f14e
            int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])],
Packit 33f14e
         result=yes, result=no)
Packit 33f14e
       eval gl_cv_type_${gltype}_signed=\$result
Packit 33f14e
      ])
Packit 33f14e
    eval result=\$gl_cv_type_${gltype}_signed
Packit 33f14e
    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
Packit 33f14e
    if test "$result" = yes; then
Packit 33f14e
      AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1])
Packit 33f14e
      eval HAVE_SIGNED_${GLTYPE}=1
Packit 33f14e
    else
Packit 33f14e
      eval HAVE_SIGNED_${GLTYPE}=0
Packit 33f14e
    fi
Packit 33f14e
  done
Packit 33f14e
  m4_foreach_w([gltype], [$1],
Packit 33f14e
    [AC_SUBST([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
Packit 33f14e
])
Packit 33f14e
Packit 33f14e
dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES)
Packit 33f14e
dnl Determine the suffix to use for integer constants of the given types.
Packit 33f14e
dnl Define t_SUFFIX for each such type.
Packit 33f14e
AC_DEFUN([gl_INTEGER_TYPE_SUFFIX],
Packit 33f14e
[
Packit 33f14e
  dnl Use a shell loop, to avoid bloating configure, and
Packit 33f14e
  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
Packit 33f14e
  dnl   config.h.in,
Packit 33f14e
  dnl - extra AC_SUBST calls, so that the right substitutions are made.
Packit 33f14e
  m4_foreach_w([gltype], [$1],
Packit 33f14e
    [AH_TEMPLATE(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX],
Packit 33f14e
       [Define to l, ll, u, ul, ull, etc., as suitable for
Packit 33f14e
        constants of type ']gltype['.])])
Packit 33f14e
  for gltype in $1 ; do
Packit 33f14e
    AC_CACHE_CHECK([for $gltype integer literal suffix],
Packit 33f14e
      [gl_cv_type_${gltype}_suffix],
Packit 33f14e
      [eval gl_cv_type_${gltype}_suffix=no
Packit 33f14e
       eval result=\$gl_cv_type_${gltype}_signed
Packit 33f14e
       if test "$result" = yes; then
Packit 33f14e
         glsufu=
Packit 33f14e
       else
Packit 33f14e
         glsufu=u
Packit 33f14e
       fi
Packit 33f14e
       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
Packit 33f14e
         case $glsuf in
Packit 33f14e
           '')  gltype1='int';;
Packit 33f14e
           l)   gltype1='long int';;
Packit 33f14e
           ll)  gltype1='long long int';;
Packit 33f14e
           i64) gltype1='__int64';;
Packit 33f14e
           u)   gltype1='unsigned int';;
Packit 33f14e
           ul)  gltype1='unsigned long int';;
Packit 33f14e
           ull) gltype1='unsigned long long int';;
Packit 33f14e
           ui64)gltype1='unsigned __int64';;
Packit 33f14e
         esac
Packit 33f14e
         AC_COMPILE_IFELSE(
Packit 33f14e
           [AC_LANG_PROGRAM([$2[
Packit 33f14e
              extern $gltype foo;
Packit 33f14e
              extern $gltype1 foo;]])],
Packit 33f14e
           [eval gl_cv_type_${gltype}_suffix=\$glsuf])
Packit 33f14e
         eval result=\$gl_cv_type_${gltype}_suffix
Packit 33f14e
         test "$result" != no && break
Packit 33f14e
       done])
Packit 33f14e
    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
Packit 33f14e
    eval result=\$gl_cv_type_${gltype}_suffix
Packit 33f14e
    test "$result" = no && result=
Packit 33f14e
    eval ${GLTYPE}_SUFFIX=\$result
Packit 33f14e
    AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result])
Packit 33f14e
  done
Packit 33f14e
  m4_foreach_w([gltype], [$1],
Packit 33f14e
    [AC_SUBST(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])])
Packit 33f14e
])
Packit 33f14e
Packit 33f14e
dnl gl_STDINT_INCLUDES
Packit 33f14e
AC_DEFUN([gl_STDINT_INCLUDES],
Packit 33f14e
[[
Packit 33f14e
  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit 33f14e
     included before <wchar.h>.  */
Packit 33f14e
  #include <stddef.h>
Packit 33f14e
  #include <signal.h>
Packit 33f14e
  #if HAVE_WCHAR_H
Packit 33f14e
  # include <stdio.h>
Packit 33f14e
  # include <time.h>
Packit 33f14e
  # include <wchar.h>
Packit 33f14e
  #endif
Packit 33f14e
]])
Packit 33f14e
Packit 33f14e
dnl gl_STDINT_TYPE_PROPERTIES
Packit 33f14e
dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t
Packit 33f14e
dnl of interest to stdint.in.h.
Packit 33f14e
AC_DEFUN([gl_STDINT_TYPE_PROPERTIES],
Packit 33f14e
[
Packit 33f14e
  AC_REQUIRE([gl_MULTIARCH])
Packit 33f14e
  if test $APPLE_UNIVERSAL_BUILD = 0; then
Packit 33f14e
    gl_STDINT_BITSIZEOF([ptrdiff_t size_t],
Packit 33f14e
      [gl_STDINT_INCLUDES])
Packit 33f14e
  fi
Packit 33f14e
  gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t],
Packit 33f14e
    [gl_STDINT_INCLUDES])
Packit 33f14e
  gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t],
Packit 33f14e
    [gl_STDINT_INCLUDES])
Packit 33f14e
  gl_cv_type_ptrdiff_t_signed=yes
Packit 33f14e
  gl_cv_type_size_t_signed=no
Packit 33f14e
  if test $APPLE_UNIVERSAL_BUILD = 0; then
Packit 33f14e
    gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t],
Packit 33f14e
      [gl_STDINT_INCLUDES])
Packit 33f14e
  fi
Packit 33f14e
  gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t],
Packit 33f14e
    [gl_STDINT_INCLUDES])
Packit 33f14e
Packit 33f14e
  dnl If wint_t is smaller than 'int', it cannot satisfy the ISO C 99
Packit 33f14e
  dnl requirement that wint_t is "unchanged by default argument promotions".
Packit 33f14e
  dnl In this case gnulib's <wchar.h> and <wctype.h> override wint_t.
Packit 33f14e
  dnl Set the variable BITSIZEOF_WINT_T accordingly.
Packit 33f14e
  if test $GNULIB_OVERRIDES_WINT_T = 1; then
Packit 33f14e
    BITSIZEOF_WINT_T=32
Packit 33f14e
  fi
Packit 33f14e
])
Packit 33f14e
Packit 33f14e
dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
Packit 33f14e
dnl Remove this when we can assume autoconf >= 2.61.
Packit 33f14e
m4_ifdef([AC_COMPUTE_INT], [], [
Packit 33f14e
  AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
Packit 33f14e
])