From c34ed86ea87e51816b9ac6c5cebc7412f032b6e4 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 10 Sep 1998 03:27:09 +0000 Subject: [PATCH] Allow long long on BSDI. --- src/configure.in | 38 +++++++++++++++++++++++++++++++++++++- src/include/utils/int8.h | 13 ++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/configure.in b/src/configure.in index e3dc6fc109..e51c64d109 100644 --- a/src/configure.in +++ b/src/configure.in @@ -606,7 +606,43 @@ int does_int64_work() main() { exit(! does_int64_work()); }], - [AC_DEFINE(HAVE_LONG_LONG_INT_64) AC_MSG_RESULT(yes)], + [AC_DEFINE(HAVE_LONG_LONG_INT_64_Ld) AC_MSG_RESULT(yes)], + AC_MSG_RESULT(no), + AC_MSG_RESULT(assuming not on target machine)) + +AC_TRY_RUN([#include +typedef long long int int64; +#define INT64_FORMAT "%qd" + +int64 a = 20000001; +int64 b = 40000005; + +int does_int64_work() +{ + int64 c,d,e; + char buf[100]; + + if (sizeof(int64) != 8) + return 0; /* doesn't look like the right size */ + + /* we do perfunctory checks on multiply, divide, sprintf, sscanf */ + c = a * b; + sprintf(buf, INT64_FORMAT, c); + if (strcmp(buf, "800000140000005") != 0) + return 0; /* either multiply or sprintf is busted */ + if (sscanf(buf, INT64_FORMAT, &d) != 1) + return 0; + if (d != c) + return 0; + e = d / b; + if (e != a) + return 0; + return 1; +} +main() { + exit(! does_int64_work()); +}], + [AC_DEFINE(HAVE_LONG_LONG_INT_64_qd) AC_MSG_RESULT(yes)], AC_MSG_RESULT(no), AC_MSG_RESULT(assuming not on target machine)) diff --git a/src/include/utils/int8.h b/src/include/utils/int8.h index 2de51258e7..5767edbd9d 100644 --- a/src/include/utils/int8.h +++ b/src/include/utils/int8.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: int8.h,v 1.4 1998/09/05 01:19:38 thomas Exp $ + * $Id: int8.h,v 1.5 1998/09/10 03:27:09 momjian Exp $ * * NOTES * These data types are supported on all 64-bit architectures, and may @@ -29,11 +29,17 @@ typedef long int int64; #define INT64_FORMAT "%ld" #else -#ifdef HAVE_LONG_LONG_INT_64 +#ifdef HAVE_LONG_LONG_INT_64_Ld /* We have working support for "long long int", use that */ typedef long long int int64; -#define INT64_FORMAT "%lld" +#define INT64_FORMAT "%Ld" +#else +#ifdef HAVE_LONG_LONG_INT_64_qd +/* We have working support for "long long int", use that */ +typedef long long int int64; + +#define INT64_FORMAT "%qd" #else /* Won't actually work, but fall back to long int so that int8.c compiles */ typedef long int int64; @@ -42,6 +48,7 @@ typedef long int int64; #define INT64_IS_BUSTED #endif #endif +#endif extern int64 *int8in(char *str); extern char *int8out(int64 * val); -- 2.40.0