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