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