diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/common/random.c | 38 | ||||
-rw-r--r-- | firmware/include/stdlib.h | 6 |
2 files changed, 23 insertions, 21 deletions
diff --git a/firmware/common/random.c b/firmware/common/random.c index ebe60b091f..d23c29ee3d 100644 --- a/firmware/common/random.c +++ b/firmware/common/random.c | |||
@@ -49,10 +49,10 @@ | |||
49 | 49 | ||
50 | #define N (624) /* length of state vector */ | 50 | #define N (624) /* length of state vector */ |
51 | #define M (397) /* a period parameter */ | 51 | #define M (397) /* a period parameter */ |
52 | #define K (0x9908B0DFU) /* a magic constant */ | 52 | #define K (0x9908B0DFUL) /* a magic constant */ |
53 | #define hiBit(u) ((u) & 0x80000000U) /* mask all but highest bit of u */ | 53 | #define hiBit(u) ((u) & 0x80000000UL) /* mask all but highest bit of u */ |
54 | #define loBit(u) ((u) & 0x00000001U) /* mask all but lowest bit of u */ | 54 | #define loBit(u) ((u) & 0x00000001UL) /* mask all but lowest bit of u */ |
55 | #define loBits(u) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */ | 55 | #define loBits(u) ((u) & 0x7FFFFFFFUL) /* mask the highest bit of u */ |
56 | #define mixBits(u, v) (hiBit(u)|loBits(v)) /* move highest bit of u to | 56 | #define mixBits(u, v) (hiBit(u)|loBits(v)) /* move highest bit of u to |
57 | highest bit of v */ | 57 | highest bit of v */ |
58 | 58 | ||
@@ -60,7 +60,7 @@ static unsigned long state[N+1]; /* state vector + 1 to not violate ANSI C */ | |||
60 | static unsigned long *next; /* next random value is computed from here */ | 60 | static unsigned long *next; /* next random value is computed from here */ |
61 | static int left = -1; /* can *next++ this many times before reloading */ | 61 | static int left = -1; /* can *next++ this many times before reloading */ |
62 | 62 | ||
63 | void srand(unsigned long seed) | 63 | void srand(unsigned int seed) |
64 | { | 64 | { |
65 | /* | 65 | /* |
66 | * We initialize state[0..(N-1)] via the generator | 66 | * We initialize state[0..(N-1)] via the generator |
@@ -108,37 +108,37 @@ void srand(unsigned long seed) | |||
108 | * so-- that's why the only change I made is to restrict to odd seeds. | 108 | * so-- that's why the only change I made is to restrict to odd seeds. |
109 | */ | 109 | */ |
110 | 110 | ||
111 | unsigned long x = (seed | 1U) & 0xFFFFFFFFU, *s = state; | 111 | unsigned long x = (seed | 1UL) & 0xFFFFFFFFUL, *s = state; |
112 | int j; | 112 | int j; |
113 | 113 | ||
114 | for(left=0, *s++=x, j=N; --j; | 114 | for(left=0, *s++=x, j=N; --j; |
115 | *s++ = (x*=69069U) & 0xFFFFFFFFU); | 115 | *s++ = (x*=69069UL) & 0xFFFFFFFFUL); |
116 | } | 116 | } |
117 | 117 | ||
118 | static long rand_reload(void) | 118 | static int rand_reload(void) |
119 | { | 119 | { |
120 | unsigned long *p0=state, *p2=state+2, *pM=state+M, s0, s1; | 120 | unsigned long *p0=state, *p2=state+2, *pM=state+M, s0, s1; |
121 | int j; | 121 | int j; |
122 | 122 | ||
123 | if(left < -1) | 123 | if(left < -1) |
124 | srand(4357U); | 124 | srand(4357UL); |
125 | 125 | ||
126 | left=N-1, next=state+1; | 126 | left=N-1, next=state+1; |
127 | 127 | ||
128 | for(s0=state[0], s1=state[1], j=N-M+1; --j; s0=s1, s1=*p2++) | 128 | for(s0=state[0], s1=state[1], j=N-M+1; --j; s0=s1, s1=*p2++) |
129 | *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U); | 129 | *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0UL); |
130 | 130 | ||
131 | for(pM=state, j=M; --j; s0=s1, s1=*p2++) | 131 | for(pM=state, j=M; --j; s0=s1, s1=*p2++) |
132 | *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U); | 132 | *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0UL); |
133 | 133 | ||
134 | s1=state[0], *p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U); | 134 | s1=state[0], *p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0UL); |
135 | s1 ^= (s1 >> 11); | 135 | s1 ^= (s1 >> 11); |
136 | s1 ^= (s1 << 7) & 0x9D2C5680U; | 136 | s1 ^= (s1 << 7) & 0x9D2C5680UL; |
137 | s1 ^= (s1 << 15) & 0xEFC60000U; | 137 | s1 ^= (s1 << 15) & 0xEFC60000UL; |
138 | return (long)s1 ^ (s1 >> 18); | 138 | return (long)s1 ^ (s1 >> 18); |
139 | } | 139 | } |
140 | 140 | ||
141 | long rand(void) | 141 | int rand(void) |
142 | { | 142 | { |
143 | unsigned long y; | 143 | unsigned long y; |
144 | 144 | ||
@@ -148,10 +148,12 @@ long rand(void) | |||
148 | else { | 148 | else { |
149 | y = *next++; | 149 | y = *next++; |
150 | y ^= (y >> 11); | 150 | y ^= (y >> 11); |
151 | y ^= (y << 7) & 0x9D2C5680U; | 151 | y ^= (y << 7) & 0x9D2C5680UL; |
152 | y ^= (y << 15) & 0xEFC60000U; | 152 | y ^= (y << 15) & 0xEFC60000UL; |
153 | y ^= (y >> 18); | 153 | y ^= (y >> 18); |
154 | } | 154 | } |
155 | 155 | ||
156 | return (y & 0xfffffffe) >> 1; /* 31-bit limit by Björn Stenberg*/ | 156 | return ((unsigned int)y) >> 1; |
157 | /* 31-bit limit by Björn Stenberg*/ | ||
158 | /* 16-bit architectures compatibility by Jean-Philippe Bernardy */ | ||
157 | } | 159 | } |
diff --git a/firmware/include/stdlib.h b/firmware/include/stdlib.h index 874938cc07..894bf563fa 100644 --- a/firmware/include/stdlib.h +++ b/firmware/include/stdlib.h | |||
@@ -30,10 +30,10 @@ void *calloc (size_t nmemb, size_t size); | |||
30 | void free(void *); | 30 | void free(void *); |
31 | void *realloc(void *, size_t); | 31 | void *realloc(void *, size_t); |
32 | 32 | ||
33 | #define RAND_MAX 0x7fffffff | 33 | #define RAND_MAX INT_MAX |
34 | 34 | ||
35 | void srand(unsigned long seed); | 35 | void srand(unsigned int seed); |
36 | long rand(void); | 36 | int rand(void); |
37 | 37 | ||
38 | #define abs(x) ((x)>0?(x):-(x)) | 38 | #define abs(x) ((x)>0?(x):-(x)) |
39 | 39 | ||