]>
Commit | Line | Data |
---|---|---|
5b2abdfb A |
1 | /* |
2 | * Copyright (c) 1993 Martin Birgmeier | |
3 | * All rights reserved. | |
4 | * | |
5 | * You may redistribute unmodified or modified versions of this source | |
6 | * code provided that the above copyright notice and this and the | |
7 | * following conditions are retained. | |
8 | * | |
9 | * This software is provided ``as is'', and comes with no warranties | |
10 | * of any kind. I shall in no event be liable for anything that happens | |
11 | * to anyone/anything when using this software. | |
12 | */ | |
13 | ||
9385eb3d A |
14 | #include <sys/cdefs.h> |
15 | __FBSDID("$FreeBSD: src/lib/libc/gen/_rand48.c,v 1.2 2002/03/22 21:52:05 obrien Exp $"); | |
16 | ||
5b2abdfb A |
17 | #include "rand48.h" |
18 | ||
19 | unsigned short _rand48_seed[3] = { | |
20 | RAND48_SEED_0, | |
21 | RAND48_SEED_1, | |
22 | RAND48_SEED_2 | |
23 | }; | |
24 | unsigned short _rand48_mult[3] = { | |
25 | RAND48_MULT_0, | |
26 | RAND48_MULT_1, | |
27 | RAND48_MULT_2 | |
28 | }; | |
29 | unsigned short _rand48_add = RAND48_ADD; | |
30 | ||
31 | void | |
32 | _dorand48(unsigned short xseed[3]) | |
33 | { | |
34 | unsigned long accu; | |
35 | unsigned short temp[2]; | |
36 | ||
37 | accu = (unsigned long) _rand48_mult[0] * (unsigned long) xseed[0] + | |
38 | (unsigned long) _rand48_add; | |
39 | temp[0] = (unsigned short) accu; /* lower 16 bits */ | |
40 | accu >>= sizeof(unsigned short) * 8; | |
41 | accu += (unsigned long) _rand48_mult[0] * (unsigned long) xseed[1] + | |
42 | (unsigned long) _rand48_mult[1] * (unsigned long) xseed[0]; | |
43 | temp[1] = (unsigned short) accu; /* middle 16 bits */ | |
44 | accu >>= sizeof(unsigned short) * 8; | |
45 | accu += _rand48_mult[0] * xseed[2] + _rand48_mult[1] * xseed[1] + _rand48_mult[2] * xseed[0]; | |
46 | xseed[0] = temp[0]; | |
47 | xseed[1] = temp[1]; | |
48 | xseed[2] = (unsigned short) accu; | |
49 | } |