Autoconf'd test for int64 - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Autoconf'd test for int64 |
Date | |
Msg-id | 12284.903301066@sss.pgh.pa.us Whole thread Raw |
Responses |
Re: [HACKERS] Autoconf'd test for int64
|
List | pgsql-hackers |
Attached is a patch that uses autoconf to determine whether there is a working 64-bit-int type available. In playing around with it on my machine, I found that gcc provides perfectly fine support for "long long" arithmetic ... but sprintf() and sscanf(), which are system-supplied, don't work :-(. So the autoconf test program does a cursory test on them too. If we find that a lot of systems are like this, it might be worth the trouble to implement binary<->ASCII conversion of int64 ourselves rather than relying on sprintf/sscanf to handle the data type. regards, tom lane *** src/configure.in.orig Sat Aug 15 11:52:03 1998 --- src/configure.in Sun Aug 16 16:41:24 1998 *************** *** 522,528 **** #endif main() { double d = DBL_MIN; if (d != DBL_MIN) exit(-1); else exit(0); }], AC_MSG_RESULT(yes), ! [AC_MSG_RESULT(no) AC_DEFINE(HAVE_DBL_MIN_PROBLEM)]) dnl Checks for library functions. AC_PROG_GCC_TRADITIONAL --- 522,604 ---- #endif main() { double d = DBL_MIN; if (d != DBL_MIN) exit(-1); else exit(0); }], AC_MSG_RESULT(yes), ! [AC_MSG_RESULT(no) AC_DEFINE(HAVE_DBL_MIN_PROBLEM)], ! AC_MSG_RESULT(assuming ok on target machine)) ! ! dnl Check to see if we have a working 64-bit integer type. ! AC_MSG_CHECKING(whether 'long int' is 64 bits) ! AC_TRY_RUN([#include <stdio.h> ! typedef long int int64; ! #define INT64_FORMAT "%ld" ! ! 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_MSG_RESULT(yes) AC_DEFINE(HAVE_LONG_INT_64)], ! AC_MSG_RESULT(no), ! AC_MSG_RESULT(assuming not on target machine)) ! ! AC_MSG_CHECKING(whether 'long long int' is 64 bits) ! AC_TRY_RUN([#include <stdio.h> ! typedef long long int int64; ! #define INT64_FORMAT "%Ld" ! ! 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_MSG_RESULT(yes) AC_DEFINE(HAVE_LONG_LONG_INT_64)], ! AC_MSG_RESULT(no), ! AC_MSG_RESULT(assuming not on target machine)) dnl Checks for library functions. AC_PROG_GCC_TRADITIONAL *** src/include/config.h.in.orig Sat Aug 15 11:54:54 1998 --- src/include/config.h.in Sun Aug 16 16:33:22 1998 *************** *** 219,224 **** --- 219,230 ---- /* Set to 1 if your DBL_MIN is problematic */ #undef HAVE_DBL_MIN_PROBLEM + /* Set to 1 if type "long int" works and is 64 bits */ + #undef HAVE_LONG_INT_64 + + /* Set to 1 if type "long long int" works and is 64 bits */ + #undef HAVE_LONG_LONG_INT_64 + /* * Code below this point should not require changes */ *** src/include/utils/int8.h.orig Wed Jul 8 10:10:30 1998 --- src/include/utils/int8.h Sun Aug 16 16:37:51 1998 *************** *** 23,51 **** #ifndef INT8_H #define INT8_H ! #if defined(__alpha) || defined(PPC) typedef long int int64; - #define INT64_FORMAT "%ld" ! ! #elif defined(__GNUC__) && defined(i386) typedef long long int int64; - #define INT64_FORMAT "%Ld" - #else typedef long int int64; - #define INT64_FORMAT "%ld" #endif - - - /* - #if sizeof(int64) == 8 - #define HAVE_64BIT_INTS 1 #endif - */ - extern int64 *int8in(char *str); extern char *int8out(int64 * val); --- 23,44 ---- #ifndef INT8_H #define INT8_H ! #ifdef HAVE_LONG_INT_64 ! /* Plain "long int" fits, use it */ typedef long int int64; #define INT64_FORMAT "%ld" ! #else ! #ifdef HAVE_LONG_LONG_INT_64 ! /* We have working support for "long long int", use that */ typedef long long int int64; #define INT64_FORMAT "%Ld" #else + /* Won't actually work, but fall back to long int so that int8.c compiles */ typedef long int int64; #define INT64_FORMAT "%ld" + #define INT64_IS_BUSTED #endif #endif extern int64 *int8in(char *str); extern char *int8out(int64 * val);
pgsql-hackers by date: