xref: /dflybsd-src/lib/libc/gen/_rand48.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /*
286d7f5d3SJohn Marino  * Copyright (c) 1993 Martin Birgmeier
386d7f5d3SJohn Marino  * All rights reserved.
486d7f5d3SJohn Marino  *
586d7f5d3SJohn Marino  * You may redistribute unmodified or modified versions of this source
686d7f5d3SJohn Marino  * code provided that the above copyright notice and this and the
786d7f5d3SJohn Marino  * following conditions are retained.
886d7f5d3SJohn Marino  *
986d7f5d3SJohn Marino  * This software is provided ``as is'', and comes with no warranties
1086d7f5d3SJohn Marino  * of any kind. I shall in no event be liable for anything that happens
1186d7f5d3SJohn Marino  * to anyone/anything when using this software.
1286d7f5d3SJohn Marino  */
1386d7f5d3SJohn Marino 
1486d7f5d3SJohn Marino #include "rand48.h"
1586d7f5d3SJohn Marino 
1686d7f5d3SJohn Marino unsigned short _rand48_seed[3] = {
1786d7f5d3SJohn Marino 	RAND48_SEED_0,
1886d7f5d3SJohn Marino 	RAND48_SEED_1,
1986d7f5d3SJohn Marino 	RAND48_SEED_2
2086d7f5d3SJohn Marino };
2186d7f5d3SJohn Marino unsigned short _rand48_mult[3] = {
2286d7f5d3SJohn Marino 	RAND48_MULT_0,
2386d7f5d3SJohn Marino 	RAND48_MULT_1,
2486d7f5d3SJohn Marino 	RAND48_MULT_2
2586d7f5d3SJohn Marino };
2686d7f5d3SJohn Marino unsigned short _rand48_add = RAND48_ADD;
2786d7f5d3SJohn Marino 
2886d7f5d3SJohn Marino void
_dorand48(unsigned short xseed[3])2986d7f5d3SJohn Marino _dorand48(unsigned short xseed[3])
3086d7f5d3SJohn Marino {
3186d7f5d3SJohn Marino 	unsigned long accu;
3286d7f5d3SJohn Marino 	unsigned short temp[2];
3386d7f5d3SJohn Marino 
3486d7f5d3SJohn Marino 	accu = (unsigned long) _rand48_mult[0] * (unsigned long) xseed[0] +
3586d7f5d3SJohn Marino 	 (unsigned long) _rand48_add;
3686d7f5d3SJohn Marino 	temp[0] = (unsigned short) accu;	/* lower 16 bits */
3786d7f5d3SJohn Marino 	accu >>= sizeof(unsigned short) * 8;
3886d7f5d3SJohn Marino 	accu += (unsigned long) _rand48_mult[0] * (unsigned long) xseed[1] +
3986d7f5d3SJohn Marino 	 (unsigned long) _rand48_mult[1] * (unsigned long) xseed[0];
4086d7f5d3SJohn Marino 	temp[1] = (unsigned short) accu;	/* middle 16 bits */
4186d7f5d3SJohn Marino 	accu >>= sizeof(unsigned short) * 8;
4286d7f5d3SJohn Marino 	accu += _rand48_mult[0] * xseed[2] + _rand48_mult[1] * xseed[1] + _rand48_mult[2] * xseed[0];
4386d7f5d3SJohn Marino 	xseed[0] = temp[0];
4486d7f5d3SJohn Marino 	xseed[1] = temp[1];
4586d7f5d3SJohn Marino 	xseed[2] = (unsigned short) accu;
4686d7f5d3SJohn Marino }
47