Blame gettext-runtime/m4/longlong.m4

Packit 5b56b6
# longlong.m4 serial 17
Packit 5b56b6
dnl Copyright (C) 1999-2007, 2009-2015 Free Software Foundation, Inc.
Packit 5b56b6
dnl This file is free software; the Free Software Foundation
Packit 5b56b6
dnl gives unlimited permission to copy and/or distribute it,
Packit 5b56b6
dnl with or without modifications, as long as this notice is preserved.
Packit 5b56b6
Packit 5b56b6
dnl From Paul Eggert.
Packit 5b56b6
Packit 5b56b6
# Define HAVE_LONG_LONG_INT if 'long long int' works.
Packit 5b56b6
# This fixes a bug in Autoconf 2.61, and can be faster
Packit 5b56b6
# than what's in Autoconf 2.62 through 2.68.
Packit 5b56b6
Packit 5b56b6
# Note: If the type 'long long int' exists but is only 32 bits large
Packit 5b56b6
# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
Packit 5b56b6
# defined. In this case you can treat 'long long int' like 'long int'.
Packit 5b56b6
Packit 5b56b6
AC_DEFUN([AC_TYPE_LONG_LONG_INT],
Packit 5b56b6
[
Packit 5b56b6
  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
Packit 5b56b6
  AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
Packit 5b56b6
     [ac_cv_type_long_long_int=yes
Packit 5b56b6
      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
Packit 5b56b6
        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
Packit 5b56b6
        if test $ac_cv_type_long_long_int = yes; then
Packit 5b56b6
          dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
Packit 5b56b6
          dnl If cross compiling, assume the bug is not important, since
Packit 5b56b6
          dnl nobody cross compiles for this platform as far as we know.
Packit 5b56b6
          AC_RUN_IFELSE(
Packit 5b56b6
            [AC_LANG_PROGRAM(
Packit 5b56b6
               [[@%:@include <limits.h>
Packit 5b56b6
                 @%:@ifndef LLONG_MAX
Packit 5b56b6
                 @%:@ define HALF \
Packit 5b56b6
                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
Packit 5b56b6
                 @%:@ define LLONG_MAX (HALF - 1 + HALF)
Packit 5b56b6
                 @%:@endif]],
Packit 5b56b6
               [[long long int n = 1;
Packit 5b56b6
                 int i;
Packit 5b56b6
                 for (i = 0; ; i++)
Packit 5b56b6
                   {
Packit 5b56b6
                     long long int m = n << i;
Packit 5b56b6
                     if (m >> i != n)
Packit 5b56b6
                       return 1;
Packit 5b56b6
                     if (LLONG_MAX / 2 < m)
Packit 5b56b6
                       break;
Packit 5b56b6
                   }
Packit 5b56b6
                 return 0;]])],
Packit 5b56b6
            [],
Packit 5b56b6
            [ac_cv_type_long_long_int=no],
Packit 5b56b6
            [:])
Packit 5b56b6
        fi
Packit 5b56b6
      fi])
Packit 5b56b6
  if test $ac_cv_type_long_long_int = yes; then
Packit 5b56b6
    AC_DEFINE([HAVE_LONG_LONG_INT], [1],
Packit 5b56b6
      [Define to 1 if the system has the type 'long long int'.])
Packit 5b56b6
  fi
Packit 5b56b6
])
Packit 5b56b6
Packit 5b56b6
# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
Packit 5b56b6
# This fixes a bug in Autoconf 2.61, and can be faster
Packit 5b56b6
# than what's in Autoconf 2.62 through 2.68.
Packit 5b56b6
Packit 5b56b6
# Note: If the type 'unsigned long long int' exists but is only 32 bits
Packit 5b56b6
# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
Packit 5b56b6
# will not be defined. In this case you can treat 'unsigned long long int'
Packit 5b56b6
# like 'unsigned long int'.
Packit 5b56b6
Packit 5b56b6
AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
Packit 5b56b6
[
Packit 5b56b6
  AC_CACHE_CHECK([for unsigned long long int],
Packit 5b56b6
    [ac_cv_type_unsigned_long_long_int],
Packit 5b56b6
    [ac_cv_type_unsigned_long_long_int=yes
Packit 5b56b6
     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
Packit 5b56b6
       AC_LINK_IFELSE(
Packit 5b56b6
         [_AC_TYPE_LONG_LONG_SNIPPET],
Packit 5b56b6
         [],
Packit 5b56b6
         [ac_cv_type_unsigned_long_long_int=no])
Packit 5b56b6
     fi])
Packit 5b56b6
  if test $ac_cv_type_unsigned_long_long_int = yes; then
Packit 5b56b6
    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
Packit 5b56b6
      [Define to 1 if the system has the type 'unsigned long long int'.])
Packit 5b56b6
  fi
Packit 5b56b6
])
Packit 5b56b6
Packit 5b56b6
# Expands to a C program that can be used to test for simultaneous support
Packit 5b56b6
# of 'long long' and 'unsigned long long'. We don't want to say that
Packit 5b56b6
# 'long long' is available if 'unsigned long long' is not, or vice versa,
Packit 5b56b6
# because too many programs rely on the symmetry between signed and unsigned
Packit 5b56b6
# integer types (excluding 'bool').
Packit 5b56b6
AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
Packit 5b56b6
[
Packit 5b56b6
  AC_LANG_PROGRAM(
Packit 5b56b6
    [[/* For now, do not test the preprocessor; as of 2007 there are too many
Packit 5b56b6
         implementations with broken preprocessors.  Perhaps this can
Packit 5b56b6
         be revisited in 2012.  In the meantime, code should not expect
Packit 5b56b6
         #if to work with literals wider than 32 bits.  */
Packit 5b56b6
      /* Test literals.  */
Packit 5b56b6
      long long int ll = 9223372036854775807ll;
Packit 5b56b6
      long long int nll = -9223372036854775807LL;
Packit 5b56b6
      unsigned long long int ull = 18446744073709551615ULL;
Packit 5b56b6
      /* Test constant expressions.   */
Packit 5b56b6
      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
Packit 5b56b6
                     ? 1 : -1)];
Packit 5b56b6
      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
Packit 5b56b6
                     ? 1 : -1)];
Packit 5b56b6
      int i = 63;]],
Packit 5b56b6
    [[/* Test availability of runtime routines for shift and division.  */
Packit 5b56b6
      long long int llmax = 9223372036854775807ll;
Packit 5b56b6
      unsigned long long int ullmax = 18446744073709551615ull;
Packit 5b56b6
      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
Packit 5b56b6
              | (llmax / ll) | (llmax % ll)
Packit 5b56b6
              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
Packit 5b56b6
              | (ullmax / ull) | (ullmax % ull));]])
Packit 5b56b6
])