From 9394d391b803c55281879721ea393a50df4a0be6 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 20 Nov 2000 15:56:14 +0000 Subject: [PATCH] Add configure checks for strtoll, strtoull (or strto[u]q). Disable 'long long int' portions of ecpg if the type or these functions don't exist. --- configure | 164 ++++++++++++++++++++++----- configure.in | 4 + src/include/config.h.in | 21 +++- src/interfaces/ecpg/lib/data.c | 15 ++- src/interfaces/ecpg/lib/descriptor.c | 4 + src/interfaces/ecpg/lib/execute.c | 10 +- src/interfaces/ecpg/lib/typename.c | 4 + 7 files changed, 188 insertions(+), 34 deletions(-) diff --git a/configure b/configure index 30217d35b1..7bfcd69c78 100755 --- a/configure +++ b/configure @@ -7169,9 +7169,121 @@ EOF +for ac_func in strtoll strtoq +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:7176: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:7204: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +for ac_func in strtoull strtouq +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:7231: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:7259: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + + + echo $ac_n "checking alignment of short""... $ac_c" 1>&6 -echo "configure:7175: checking alignment of short" >&5 +echo "configure:7287: checking alignment of short" >&5 if eval "test \"`echo '$''{'pgac_cv_alignof_short'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7179,7 +7291,7 @@ else pgac_cv_alignof_short='sizeof(short)' else cat > conftest.$ac_ext < struct { char filler; short field; } mystruct; @@ -7191,7 +7303,7 @@ main() exit(0); } EOF -if { (eval echo configure:7195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:7307: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pgac_cv_alignof_short=`cat conftestval` else @@ -7211,7 +7323,7 @@ EOF echo $ac_n "checking alignment of int""... $ac_c" 1>&6 -echo "configure:7215: checking alignment of int" >&5 +echo "configure:7327: checking alignment of int" >&5 if eval "test \"`echo '$''{'pgac_cv_alignof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7219,7 +7331,7 @@ else pgac_cv_alignof_int='sizeof(int)' else cat > conftest.$ac_ext < struct { char filler; int field; } mystruct; @@ -7231,7 +7343,7 @@ main() exit(0); } EOF -if { (eval echo configure:7235: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:7347: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pgac_cv_alignof_int=`cat conftestval` else @@ -7251,7 +7363,7 @@ EOF echo $ac_n "checking alignment of long""... $ac_c" 1>&6 -echo "configure:7255: checking alignment of long" >&5 +echo "configure:7367: checking alignment of long" >&5 if eval "test \"`echo '$''{'pgac_cv_alignof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7259,7 +7371,7 @@ else pgac_cv_alignof_long='sizeof(long)' else cat > conftest.$ac_ext < struct { char filler; long field; } mystruct; @@ -7271,7 +7383,7 @@ main() exit(0); } EOF -if { (eval echo configure:7275: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:7387: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pgac_cv_alignof_long=`cat conftestval` else @@ -7292,7 +7404,7 @@ EOF if [ x"$HAVE_LONG_LONG_INT_64" = xyes ] ; then echo $ac_n "checking alignment of long long int""... $ac_c" 1>&6 -echo "configure:7296: checking alignment of long long int" >&5 +echo "configure:7408: checking alignment of long long int" >&5 if eval "test \"`echo '$''{'pgac_cv_alignof_long_long_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7300,7 +7412,7 @@ else pgac_cv_alignof_long_long_int='sizeof(long long int)' else cat > conftest.$ac_ext < struct { char filler; long long int field; } mystruct; @@ -7312,7 +7424,7 @@ main() exit(0); } EOF -if { (eval echo configure:7316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:7428: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pgac_cv_alignof_long_long_int=`cat conftestval` else @@ -7333,7 +7445,7 @@ EOF fi echo $ac_n "checking alignment of double""... $ac_c" 1>&6 -echo "configure:7337: checking alignment of double" >&5 +echo "configure:7449: checking alignment of double" >&5 if eval "test \"`echo '$''{'pgac_cv_alignof_double'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7341,7 +7453,7 @@ else pgac_cv_alignof_double='sizeof(double)' else cat > conftest.$ac_ext < struct { char filler; double field; } mystruct; @@ -7353,7 +7465,7 @@ main() exit(0); } EOF -if { (eval echo configure:7357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:7469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then pgac_cv_alignof_double=`cat conftestval` else @@ -7391,12 +7503,12 @@ EOF echo $ac_n "checking for POSIX signal interface""... $ac_c" 1>&6 -echo "configure:7395: checking for POSIX signal interface" >&5 +echo "configure:7507: checking for POSIX signal interface" >&5 if eval "test \"`echo '$''{'pgac_cv_func_posix_signals'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -7407,7 +7519,7 @@ act.sa_flags = SA_RESTART; sigaction(0, &act, &oact); ; return 0; } EOF -if { (eval echo configure:7411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:7523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* pgac_cv_func_posix_signals=yes else @@ -7437,7 +7549,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:7441: checking for $ac_word" >&5 +echo "configure:7553: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_TCLSH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7473,7 +7585,7 @@ test -n "$TCLSH" && break done echo $ac_n "checking for tclConfig.sh""... $ac_c" 1>&6 -echo "configure:7477: checking for tclConfig.sh" >&5 +echo "configure:7589: checking for tclConfig.sh" >&5 # Let user override test if test -z "$TCL_CONFIG_SH"; then pgac_test_dirs="$with_tclconfig" @@ -7506,7 +7618,7 @@ fi # Check for Tk configuration script tkConfig.sh if test "$with_tk" = yes; then echo $ac_n "checking for tkConfig.sh""... $ac_c" 1>&6 -echo "configure:7510: checking for tkConfig.sh" >&5 +echo "configure:7622: checking for tkConfig.sh" >&5 # Let user override test if test -z "$TK_CONFIG_SH"; then pgac_test_dirs="$with_tkconfig $with_tclconfig" @@ -7545,7 +7657,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:7549: checking for $ac_word" >&5 +echo "configure:7661: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_NSGMLS'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7581,7 +7693,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:7585: checking for $ac_word" >&5 +echo "configure:7697: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_JADE'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7612,7 +7724,7 @@ done echo $ac_n "checking for DocBook V3.1""... $ac_c" 1>&6 -echo "configure:7616: checking for DocBook V3.1" >&5 +echo "configure:7728: checking for DocBook V3.1" >&5 if eval "test \"`echo '$''{'pgac_cv_check_docbook'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7645,7 +7757,7 @@ have_docbook=$pgac_cv_check_docbook echo $ac_n "checking for DocBook stylesheets""... $ac_c" 1>&6 -echo "configure:7649: checking for DocBook stylesheets" >&5 +echo "configure:7761: checking for DocBook stylesheets" >&5 if eval "test \"`echo '$''{'pgac_cv_path_stylesheets'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -7684,7 +7796,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:7688: checking for $ac_word" >&5 +echo "configure:7800: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_SGMLSPL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else diff --git a/configure.in b/configure.in index 9cda1399f2..68c118d3ff 100644 --- a/configure.in +++ b/configure.in @@ -1072,6 +1072,10 @@ fi AC_DEFINE_UNQUOTED(INT64_FORMAT, $INT64_FORMAT) +AC_CHECK_FUNCS([strtoll strtoq], [break]) +AC_CHECK_FUNCS([strtoull strtouq], [break]) + + dnl Determine memory alignment requirements for the basic C datatypes. PGAC_CHECK_ALIGNOF(short) diff --git a/src/include/config.h.in b/src/include/config.h.in index b066daed7b..4e36b9099a 100644 --- a/src/include/config.h.in +++ b/src/include/config.h.in @@ -8,7 +8,7 @@ * or in config.h afterwards. Of course, if you edit config.h, then your * changes will be overwritten the next time you run configure. * - * $Id: config.h.in,v 1.147 2000/11/06 22:18:10 petere Exp $ + * $Id: config.h.in,v 1.148 2000/11/20 15:56:13 petere Exp $ */ #ifndef CONFIG_H @@ -601,12 +601,29 @@ extern void srandom(unsigned int seed); /* Define if C++ compiler accepts "#include " */ #undef HAVE_CXX_STRING_HEADER -/* Define if a system lib (-ldl) has dlopen() (needed for AIX) */ +/* Define if you have the dlopen function */ #undef HAVE_DLOPEN /* Define if you have the optreset variable */ #undef HAVE_INT_OPTRESET +#undef HAVE_STRTOLL +#undef HAVE_STRTOQ + +#if defined(HAVE_LONG_LONG_INT_64) && !defined(HAVE_STRTOLL) && defined(HAVE_STRTOQ) +# define strtoll strtoq +# define HAVE_STRTOLL 1 +#endif + +#undef HAVE_STRTOULL +#undef HAVE_STRTOUQ + +#if defined(HAVE_LONG_LONG_INT_64) && !defined(HAVE_STRTOULL) && defined(HAVE_STRTOUQ) +# define strtoull strtouq +# define HAVE_STRTOULL 1 +#endif + + /* *------------------------------------------------------------------------ * Part 4: pull in system-specific declarations. diff --git a/src/interfaces/ecpg/lib/data.c b/src/interfaces/ecpg/lib/data.c index 1c85de0350..fdaa583aa4 100644 --- a/src/interfaces/ecpg/lib/data.c +++ b/src/interfaces/ecpg/lib/data.c @@ -1,3 +1,5 @@ +#include "config.h" + #include #include @@ -60,12 +62,14 @@ get_data(PGresult *results, int act_tuple, int act_field, int lineno, case ECPGt_unsigned_long: ((long *) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field); break; +#ifdef HAVE_LONG_LONG_INT_64 case ECPGt_long_long: ((long long int*) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field); break; case ECPGt_unsigned_long_long: ((unsigned long long int*) ind)[act_tuple] = -PQgetisnull(results, act_tuple, act_field); - break; + break; +#endif /* HAVE_LONG_LONG_INT_64 */ case ECPGt_NO_INDICATOR: if (PQgetisnull(results, act_tuple, act_field)) { @@ -154,10 +158,12 @@ get_data(PGresult *results, int act_tuple, int act_field, int lineno, } break; +#ifdef HAVE_LONG_LONG_INT_64 +# ifdef HAVE_STRTOLL case ECPGt_long_long: if (pval) { - ((long long int *) var)[act_tuple] = strtoull(pval, &scan_length, 10); + ((long long int *) var)[act_tuple] = strtoll(pval, &scan_length, 10); if ((isarray && *scan_length != ',' && *scan_length != '}') || (!isarray && *scan_length != '\0')) /* Garbage left */ { @@ -169,7 +175,8 @@ get_data(PGresult *results, int act_tuple, int act_field, int lineno, ((long long int *) var)[act_tuple] = 0LL; break; - +# endif /* HAVE_STRTOLL */ +# ifdef HAVE_STRTOULL case ECPGt_unsigned_long_long: if (pval) { @@ -185,6 +192,8 @@ get_data(PGresult *results, int act_tuple, int act_field, int lineno, ((unsigned long long int *) var)[act_tuple] = 0LL; break; +# endif /* HAVE_STRTOULL */ +#endif /* HAVE_LONG_LONG_INT_64 */ case ECPGt_float: case ECPGt_double: diff --git a/src/interfaces/ecpg/lib/descriptor.c b/src/interfaces/ecpg/lib/descriptor.c index 81d336deab..5cdf8dc1f3 100644 --- a/src/interfaces/ecpg/lib/descriptor.c +++ b/src/interfaces/ecpg/lib/descriptor.c @@ -1,3 +1,5 @@ +#include "config.h" + #include "ecpgtype.h" #include "ecpglib.h" #include "ecpgerrno.h" @@ -81,12 +83,14 @@ get_int_item(int lineno, void *var, enum ECPGttype vartype, int value) case ECPGt_unsigned_long: *(unsigned long *) var = (unsigned long) value; break; +#ifdef HAVE_LONG_LONG_INT_64 case ECPGt_long_long: *(long long int *) var = (long long int) value; break; case ECPGt_unsigned_long_long: *(unsigned long long int *) var = (unsigned long long int) value; break; +#endif /* HAVE_LONG_LONG_INT_64 */ case ECPGt_float: *(float *) var = (float) value; break; diff --git a/src/interfaces/ecpg/lib/execute.c b/src/interfaces/ecpg/lib/execute.c index f1d11105f0..9daa97a087 100644 --- a/src/interfaces/ecpg/lib/execute.c +++ b/src/interfaces/ecpg/lib/execute.c @@ -12,6 +12,8 @@ /* Taken over as part of PostgreSQL by Michael Meskes on Feb. 5th, 1998 */ +#include "config.h" + #include #include @@ -414,11 +416,13 @@ ECPGexecute(struct statement * stmt) if (*(long *) var->ind_value < 0L) strcpy(buff, "null"); break; +#ifdef HAVE_LONG_LONG_INT_64 case ECPGt_long_long: case ECPGt_unsigned_long_long: if (*(long long int*) var->ind_value < 0LL) strcpy(buff, "null"); break; +#endif /* HAVE_LONG_LONG_INT_64 */ default: break; } @@ -542,7 +546,7 @@ ECPGexecute(struct statement * stmt) tobeinserted = mallocedval; break; - +#ifdef HAVE_LONG_LONG_INT_64 case ECPGt_long_long: if (!(mallocedval = ecpg_alloc(var->arrsize * 25, stmt->lineno))) return false; @@ -580,7 +584,7 @@ ECPGexecute(struct statement * stmt) tobeinserted = mallocedval; break; - +#endif /* HAVE_LONG_LONG_INT_64 */ case ECPGt_float: if (!(mallocedval = ecpg_alloc(var->arrsize * 20, stmt->lineno))) return false; @@ -1003,7 +1007,7 @@ ECPGdo(int lineno, const char *connection_name, char *query,...) * * Copyright (c) 2000, Christof Petig * - * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.13 2000/10/29 09:44:58 meskes Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.14 2000/11/20 15:56:14 petere Exp $ */ PGconn *ECPG_internal_get_connection(char *name); diff --git a/src/interfaces/ecpg/lib/typename.c b/src/interfaces/ecpg/lib/typename.c index a638c7d766..710354ffe2 100644 --- a/src/interfaces/ecpg/lib/typename.c +++ b/src/interfaces/ecpg/lib/typename.c @@ -1,3 +1,5 @@ +#include "config.h" + #include #include "ecpgtype.h" #include "ecpglib.h" @@ -29,10 +31,12 @@ ECPGtype_name(enum ECPGttype typ) return "long"; case ECPGt_unsigned_long: return "unsigned long"; +#ifdef HAVE_LONG_LONG_INT_64 case ECPGt_long_long: return "long long"; case ECPGt_unsigned_long_long: return "unsigned long long"; +#endif /* HAVE_LONG_LONG_INT_64 */ case ECPGt_float: return "float"; case ECPGt_double: -- GitLab