chiark / gitweb /
[PATCH] klibc: version 1.0.3
[elogind.git] / klibc / klibc / jrand48.c
1 /*
2  * jrand48.c
3  */
4
5 #include <stdlib.h>
6 #include <stdint.h>
7
8 long jrand48(unsigned short xsubi[3])
9 {
10   uint64_t x;
11
12   /* The xsubi[] array is littleendian by spec */
13   x = (uint64_t)(uint16_t)xsubi[0] +
14     ((uint64_t)(uint16_t)xsubi[1] << 16) +
15     ((uint64_t)(uint16_t)xsubi[2] << 32);
16
17   x = (0x5deece66dULL * x) + 0xb;
18   
19   xsubi[0] = (unsigned short)(uint16_t)x;
20   xsubi[1] = (unsigned short)(uint16_t)(x >> 16);
21   xsubi[2] = (unsigned short)(uint16_t)(x >> 32);
22
23   return (long)(int32_t)(x >> 16);
24 }