Add erand48() to the set of functions supported by our src/port/ library,
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 16 Jul 2009 17:43:52 +0000 (17:43 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 16 Jul 2009 17:43:52 +0000 (17:43 +0000)
and extend configure to test for it properly instead of hard-wiring
an assumption that everybody but Windows has the rand48 functions.
(We do cheat to the extent of assuming that probing for erand48 will do
for the entire rand48 family.)

erand48() is unused as of this commit, but a followon patch will cause
GEQO to depend on it.

Andres Freund, additional hacking by Tom

configure
configure.in
src/include/pg_config.h.in
src/include/port.h
src/port/erand48.c [moved from src/port/rand.c with 73% similarity]
src/tools/msvc/Mkvcbuild.pm

index 3e8d074f8d389e615b424c3b9cf0cd6feedb5bcf..5790a3219c78c436ab258b1f54f6c4b8dfcf0fd7 100755 (executable)
--- a/configure
+++ b/configure
@@ -18594,7 +18594,8 @@ LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
 
 
-for ac_func in crypt getopt getrusage inet_aton random rint srandom strdup strerror strlcat strlcpy strtol strtoul
+
+for ac_func in crypt erand48 getopt getrusage inet_aton random rint srandom strdup strerror strlcat strlcpy strtol strtoul
 do
 as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
@@ -19207,12 +19208,6 @@ case " $LIBOBJS " in
  ;;
 esac
 
-case " $LIBOBJS " in
-  *" rand.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS rand.$ac_objext"
- ;;
-esac
-
 case " $LIBOBJS " in
   *" win32env.$ac_objext "* ) ;;
   *) LIBOBJS="$LIBOBJS win32env.$ac_objext"
index 4e523899f173dbeb1151b2474fdbdd3c09f5b5db..3d51c70913fa39d3e794d6baa2d18d760f6e5994 100644 (file)
@@ -1249,7 +1249,7 @@ fi
 pgac_save_LIBS="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-AC_REPLACE_FUNCS([crypt getopt getrusage inet_aton random rint srandom strdup strerror strlcat strlcpy strtol strtoul])
+AC_REPLACE_FUNCS([crypt erand48 getopt getrusage inet_aton random rint srandom strdup strerror strlcat strlcpy strtol strtoul])
 
 case $host_os in
 
@@ -1294,7 +1294,6 @@ if test "$PORTNAME" = "win32"; then
 AC_REPLACE_FUNCS(gettimeofday)
 AC_LIBOBJ(kill)
 AC_LIBOBJ(open)
-AC_LIBOBJ(rand)
 AC_LIBOBJ(win32env)
 AC_LIBOBJ(win32error)
 AC_DEFINE([HAVE_SYMLINK], 1,
index 39ca31225fc2d2998955079d150c769f474962f2..ba807f4275057878d216dbfe50d72cbdc6dbfb8b 100644 (file)
 /* Define to 1 if you have the <editline/readline.h> header file. */
 #undef HAVE_EDITLINE_READLINE_H
 
+/* Define to 1 if you have the `erand48' function. */
+#undef HAVE_ERAND48
+
 /* Define to 1 if you have the `ERR_set_mark' function. */
 #undef HAVE_ERR_SET_MARK
 
index cbf9dcf99e168c3b5d611c3e831c4deb599c131c..1b9e0e0123a226b9ec4cf95ebe455bd588aea81c 100644 (file)
@@ -316,10 +316,6 @@ extern FILE *pgwin32_fopen(const char *, const char *);
 #define popen(a,b) _popen(a,b)
 #define pclose(a) _pclose(a)
 
-/* Missing rand functions */
-extern long lrand48(void);
-extern void srand48(long seed);
-
 /* New versions of MingW have gettimeofday, old mingw and msvc don't */
 #ifndef HAVE_GETTIMEOFDAY
 /* Last parameter not used */
@@ -351,6 +347,13 @@ extern off_t ftello(FILE *stream);
 #endif
 #endif
 
+#ifndef HAVE_ERAND48
+/* we assume all of these are present or missing together */
+extern double erand48(unsigned short xseed[3]);
+extern long lrand48(void);
+extern void srand48(long seed);
+#endif
+
 #ifndef HAVE_FSEEKO
 #define fseeko(a, b, c) fseek(a, b, c)
 #define ftello(a)              ftell(a)
similarity index 73%
rename from src/port/rand.c
rename to src/port/erand48.c
index 6c14a6438ae9b0d04a3cfe0dc51f40149e5961b8..3f40d54d21a5b2ffcc5309d1b45b88cf67a19d2d 100644 (file)
@@ -1,16 +1,13 @@
-/*
- * $PostgreSQL$
+/*-------------------------------------------------------------------------
  *
- *-------------------------------------------------------------------------
+ * erand48.c
+ *
+ * This file supplies versions of erand48(), lrand48(), and srand48()
+ * for machines that lack them.  (These are all the members of the drand48
+ * family that Postgres currently requires.  We name the file after erand48
+ * because that is the one that configure tests for.)
  *
- * rand.c
- *       Missing rand implementations for Win32
  *
- *-------------------------------------------------------------------------
- */
-#include "c.h"
-
-/*
  * Copyright (c) 1993 Martin Birgmeier
  * All rights reserved.
  *
  * This software is provided ``as is'', and comes with no warranties
  * of any kind. I shall in no event be liable for anything that happens
  * to anyone/anything when using this software.
+ *
+ * IDENTIFICATION
+ *       $PostgreSQL$
+ *
+ *-------------------------------------------------------------------------
  */
+
+#include "c.h"
+
+#include <math.h>
+
 #define RAND48_SEED_0  (0x330e)
 #define RAND48_SEED_1  (0xabcd)
 #define RAND48_SEED_2  (0x1234)
 #define RAND48_MULT_2  (0x0005)
 #define RAND48_ADD             (0x000b)
 
-unsigned short _rand48_seed[3] = {
+static unsigned short _rand48_seed[3] = {
        RAND48_SEED_0,
        RAND48_SEED_1,
        RAND48_SEED_2
 };
-unsigned short _rand48_mult[3] = {
+static unsigned short _rand48_mult[3] = {
        RAND48_MULT_0,
        RAND48_MULT_1,
        RAND48_MULT_2
 };
-unsigned short _rand48_add = RAND48_ADD;
+static unsigned short _rand48_add = RAND48_ADD;
+
 
 static void
 _dorand48(unsigned short xseed[3])
@@ -62,6 +70,16 @@ _dorand48(unsigned short xseed[3])
        xseed[2] = (unsigned short) accu;
 }
 
+
+double
+erand48(unsigned short xseed[3])
+{
+       _dorand48(xseed);
+       return ldexp((double) xseed[0], -48) +
+               ldexp((double) xseed[1], -32) +
+               ldexp((double) xseed[2], -16);
+}
+
 long
 lrand48(void)
 {
index 66b7f6a92858a60631ca1658cff45aa9d6c88a5f..c4b9ed5462a9f5cfb358015d4b32f54d2f66bf74 100644 (file)
@@ -44,7 +44,7 @@ sub mkvcbuild
 
     our @pgportfiles = qw(
       chklocale.c crypt.c fseeko.c getrusage.c inet_aton.c random.c srandom.c
-      getaddrinfo.c gettimeofday.c kill.c open.c rand.c
+      getaddrinfo.c gettimeofday.c kill.c open.c erand48.c
       snprintf.c strlcat.c strlcpy.c copydir.c dirmod.c exec.c noblock.c path.c pipe.c
       pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c sprompt.c thread.c
       getopt.c getopt_long.c dirent.c rint.c win32env.c win32error.c);