From 0395886e11624982aac4c103733ff95e86148559 Mon Sep 17 00:00:00 2001 From: "bernard.xiong@gmail.com" Date: Fri, 15 Oct 2010 23:31:11 +0000 Subject: [PATCH] add rand function in minilibc. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1011 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/libc/minilibc/ctype.c | 5 ++++ components/libc/minilibc/ctype.h | 1 + components/libc/minilibc/rand.c | 35 ++++++++++++++++++++++++++++ components/libc/minilibc/stdlib.h | 4 ++++ components/libc/minilibc/sys/types.h | 3 +++ 5 files changed, 48 insertions(+) create mode 100644 components/libc/minilibc/rand.c diff --git a/components/libc/minilibc/ctype.c b/components/libc/minilibc/ctype.c index 8e02e1a90..786ff472f 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 fdbf7bf00..9a773b69a 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 000000000..46a96ac5b --- /dev/null +++ b/components/libc/minilibc/rand.c @@ -0,0 +1,35 @@ +#include +#include + +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 89318b30d..93c9b19b5 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 a9a1dafa2..2be1f3440 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; -- GitLab