Browse Source

add rand function in minilibc.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1011 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong@gmail.com 14 years ago
parent
commit
0395886e11

+ 5 - 0
components/libc/minilibc/ctype.c

@@ -29,4 +29,9 @@ int isalpha(int ch)
 	return (unsigned int)((ch | 0x20) - 'a') < 26u;
 }
 
+int isdigit (int ch)
+{
+    return (unsigned int)(ch - '0') < 10u;
+}
+
 #endif

+ 1 - 0
components/libc/minilibc/ctype.h

@@ -16,5 +16,6 @@
 
 int isprint(int c) __attribute__ ((__const__));
 int isalpha (int c) __attribute__ ((__const__));
+int isdigit (int ch) __attribute__ ((__const__));
 
 #endif

+ 35 - 0
components/libc/minilibc/rand.c

@@ -0,0 +1,35 @@
+#include <stdlib.h>
+#include <sys/types.h>
+
+static unsigned int seed=1;
+
+/* Knuth's TAOCP section 3.6 */
+#define	M	((1U<<31) -1)
+#define	A	48271
+#define	Q	44488		// M/A
+#define	R	3399		// M%A; R < Q !!!
+
+// FIXME: ISO C/SuS want a longer period
+int rand_r(unsigned int* seed)
+{   int32_t X;
+
+    X = *seed;
+    X = A*(X%Q) - R * (int32_t) (X/Q);
+    if (X < 0)
+	X += M;
+
+    *seed = X;
+    return X;
+}
+
+int rand(void) {
+  return rand_r(&seed);
+}
+
+void srand(unsigned int i)
+{ 
+	seed=i;
+}
+
+int random(void) __attribute__((alias("rand")));
+void srandom(unsigned int i) __attribute__((alias("srand")));

+ 4 - 0
components/libc/minilibc/stdlib.h

@@ -24,4 +24,8 @@ int atoi(const char *nptr);
 #define realloc rt_realloc
 #define calloc  rt_calloc
 
+int rand(void);
+int rand_r(unsigned int *seed);
+void srand(unsigned int seed);
+
 #endif

+ 3 - 0
components/libc/minilibc/sys/types.h

@@ -14,6 +14,9 @@ typedef rt_uint32_t u_long;
 typedef rt_uint8_t 	u_int8_t;
 typedef rt_uint16_t u_int16_t;
 typedef rt_uint32_t u_int32_t;
+typedef rt_int8_t 	int8_t;
+typedef rt_int16_t  int16_t;
+typedef rt_int32_t  int32_t;
 
 typedef rt_time_t time_t;