diff options
author | Michael Brown <mcb30@etherboot.org> | 2007-01-19 02:02:59 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2007-01-19 02:02:59 +0000 |
commit | 4256b3338a414d7f2e63b0be403d362a0782a707 (patch) | |
tree | 37832836e5a2df57d5ad8356da68fdddbe680b1a | |
parent | f4c1e564a1da2f755b25019273b20aa7964dd784 (diff) | |
download | ipxe-4256b3338a414d7f2e63b0be403d362a0782a707.tar.gz |
Split random number generation out into core/random.c, and create the
correct prototypes for srandom(), rand() and srand().
-rw-r--r-- | src/core/misc.c | 18 | ||||
-rw-r--r-- | src/core/random.c | 38 | ||||
-rw-r--r-- | src/include/stdlib.h | 48 |
3 files changed, 82 insertions, 22 deletions
diff --git a/src/core/misc.c b/src/core/misc.c index e150709a1..e214a6284 100644 --- a/src/core/misc.c +++ b/src/core/misc.c @@ -55,24 +55,6 @@ uint16_t add_ipchksums(unsigned long offset, uint16_t sum, uint16_t new) return (~checksum) & 0xFFFF; } - - -/************************************************************************** -RANDOM - compute a random number between 0 and 2147483647L or 2147483562? -**************************************************************************/ -long int random(void) -{ - static int32_t seed = 0; - int32_t q; - if (!seed) /* Initialize linear congruential generator */ - seed = currticks(); - /* simplified version of the LCG given in Bruce Schneier's - "Applied Cryptography" */ - q = seed/53668; - if ((seed = 40014*(seed-53668*q) - 12211*q) < 0) seed += 2147483563L; - return seed; -} - /************************************************************************** SLEEP **************************************************************************/ diff --git a/src/core/random.c b/src/core/random.c new file mode 100644 index 000000000..c15bb6de3 --- /dev/null +++ b/src/core/random.c @@ -0,0 +1,38 @@ +/** @file + * + * Random number generation + * + */ + +#include <stdlib.h> + +static int32_t rnd_seed = 0; + +/** + * Seed the pseudo-random number generator + * + * @v seed Seed value + */ +void srandom ( unsigned int seed ) { + rnd_seed = seed; +} + +/** + * Generate a pseudo-random number between 0 and 2147483647L or 2147483562? + * + * @ret rand Pseudo-random number + */ +long int random ( void ) { + int32_t q; + + if ( ! rnd_seed ) /* Initialize linear congruential generator */ + srandom ( currticks() ); + + /* simplified version of the LCG given in Bruce Schneier's + "Applied Cryptography" */ + q = ( rnd_seed / 53668 ); + rnd_seed = ( 40014 * ( rnd_seed - 53668 * q ) - 12211 * q ); + if ( rnd_seed < 0 ) + rnd_seed += 2147483563L; + return rnd_seed; +} diff --git a/src/include/stdlib.h b/src/include/stdlib.h index 26b68351d..6a0e91633 100644 --- a/src/include/stdlib.h +++ b/src/include/stdlib.h @@ -2,14 +2,27 @@ #define STDLIB_H #include <stdint.h> +#include <assert.h> + +/***************************************************************************** + * + * Numeric parsing + * + **************************************************************************** + */ extern unsigned long strtoul ( const char *p, char **endp, int base ); -extern void * realloc ( void *old_ptr, size_t new_size ); + +/***************************************************************************** + * + * Memory allocation + * + **************************************************************************** + */ + extern void * malloc ( size_t size ); +extern void * realloc ( void *old_ptr, size_t new_size ); extern void free ( void *ptr ); -extern int system ( const char *command ); -extern long int random ( void ); - extern void * _calloc ( size_t len ); /** @@ -29,4 +42,31 @@ static inline void * calloc ( size_t nmemb, size_t size ) { return _calloc ( nmemb * size ); } +/***************************************************************************** + * + * Random number generation + * + **************************************************************************** + */ + +extern long int random ( void ); +extern void srandom ( unsigned int seed ); + +static inline int rand ( void ) { + return random(); +} + +static inline void srand ( unsigned int seed ) { + srandom ( seed ); +} + +/***************************************************************************** + * + * Miscellaneous + * + **************************************************************************** + */ + +extern int system ( const char *command ); + #endif /* STDLIB_H */ |