xref: /netbsd-src/lib/libc/stdlib/_rand48.c (revision 21056e8a105df777084060ea210789fb6e09254f)
1*21056e8aSkamil /*	$NetBSD: _rand48.c,v 1.10 2020/02/23 09:53:42 kamil Exp $	*/
24e067afcSperry 
3933a7b3aSbrezak /*
4933a7b3aSbrezak  * Copyright (c) 1993 Martin Birgmeier
5933a7b3aSbrezak  * All rights reserved.
6933a7b3aSbrezak  *
7933a7b3aSbrezak  * You may redistribute unmodified or modified versions of this source
8933a7b3aSbrezak  * code provided that the above copyright notice and this and the
9933a7b3aSbrezak  * following conditions are retained.
10933a7b3aSbrezak  *
11933a7b3aSbrezak  * This software is provided ``as is'', and comes with no warranties
12933a7b3aSbrezak  * of any kind. I shall in no event be liable for anything that happens
13933a7b3aSbrezak  * to anyone/anything when using this software.
14933a7b3aSbrezak  */
15933a7b3aSbrezak 
1688c3eadbSlukem #include <sys/cdefs.h>
1788c3eadbSlukem #if defined(LIBC_SCCS) && !defined(lint)
18*21056e8aSkamil __RCSID("$NetBSD: _rand48.c,v 1.10 2020/02/23 09:53:42 kamil Exp $");
1988c3eadbSlukem #endif /* LIBC_SCCS and not lint */
2088c3eadbSlukem 
21b48252f3Slukem #include <assert.h>
22b48252f3Slukem 
23933a7b3aSbrezak #include "rand48.h"
24933a7b3aSbrezak 
25d2b1e8e4Sjtc unsigned short __rand48_seed[3] = {
26933a7b3aSbrezak 	RAND48_SEED_0,
27933a7b3aSbrezak 	RAND48_SEED_1,
28933a7b3aSbrezak 	RAND48_SEED_2
29933a7b3aSbrezak };
30d2b1e8e4Sjtc unsigned short __rand48_mult[3] = {
31933a7b3aSbrezak 	RAND48_MULT_0,
32933a7b3aSbrezak 	RAND48_MULT_1,
33933a7b3aSbrezak 	RAND48_MULT_2
34933a7b3aSbrezak };
35d2b1e8e4Sjtc unsigned short __rand48_add = RAND48_ADD;
36933a7b3aSbrezak 
37933a7b3aSbrezak void
__dorand48(unsigned short xseed[3])38aa13ae60Sjtc __dorand48(unsigned short xseed[3])
39933a7b3aSbrezak {
40933a7b3aSbrezak 	unsigned long accu;
41933a7b3aSbrezak 	unsigned short temp[2];
42933a7b3aSbrezak 
43b48252f3Slukem 	_DIAGASSERT(xseed != NULL);
44b48252f3Slukem 
452bddf737Skamil 	accu = (unsigned long) __rand48_mult[0] * (unsigned long) xseed[0];
462bddf737Skamil 	accu += (unsigned long) __rand48_add;
47933a7b3aSbrezak 	temp[0] = (unsigned short) accu;	/* lower 16 bits */
48933a7b3aSbrezak 	accu >>= sizeof(unsigned short) * 8;
492bddf737Skamil 	accu += (unsigned long) __rand48_mult[0] * (unsigned long) xseed[1];
502bddf737Skamil 	accu += (unsigned long) __rand48_mult[1] * (unsigned long) xseed[0];
51933a7b3aSbrezak 	temp[1] = (unsigned short) accu;	/* middle 16 bits */
52933a7b3aSbrezak 	accu >>= sizeof(unsigned short) * 8;
53*21056e8aSkamil 	accu += (unsigned long) __rand48_mult[0] * (unsigned long) xseed[2];
54*21056e8aSkamil 	accu += (unsigned long) __rand48_mult[1] * (unsigned long) xseed[1];
55*21056e8aSkamil 	accu += (unsigned long) __rand48_mult[2] * (unsigned long) xseed[0];
56933a7b3aSbrezak 	xseed[0] = temp[0];
57933a7b3aSbrezak 	xseed[1] = temp[1];
58933a7b3aSbrezak 	xseed[2] = (unsigned short) accu;
59933a7b3aSbrezak }
60