bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fix size_max macro


From: Bruno Haible
Subject: Re: Fix size_max macro
Date: Fri, 16 Jun 2006 15:14:00 +0200
User-agent: KMail/1.9.1

Here's the fix that I now committed:

2006-06-15  Bruno Haible  <address@hidden>

        * size_max.m4 (gl_SIZE_MAX): Make it work also when cross-compiling.

*** size_max.m4 11 Jul 2005 11:29:40 -0000      1.4
--- size_max.m4 16 Jun 2006 13:12:33 -0000
***************
*** 1,5 ****
! # size_max.m4 serial 3
! dnl Copyright (C) 2003, 2005 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.
--- 1,5 ----
! # size_max.m4 serial 4
! dnl Copyright (C) 2003, 2005-2006 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.
***************
*** 23,50 ****
  ], result=yes)
    if test -z "$result"; then
      dnl Define it ourselves. Here we assume that the type 'size_t' is not 
wider
!     dnl than the type 'unsigned long'.
!     dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr',
!     dnl which is guaranteed to work from LONG_MIN to LONG_MAX.
!     _AC_COMPUTE_INT([(size_t)~(size_t)0 / 10], res_hi,
!       [#include <stddef.h>], result=?)
!     _AC_COMPUTE_INT([(size_t)~(size_t)0 % 10], res_lo,
!       [#include <stddef.h>], result=?)
      _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint,
!       [#include <stddef.h>], result=?)
!     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_TRY_COMPILE([#include <stddef.h>
!         extern size_t foo;
!         extern unsigned long foo;
!         ], [], fits_in_uint=0)
!     fi
!     if test -z "$result"; then
!       if test "$fits_in_uint" = 1; then
!         result="$res_hi$res_lo"U
        else
!         result="$res_hi$res_lo"UL
        fi
      else
        dnl Shouldn't happen, but who knows...
--- 23,51 ----
  ], result=yes)
    if test -z "$result"; 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([sizeof (size_t) * CHAR_BIT - 1], size_t_bits_minus_1,
!       [#include <stddef.h>
! #include <limits.h>], size_t_bits_minus_1=)
      _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint,
!       [#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_TRY_COMPILE([#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
!         result="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
        else
!         result="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
        fi
      else
        dnl Shouldn't happen, but who knows...




reply via email to

[Prev in Thread] Current Thread [Next in Thread]