Split random number generation out into core/random.c, and create the
authorMichael Brown <mcb30@etherboot.org>
Fri, 19 Jan 2007 02:02:59 +0000 (02:02 +0000)
committerMichael Brown <mcb30@etherboot.org>
Fri, 19 Jan 2007 02:02:59 +0000 (02:02 +0000)
correct prototypes for srandom(), rand() and srand().

src/core/misc.c
src/core/random.c [new file with mode: 0644]
src/include/stdlib.h

index e150709..e214a62 100644 (file)
@@ -55,24 +55,6 @@ uint16_t add_ipchksums(unsigned long offset, uint16_t sum, uint16_t new)
        return (~checksum) & 0xFFFF;
 }
 
        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
 **************************************************************************/
 /**************************************************************************
 SLEEP
 **************************************************************************/
diff --git a/src/core/random.c b/src/core/random.c
new file mode 100644 (file)
index 0000000..c15bb6d
--- /dev/null
@@ -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;
+}
index 26b6835..6a0e916 100644 (file)
@@ -2,14 +2,27 @@
 #define STDLIB_H
 
 #include <stdint.h>
 #define STDLIB_H
 
 #include <stdint.h>
+#include <assert.h>
+
+/*****************************************************************************
+ *
+ * Numeric parsing
+ *
+ ****************************************************************************
+ */
 
 extern unsigned long strtoul ( const char *p, char **endp, int base );
 
 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 * malloc ( size_t size );
+extern void * realloc ( void *old_ptr, size_t new_size );
 extern void free ( void *ptr );
 extern void free ( void *ptr );
-extern int system ( const char *command );
-extern long int random ( void );
-
 extern void * _calloc ( size_t len );
 
 /**
 extern void * _calloc ( size_t len );
 
 /**
@@ -29,4 +42,31 @@ static inline void * calloc ( size_t nmemb, size_t size ) {
        return _calloc ( nmemb * 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 */
 #endif /* STDLIB_H */