Blame m4/size_max.m4

Packit 8f70b4
# size_max.m4 serial 10
Packit 8f70b4
dnl Copyright (C) 2003, 2005-2006, 2008-2018 Free Software Foundation, Inc.
Packit 8f70b4
dnl This file is free software; the Free Software Foundation
Packit 8f70b4
dnl gives unlimited permission to copy and/or distribute it,
Packit 8f70b4
dnl with or without modifications, as long as this notice is preserved.
Packit 8f70b4
Packit 8f70b4
dnl From Bruno Haible.
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([gl_SIZE_MAX],
Packit 8f70b4
[
Packit 8f70b4
  AC_CHECK_HEADERS([stdint.h])
Packit 8f70b4
  dnl First test whether the system already has SIZE_MAX.
Packit 8f70b4
  AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [
Packit 8f70b4
    gl_cv_size_max=
Packit 8f70b4
    AC_EGREP_CPP([Found it], [
Packit 8f70b4
#include <limits.h>
Packit 8f70b4
#if HAVE_STDINT_H
Packit 8f70b4
#include <stdint.h>
Packit 8f70b4
#endif
Packit 8f70b4
#ifdef SIZE_MAX
Packit 8f70b4
Found it
Packit 8f70b4
#endif
Packit 8f70b4
], [gl_cv_size_max=yes])
Packit 8f70b4
    if test -z "$gl_cv_size_max"; then
Packit 8f70b4
      dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
Packit 8f70b4
      dnl than the type 'unsigned long'. Try hard to find a definition that can
Packit 8f70b4
      dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
Packit 8f70b4
      AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
Packit 8f70b4
        [#include <stddef.h>
Packit 8f70b4
#include <limits.h>], [size_t_bits_minus_1=])
Packit 8f70b4
      AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
Packit 8f70b4
        [#include <stddef.h>], [fits_in_uint=])
Packit 8f70b4
      if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
Packit 8f70b4
        if test $fits_in_uint = 1; then
Packit 8f70b4
          dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
Packit 8f70b4
          dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
Packit 8f70b4
          AC_COMPILE_IFELSE(
Packit 8f70b4
            [AC_LANG_PROGRAM(
Packit 8f70b4
               [[#include <stddef.h>
Packit 8f70b4
                 extern size_t foo;
Packit 8f70b4
                 extern unsigned long foo;
Packit 8f70b4
               ]],
Packit 8f70b4
               [[]])],
Packit 8f70b4
            [fits_in_uint=0])
Packit 8f70b4
        fi
Packit 8f70b4
        dnl We cannot use 'expr' to simplify this expression, because 'expr'
Packit 8f70b4
        dnl works only with 'long' integers in the host environment, while we
Packit 8f70b4
        dnl might be cross-compiling from a 32-bit platform to a 64-bit platform.
Packit 8f70b4
        if test $fits_in_uint = 1; then
Packit 8f70b4
          gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
Packit 8f70b4
        else
Packit 8f70b4
          gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
Packit 8f70b4
        fi
Packit 8f70b4
      else
Packit 8f70b4
        dnl Shouldn't happen, but who knows...
Packit 8f70b4
        gl_cv_size_max='((size_t)~(size_t)0)'
Packit 8f70b4
      fi
Packit 8f70b4
    fi
Packit 8f70b4
  ])
Packit 8f70b4
  if test "$gl_cv_size_max" != yes; then
Packit 8f70b4
    AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
Packit 8f70b4
      [Define as the maximum value of type 'size_t', if the system doesn't define it.])
Packit 8f70b4
  fi
Packit 8f70b4
  dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after
Packit 8f70b4
  dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with
Packit 8f70b4
  dnl #define by AC_DEFINE_UNQUOTED.
Packit 8f70b4
  AH_VERBATIM([SIZE_MAX],
Packit 8f70b4
[/* Define as the maximum value of type 'size_t', if the system doesn't define
Packit 8f70b4
   it. */
Packit 8f70b4
#ifndef SIZE_MAX
Packit 8f70b4
# undef SIZE_MAX
Packit 8f70b4
#endif])
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
Packit 8f70b4
dnl Remove this when we can assume autoconf >= 2.61.
Packit 8f70b4
m4_ifdef([AC_COMPUTE_INT], [], [
Packit 8f70b4
  AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
Packit 8f70b4
])