aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/drand48-iter.c47
-rw-r--r--stdlib/drand48.c4
-rw-r--r--stdlib/drand48_r.c4
-rw-r--r--stdlib/erand48_r.c11
-rw-r--r--stdlib/jrand48_r.c5
-rw-r--r--stdlib/lcong48_r.c22
-rw-r--r--stdlib/lrand48.c4
-rw-r--r--stdlib/lrand48_r.c4
-rw-r--r--stdlib/mrand48.c4
-rw-r--r--stdlib/mrand48_r.c4
-rw-r--r--stdlib/seed48.c4
-rw-r--r--stdlib/seed48_r.c29
-rw-r--r--stdlib/srand48_r.c28
-rw-r--r--stdlib/stdlib.h16
14 files changed, 61 insertions, 125 deletions
diff --git a/stdlib/drand48-iter.c b/stdlib/drand48-iter.c
index 707be8e..3e8ea0e 100644
--- a/stdlib/drand48-iter.c
+++ b/stdlib/drand48-iter.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -20,6 +20,7 @@
#include <errno.h>
#include <stdlib.h>
#include <limits.h>
+#include <stdint.h>
#include <sys/types.h>
/* Global state for non-reentrant functions. */
@@ -31,50 +32,28 @@ __drand48_iterate (xsubi, buffer)
unsigned short int xsubi[3];
struct drand48_data *buffer;
{
- u_int64_t X, a, result;
+ uint64_t X;
+ uint64_t result;
/* Initialize buffer, if not yet done. */
- if (!buffer->init)
+ if (__builtin_expect (!buffer->__init, 0))
{
-#if (USHRT_MAX == 0xffffU)
- buffer->a[2] = 0x5;
- buffer->a[1] = 0xdeec;
- buffer->a[0] = 0xe66d;
-#else
- buffer->a[2] = 0x5deecUL;
- buffer->a[1] = 0xe66d0000UL;
- buffer->a[0] = 0;
-#endif
- buffer->c = 0xb;
- buffer->init = 1;
+ buffer->__a = 0x5deece66dull;
+ buffer->__c = 0xb;
+ buffer->__init = 1;
}
/* Do the real work. We choose a data type which contains at least
48 bits. Because we compute the modulus it does not care how
many bits really are computed. */
- if (sizeof (unsigned short int) == 2)
- {
- X = (u_int64_t)xsubi[2] << 32 | (u_int64_t)xsubi[1] << 16 | xsubi[0];
- a = ((u_int64_t)buffer->a[2] << 32 | (u_int64_t)buffer->a[1] << 16
- | buffer->a[0]);
-
- result = X * a + buffer->c;
-
- xsubi[0] = result & 0xffff;
- xsubi[1] = (result >> 16) & 0xffff;
- xsubi[2] = (result >> 32) & 0xffff;
- }
- else
- {
- X = (u_int64_t)xsubi[2] << 16 | xsubi[1] >> 16;
- a = (u_int64_t)buffer->a[2] << 16 | buffer->a[1] >> 16;
+ X = (uint64_t) xsubi[2] << 32 | (uint32_t) xsubi[1] << 16 | xsubi[0];
- result = X * a + buffer->c;
+ result = X * buffer->__a + buffer->__c;
- xsubi[0] = result >> 16 & 0xffffffffl;
- xsubi[1] = result << 16 & 0xffff0000l;
- }
+ xsubi[0] = result & 0xffff;
+ xsubi[1] = (result >> 16) & 0xffff;
+ xsubi[2] = (result >> 32) & 0xffff;
return 0;
}
diff --git a/stdlib/drand48.c b/stdlib/drand48.c
index 4668ead..fe08a08 100644
--- a/stdlib/drand48.c
+++ b/stdlib/drand48.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -27,7 +27,7 @@ drand48 ()
{
double result;
- (void) __erand48_r (__libc_drand48_data.x, &__libc_drand48_data, &result);
+ (void) __erand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result);
return result;
}
diff --git a/stdlib/drand48_r.c b/stdlib/drand48_r.c
index 066c400..af52924 100644
--- a/stdlib/drand48_r.c
+++ b/stdlib/drand48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -26,5 +26,5 @@ drand48_r (buffer, result)
struct drand48_data *buffer;
double *result;
{
- return __erand48_r (buffer->x, buffer, result);
+ return __erand48_r (buffer->__x, buffer, result);
}
diff --git a/stdlib/erand48_r.c b/stdlib/erand48_r.c
index 85393b7..3ce78e3 100644
--- a/stdlib/erand48_r.c
+++ b/stdlib/erand48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1997, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -37,19 +37,10 @@ __erand48_r (xsubi, buffer, result)
/* Construct a positive double with the 48 random bits distributed over
its fractional part so the resulting FP number is [0.0,1.0). */
-#if USHRT_MAX == 65535
temp.ieee.negative = 0;
temp.ieee.exponent = IEEE754_DOUBLE_BIAS;
temp.ieee.mantissa0 = (xsubi[2] << 4) | (xsubi[1] >> 12);
temp.ieee.mantissa1 = ((xsubi[1] & 0xfff) << 20) | (xsubi[0] << 4);
-#elif USHRT_MAX == 2147483647
- temp.ieee.negative = 0;
- temp.ieee.exponent = IEEE754_DOUBLE_BIAS;
- temp.ieee.mantissa0 = (xsubi[1] << 4) | (xsubi[0] >> 28);
- temp.ieee.mantissa1 = ((xsubi[0] & 0xfffffff) << 4);
-#else
-# error Unsupported size of short int
-#endif
/* Please note the lower 4 bits of mantissa1 are always 0. */
*result = temp.d - 1.0;
diff --git a/stdlib/jrand48_r.c b/stdlib/jrand48_r.c
index 9df3694..dae1606 100644
--- a/stdlib/jrand48_r.c
+++ b/stdlib/jrand48_r.c
@@ -30,10 +30,7 @@ __jrand48_r (xsubi, buffer, result)
return -1;
/* Store the result. */
- if (sizeof (unsigned short int) == 2)
- *result = ((xsubi[2] << 16) | xsubi[1]) & 0xffffffffl;
- else
- *result = xsubi[2] & 0xffffffffl;
+ *result = ((xsubi[2] << 16) | xsubi[1]) & 0xffffffffl;
return 0;
}
diff --git a/stdlib/lcong48_r.c b/stdlib/lcong48_r.c
index 32b948c..27cab44 100644
--- a/stdlib/lcong48_r.c
+++ b/stdlib/lcong48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -17,6 +17,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
@@ -27,20 +28,11 @@ __lcong48_r (param, buffer)
struct drand48_data *buffer;
{
/* Store the given values. */
-#if USHRT_MAX == 0xffffU
- memcpy (buffer->x, &param[0], sizeof (buffer->x));
- memcpy (buffer->a, &param[3], sizeof (buffer->a));
-#else
- buffer->x[2] = (param[2] << 16) | param[1];
- buffer->x[1] = param[0] << 16;
- buffer->x[0] = 0;
-
- buffer->a[2] = (param[5] << 16) | param[4];
- buffer->a[1] = param[3] << 16;
- buffer->a[0] = 0;
-#endif
- buffer->c = param[6];
- buffer->init = 1;
+ memcpy (buffer->__x, &param[0], sizeof (buffer->__x));
+ buffer->__a = ((uint64_t) param[5] << 32 | (uint32_t) param[4] << 16
+ | param[3]);
+ buffer->__c = param[6];
+ buffer->__init = 1;
return 0;
}
diff --git a/stdlib/lrand48.c b/stdlib/lrand48.c
index 1857ed4..3442549 100644
--- a/stdlib/lrand48.c
+++ b/stdlib/lrand48.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -27,7 +27,7 @@ lrand48 ()
{
long int result;
- (void) __nrand48_r (__libc_drand48_data.x, &__libc_drand48_data, &result);
+ (void) __nrand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result);
return result;
}
diff --git a/stdlib/lrand48_r.c b/stdlib/lrand48_r.c
index 4890923..e1fe56c 100644
--- a/stdlib/lrand48_r.c
+++ b/stdlib/lrand48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -28,5 +28,5 @@ lrand48_r (buffer, result)
if (buffer == NULL)
return -1;
- return __nrand48_r (buffer->x, buffer, result);
+ return __nrand48_r (buffer->__x, buffer, result);
}
diff --git a/stdlib/mrand48.c b/stdlib/mrand48.c
index aebb9b0..fc62fdc 100644
--- a/stdlib/mrand48.c
+++ b/stdlib/mrand48.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -27,7 +27,7 @@ mrand48 ()
{
long int result;
- (void) __jrand48_r (__libc_drand48_data.x, &__libc_drand48_data, &result);
+ (void) __jrand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result);
return result;
}
diff --git a/stdlib/mrand48_r.c b/stdlib/mrand48_r.c
index 3ed5643..32c199e 100644
--- a/stdlib/mrand48_r.c
+++ b/stdlib/mrand48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -28,5 +28,5 @@ mrand48_r (buffer, result)
if (buffer == NULL)
return -1;
- return __jrand48_r (buffer->x, buffer, result);
+ return __jrand48_r (buffer->__x, buffer, result);
}
diff --git a/stdlib/seed48.c b/stdlib/seed48.c
index 19bb215..b6f9a74 100644
--- a/stdlib/seed48.c
+++ b/stdlib/seed48.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -28,5 +28,5 @@ seed48 (seed16v)
{
(void) __seed48_r (seed16v, &__libc_drand48_data);
- return __libc_drand48_data.old_x;
+ return __libc_drand48_data.__old_x;
}
diff --git a/stdlib/seed48_r.c b/stdlib/seed48_r.c
index 910a225..16706e9 100644
--- a/stdlib/seed48_r.c
+++ b/stdlib/seed48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -27,28 +27,15 @@ __seed48_r (seed16v, buffer)
struct drand48_data *buffer;
{
/* Save old value at a private place to be used as return value. */
- memcpy (buffer->old_x, buffer->x, sizeof (buffer->x));
+ memcpy (buffer->__old_x, buffer->__x, sizeof (buffer->__x));
/* Install new state. */
-#if USHRT_MAX == 0xffffU
- buffer->x[2] = seed16v[2];
- buffer->x[1] = seed16v[1];
- buffer->x[0] = seed16v[0];
-
- buffer->a[2] = 0x5;
- buffer->a[1] = 0xdeec;
- buffer->a[0] = 0xe66d;
-#else
- buffer->x[2] = (seed16v[2] << 16) | seed16v[1];
- buffer->x[1] = seed16v[0] << 16;
- buffer->x[0] = 0;
-
- buffer->a[2] = 0x5deecUL;
- buffer->a[1] = 0xe66d0000UL;
- buffer->a[0] = 0;
-#endif
- buffer->c = 0xb;
- buffer->init = 1;
+ buffer->__x[2] = seed16v[2];
+ buffer->__x[1] = seed16v[1];
+ buffer->__x[0] = seed16v[0];
+ buffer->__a = 0x5deece66dull;
+ buffer->__c = 0xb;
+ buffer->__init = 1;
return 0;
}
diff --git a/stdlib/srand48_r.c b/stdlib/srand48_r.c
index abaec32..9d0ca76 100644
--- a/stdlib/srand48_r.c
+++ b/stdlib/srand48_r.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@@ -29,25 +29,13 @@ __srand48_r (seedval, buffer)
if (sizeof (long int) > 4)
seedval &= 0xffffffffl;
-#if USHRT_MAX == 0xffffU
- buffer->x[2] = seedval >> 16;
- buffer->x[1] = seedval & 0xffffl;
- buffer->x[0] = 0x330e;
-
- buffer->a[2] = 0x5;
- buffer->a[1] = 0xdeec;
- buffer->a[0] = 0xe66d;
-#else
- buffer->x[2] = seedval;
- buffer->x[1] = 0x330e0000UL;
- buffer->x[0] = 0;
-
- buffer->a[2] = 0x5deecUL;
- buffer->a[1] = 0xe66d0000UL;
- buffer->a[0] = 0;
-#endif
- buffer->c = 0xb;
- buffer->init = 1;
+ buffer->__x[2] = seedval >> 16;
+ buffer->__x[1] = seedval & 0xffffl;
+ buffer->__x[0] = 0x330e;
+
+ buffer->__a = 0x5deece66dull;
+ buffer->__c = 0xb;
+ buffer->__init = 1;
return 0;
}
diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h
index de12734..17f19ac 100644
--- a/stdlib/stdlib.h
+++ b/stdlib/stdlib.h
@@ -474,17 +474,19 @@ extern void srand48 (long int __seedval) __THROW;
extern unsigned short int *seed48 (unsigned short int __seed16v[3]) __THROW;
extern void lcong48 (unsigned short int __param[7]) __THROW;
-/* Data structure for communication with thread safe versions. */
+# ifdef __USE_MISC
+/* Data structure for communication with thread safe versions. This
+ type is to be regarded as opaque. It's only exported because users
+ have to allocate objects of this type. */
struct drand48_data
{
- unsigned short int x[3]; /* Current state. */
- unsigned short int a[3]; /* Factor in congruential formula. */
- unsigned short int c; /* Additive const. in congruential formula. */
- unsigned short int old_x[3]; /* Old state. */
- int init; /* Flag for initializing. */
+ unsigned short int __x[3]; /* Current state. */
+ unsigned short int __old_x[3]; /* Old state. */
+ unsigned short int __c; /* Additive const. in congruential formula. */
+ unsigned short int __init; /* Flag for initializing. */
+ unsigned long long int __a; /* Factor in congruential formula. */
};
-# ifdef __USE_MISC
/* Return non-negative, double-precision floating-point value in [0.0,1.0). */
extern int drand48_r (struct drand48_data *__restrict __buffer,
double *__restrict __result) __THROW;