diff options
author | Claudio Fontana <sick_soul@users.sourceforge.net> | 2005-11-01 09:27:17 +0000 |
---|---|---|
committer | Claudio Fontana <sick_soul@users.sourceforge.net> | 2005-11-01 09:27:17 +0000 |
commit | c12afffc3d06c2acfc5fab3aa4746d1096f4950a (patch) | |
tree | 7af089dbe424fa5639f8aeba7250e8000f613278 /m4/size_max.m4 | |
parent | 87b1fbbc4ad8a95bfe27a91bc6672d7fcb9e0fe8 (diff) | |
download | idutils-c12afffc3d06c2acfc5fab3aa4746d1096f4950a.tar.gz idutils-c12afffc3d06c2acfc5fab3aa4746d1096f4950a.tar.bz2 idutils-c12afffc3d06c2acfc5fab3aa4746d1096f4950a.zip |
* new gnulib m4 macros
Diffstat (limited to 'm4/size_max.m4')
-rw-r--r-- | m4/size_max.m4 | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/m4/size_max.m4 b/m4/size_max.m4 new file mode 100644 index 0000000..0336f3a --- /dev/null +++ b/m4/size_max.m4 @@ -0,0 +1,59 @@ +# 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. + +dnl From Bruno Haible. + +AC_DEFUN([gl_SIZE_MAX], +[ + AC_CHECK_HEADERS(stdint.h) + dnl First test whether the system already has SIZE_MAX. + AC_MSG_CHECKING([for SIZE_MAX]) + result= + AC_EGREP_CPP([Found it], [ +#include <limits.h> +#if HAVE_STDINT_H +#include <stdint.h> +#endif +#ifdef SIZE_MAX +Found it +#endif +], 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... + result='((size_t)~(size_t)0)' + fi + fi + AC_MSG_RESULT([$result]) + if test "$result" != yes; then + AC_DEFINE_UNQUOTED([SIZE_MAX], [$result], + [Define as the maximum value of type 'size_t', if the system doesn't define it.]) + fi +]) |