chiark / gitweb /
[PATCH] sync up with the 0.84 version of klibc
[elogind.git] / klibc / klibc / lrand48.c
1 /*
2  * lrand48.c
3  */
4
5 #include <stdlib.h>
6 #include <stdint.h>
7
8 unsigned short __rand48_seed[3];
9
10 long jrand48(unsigned short xsubi[3])
11 {
12   uint64_t x;
13
14   /* The xsubi[] array is littleendian by spec */
15   x = (uint64_t)xsubi[0] +
16     ((uint64_t)xsubi[1] << 16) +
17     ((uint64_t)xsubi[2] << 32);
18
19   x = (0x5deece66dULL * x) + 0xb;
20   
21   xsubi[0] = (unsigned short)x;
22   xsubi[1] = (unsigned short)(x >> 16);
23   xsubi[2] = (unsigned short)(x >> 32);
24
25   return (long)(int32_t)(x >> 16);
26 }
27
28 long mrand48(void)
29 {
30   return jrand48(__rand48_seed);
31 }
32
33 long nrand48(unsigned short xsubi[3])
34 {
35   return (long)((uint32_t)jrand48(xsubi) >> 1);
36 }
37
38 long lrand48(void)
39 {
40   return (long)((uint32_t)(mrand48() >> 1));
41 }
42