Loading...
--- Libc/Libc-1725.40.4/stdlib/FreeBSD/random.c
+++ Libc/Libc-320/stdlib/FreeBSD/random.c
@@ -10,6 +10,10 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
@@ -31,21 +35,11 @@
static char sccsid[] = "@(#)random.c 8.2 (Berkeley) 5/19/95";
#endif /* LIBC_SCCS and not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#ifdef __APPLE__
-// Always compile with __DARWIN_UNIX03=1 prototypes.
-// Applications using legacy interfaces (i386 only) use types of the same size:
-// sizeof(int) == sizeof(long) == sizeof(size_t)
-#undef __DARWIN_UNIX03
-#define __DARWIN_UNIX03 1
-#endif // __APPLE__
-
-#include "namespace.h"
+__FBSDID("$FreeBSD: src/lib/libc/stdlib/random.c,v 1.22 2003/02/04 11:24:08 ache Exp $");
+
#include "namespace.h"
#include <sys/time.h> /* for srandomdev() */
#include <fcntl.h> /* for srandomdev() */
-#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for srandomdev() */
@@ -67,10 +61,10 @@
* congruential generator. If the amount of state information is less than
* 32 bytes, a simple linear congruential R.N.G. is used.
*
- * Internally, the state information is treated as an array of uint32_t's; the
+ * Internally, the state information is treated as an array of longs; the
* zeroeth element of the array is the type of R.N.G. being used (small
* integer); the remainder of the array is the state information for the
- * R.N.G. Thus, 32 bytes of state information will give 7 ints worth of
+ * R.N.G. Thus, 32 bytes of state information will give 7 longs worth of
* state information, which will allow a degree seven polynomial. (Note:
* the zeroeth word of state information also has some other information
* stored in it -- see setstate() for details).
@@ -148,14 +142,10 @@
*/
#define MAX_TYPES 5 /* max number of types above */
-#ifdef USE_WEAK_SEEDING
-#define NSHUFF 0
-#else /* !USE_WEAK_SEEDING */
-#define NSHUFF 50 /* to drop some "seed -> 1st value" linearity */
-#endif /* !USE_WEAK_SEEDING */
-
-static const int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 };
-static const int seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 };
+#define NSHUFF 100 /* to drop part of seed -> 1st value correlation */
+
+static long degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 };
+static long seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 };
/*
* Initially, everything is set up as if from:
@@ -171,7 +161,7 @@
* MAX_TYPES * (rptr - state) + TYPE_3 == TYPE_3.
*/
-static uint32_t randtbl[DEG_3 + 1] = {
+static long randtbl[DEG_3 + 1] = {
TYPE_3,
#ifdef USE_WEAK_SEEDING
/* Historic implementation compatibility */
@@ -206,8 +196,8 @@
* in the initialization of randtbl) because the state table pointer is set
* to point to randtbl[1] (as explained below).
*/
-static uint32_t *fptr = &randtbl[SEP_3 + 1];
-static uint32_t *rptr = &randtbl[1];
+static long *fptr = &randtbl[SEP_3 + 1];
+static long *rptr = &randtbl[1];
/*
* The following things are the pointer to the state information table, the
@@ -219,14 +209,16 @@
* this is more efficient than indexing every time to find the address of
* the last element to see if the front and rear pointers have wrapped.
*/
-static uint32_t *state = &randtbl[1];
-static int rand_type = TYPE_3;
-static int rand_deg = DEG_3;
-static int rand_sep = SEP_3;
-static uint32_t *end_ptr = &randtbl[DEG_3 + 1];
-
-static inline uint32_t
-good_rand(int32_t x)
+static long *state = &randtbl[1];
+static long rand_type = TYPE_3;
+static long rand_deg = DEG_3;
+static long rand_sep = SEP_3;
+static long *end_ptr = &randtbl[DEG_3 + 1];
+
+static inline long good_rand(long);
+
+static inline long good_rand (x)
+ long x;
{
#ifdef USE_WEAK_SEEDING
/*
@@ -244,7 +236,7 @@
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
* October 1988, p. 1195.
*/
- int32_t hi, lo;
+ long hi, lo;
/* Can't be initialized with 0, so use another value. */
if (x == 0)
@@ -271,15 +263,12 @@
* for default usage relies on values produced by this routine.
*/
void
-#ifdef __APPLE__
-srandom(unsigned int x)
-#else
-srandom(unsigned long x)
-#endif
+srandom(x)
+ unsigned long x;
{
- int i, lim;
-
- state[0] = (uint32_t)x;
+ long i, lim;
+
+ state[0] = x;
if (rand_type == TYPE_0)
lim = NSHUFF;
else {
@@ -305,7 +294,7 @@
* a fixed seed.
*/
void
-srandomdev(void)
+srandomdev()
{
int fd, done;
size_t len;
@@ -316,7 +305,7 @@
len = rand_deg * sizeof state[0];
done = 0;
- fd = _open("/dev/random", O_RDONLY | O_CLOEXEC, 0);
+ fd = _open("/dev/random", O_RDONLY, 0);
if (fd >= 0) {
if (_read(fd, (void *) state, len) == (ssize_t) len)
done = 1;
@@ -325,9 +314,10 @@
if (!done) {
struct timeval tv;
+ unsigned long junk;
gettimeofday(&tv, NULL);
- srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec);
+ srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk);
return;
}
@@ -356,19 +346,18 @@
*
* Returns a pointer to the old state.
*
- * Note: The Sparc platform requires that arg_state begin on an int
+ * Note: The Sparc platform requires that arg_state begin on a long
* word boundary; otherwise a bus error will occur. Even so, lint will
* complain about mis-alignment, but you should disregard these messages.
*/
char *
-#ifdef __APPLE__
-initstate(unsigned int seed, char *arg_state, size_t n)
-#else
-initstate(unsigned long seed, char *arg_state, long n)
-#endif
+initstate(seed, arg_state, n)
+ unsigned long seed; /* seed for R.N.G. */
+ char *arg_state; /* pointer to state array */
+ long n; /* # bytes of state info */
{
char *ostate = (char *)(&state[-1]);
- uint32_t *int_arg_state = (uint32_t *)arg_state;
+ long *long_arg_state = (long *) arg_state;
if (rand_type == TYPE_0)
state[-1] = rand_type;
@@ -377,7 +366,7 @@
if (n < BREAK_0) {
(void)fprintf(stderr,
"random: not enough state (%ld bytes); ignored.\n", n);
- return (0);
+ return(0);
}
if (n < BREAK_1) {
rand_type = TYPE_0;
@@ -400,14 +389,14 @@
rand_deg = DEG_4;
rand_sep = SEP_4;
}
- state = int_arg_state + 1; /* first location */
+ state = (long *) (long_arg_state + 1); /* first location */
end_ptr = &state[rand_deg]; /* must set end_ptr before srandom */
srandom(seed);
if (rand_type == TYPE_0)
- int_arg_state[0] = rand_type;
+ long_arg_state[0] = rand_type;
else
- int_arg_state[0] = MAX_TYPES * (rptr - state) + rand_type;
- return (ostate);
+ long_arg_state[0] = MAX_TYPES * (rptr - state) + rand_type;
+ return(ostate);
}
/*
@@ -425,16 +414,17 @@
*
* Returns a pointer to the old state information.
*
- * Note: The Sparc platform requires that arg_state begin on an int
+ * Note: The Sparc platform requires that arg_state begin on a long
* word boundary; otherwise a bus error will occur. Even so, lint will
* complain about mis-alignment, but you should disregard these messages.
*/
char *
-setstate(const char *arg_state)
+setstate(arg_state)
+ char *arg_state; /* pointer to state array */
{
- uint32_t *new_state = (uint32_t *)arg_state;
- uint32_t type = new_state[0] % MAX_TYPES;
- uint32_t rear = new_state[0] / MAX_TYPES;
+ long *new_state = (long *) arg_state;
+ long type = new_state[0] % MAX_TYPES;
+ long rear = new_state[0] / MAX_TYPES;
char *ostate = (char *)(&state[-1]);
if (rand_type == TYPE_0)
@@ -455,13 +445,13 @@
(void)fprintf(stderr,
"random: state info corrupted; not changed.\n");
}
- state = new_state + 1;
+ state = (long *) (new_state + 1);
if (rand_type != TYPE_0) {
rptr = &state[rear];
fptr = &state[(rear + rand_sep) % rand_deg];
}
end_ptr = &state[rand_deg]; /* set end_ptr too */
- return (ostate);
+ return(ostate);
}
/*
@@ -482,10 +472,10 @@
* Returns a 31-bit random number.
*/
long
-random(void)
+random()
{
- uint32_t i;
- uint32_t *f, *r;
+ long i;
+ long *f, *r;
if (rand_type == TYPE_0) {
i = state[0];
@@ -507,5 +497,5 @@
fptr = f; rptr = r;
}
- return ((long)i);
+ return(i);
}