summaryrefslogtreecommitdiff
path: root/components/libc
diff options
context:
space:
mode:
author[email protected] <[email protected]>2010-10-15 23:31:11 +0000
committer[email protected] <[email protected]>2010-10-15 23:31:11 +0000
commit0395886e11624982aac4c103733ff95e86148559 (patch)
tree56cf295c832ddf437ab0e2b34655a6bd45cda8b7 /components/libc
parent9e324032b6ddaa25086af371a43d80eea3aa23fe (diff)
add rand function in minilibc.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1011 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/libc')
-rw-r--r--components/libc/minilibc/ctype.c5
-rw-r--r--components/libc/minilibc/ctype.h1
-rw-r--r--components/libc/minilibc/rand.c35
-rw-r--r--components/libc/minilibc/stdlib.h4
-rw-r--r--components/libc/minilibc/sys/types.h3
5 files changed, 48 insertions, 0 deletions
diff --git a/components/libc/minilibc/ctype.c b/components/libc/minilibc/ctype.c
index 8e02e1a904..786ff472f8 100644
--- a/components/libc/minilibc/ctype.c
+++ b/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
diff --git a/components/libc/minilibc/ctype.h b/components/libc/minilibc/ctype.h
index fdbf7bf003..9a773b69ab 100644
--- a/components/libc/minilibc/ctype.h
+++ b/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
diff --git a/components/libc/minilibc/rand.c b/components/libc/minilibc/rand.c
new file mode 100644
index 0000000000..46a96ac5bb
--- /dev/null
+++ b/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")));
diff --git a/components/libc/minilibc/stdlib.h b/components/libc/minilibc/stdlib.h
index 89318b30d9..93c9b19b5c 100644
--- a/components/libc/minilibc/stdlib.h
+++ b/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
diff --git a/components/libc/minilibc/sys/types.h b/components/libc/minilibc/sys/types.h
index a9a1dafa2e..2be1f34403 100644
--- a/components/libc/minilibc/sys/types.h
+++ b/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;