xref: /onnv-gate/usr/src/lib/libast/common/uwin/rand48.c (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
184887Schin *                  David Korn <dgk@research.att.com>                   *
194887Schin *                   Phong Vo <kpv@research.att.com>                    *
204887Schin *                                                                      *
214887Schin ***********************************************************************/
224887Schin #include "FEATURE/uwin"
234887Schin 
244887Schin #if !_UWIN || _lib_srand48
254887Schin 
_STUB_srand48()264887Schin void _STUB_srand48(){}
274887Schin 
284887Schin #else
294887Schin 
304887Schin #define drand48	______drand48
314887Schin #define erand48	______erand48
324887Schin #define jrand48	______jrand48
334887Schin #define lcong48	______lcong48
344887Schin #define lrand48	______lrand48
354887Schin #define mrand48	______mrand48
364887Schin #define nrand48	______nrand48
374887Schin #define seed48	______seed48
384887Schin #define srand48	______srand48
394887Schin 
404887Schin #include	<stdlib.h>
414887Schin 
424887Schin #undef	drand48
434887Schin #undef	erand48
444887Schin #undef	jrand48
454887Schin #undef	lcong48
464887Schin #undef	lrand48
474887Schin #undef	mrand48
484887Schin #undef	nrand48
494887Schin #undef	seed48
504887Schin #undef	srand48
514887Schin 
524887Schin #if defined(__EXPORT__)
534887Schin #define extern		__EXPORT__
544887Schin #endif
554887Schin 
564887Schin #define A	0x5DEECE66D
574887Schin #define A0	0X5
584887Schin #define A1	0xDEEC
594887Schin #define A2	0xE66D
604887Schin #define C	0xB
614887Schin #define XINIT	0x330E
624887Schin #define SCALE	3.55271e-15
634887Schin 
644887Schin static unsigned short oldval[3];
654887Schin static unsigned short X[3] = { 0, 0, XINIT};
664887Schin static unsigned short a[3] = { A0, A1, A2};
674887Schin static unsigned short c = C;
684887Schin 
multadd(unsigned short x[3],unsigned short a[3],unsigned short c)694887Schin static void multadd(unsigned short x[3], unsigned short a[3], unsigned short c)
704887Schin {
714887Schin 	register unsigned long r = c;
724887Schin 	unsigned short x2 = x[2];
734887Schin 	unsigned short x1 = x[1];
744887Schin 	r += a[2]*x2;
754887Schin 	x[2] = (unsigned short)r;
764887Schin 	r >>= 16;
774887Schin 	r += a[1]*x2;
784887Schin 	r += a[2]*x1;
794887Schin 	x[1] = (unsigned short)r;
804887Schin 	r >>= 16;
814887Schin 	r += a[2]*x[0];
824887Schin 	r += a[1]*x1;
834887Schin 	r += a[0]*x2;
844887Schin 	x[0] = (unsigned short)r;
854887Schin }
864887Schin 
drand48(void)874887Schin extern double drand48(void)
884887Schin {
894887Schin 	double d;
904887Schin 	unsigned long u;
914887Schin 	multadd(X,a,c);
924887Schin 	u = (X[0]<<16) + X[1];
934887Schin 	d = (u*65536.) + X[2];
944887Schin 	return(d*SCALE);
954887Schin }
964887Schin 
erand48(unsigned short xsubi[3])974887Schin extern double erand48(unsigned short xsubi[3])
984887Schin {
994887Schin 	double d;
1004887Schin 	unsigned long u;
1014887Schin 	multadd(xsubi,a,c);
1024887Schin 	u = (xsubi[0]<<16) + xsubi[1];
1034887Schin 	d = (u*65536.) + xsubi[2];
1044887Schin 	return(d*SCALE);
1054887Schin }
1064887Schin 
jrand48(unsigned short xsubi[3])1074887Schin extern long jrand48(unsigned short xsubi[3])
1084887Schin {
1094887Schin 	long u;
1104887Schin 	multadd(xsubi,a,c);
1114887Schin 	u = (xsubi[0]<<16) | xsubi[1];
1124887Schin 	return((long)u);
1134887Schin }
1144887Schin 
lcong48(unsigned short param[7])1154887Schin extern void lcong48(unsigned short param[7])
1164887Schin {
1174887Schin 	X[0] = param[0];
1184887Schin 	X[1] = param[1];
1194887Schin 	X[2] = param[2];
1204887Schin 	a[0] = param[3];
1214887Schin 	a[1] = param[4];
1224887Schin 	a[2] = param[5];
1234887Schin 	c = param[6];
1244887Schin }
1254887Schin 
lrand48(void)1264887Schin extern long lrand48(void)
1274887Schin {
1284887Schin 	long l;
1294887Schin 	multadd(X,a,c);
1304887Schin 	l = (X[0]<<15)|(X[1]>>1);
1314887Schin 	return(l);
1324887Schin }
1334887Schin 
mrand48(void)1344887Schin extern long mrand48(void)
1354887Schin {
1364887Schin 	unsigned long u;
1374887Schin 	multadd(X,a,c);
1384887Schin 	u = (X[0]<<16) | X[1];
1394887Schin 	return((long)u);
1404887Schin }
1414887Schin 
nrand48(unsigned short xsubi[3])1424887Schin extern long nrand48(unsigned short xsubi[3])
1434887Schin {
1444887Schin 	long l;
1454887Schin 	multadd(xsubi,a,c);
1464887Schin 	l = (xsubi[0]<<15)|(xsubi[1]>>1);
1474887Schin 	return(l);
1484887Schin }
1494887Schin 
seed48(unsigned short seed[3])1504887Schin extern unsigned short *seed48(unsigned short seed[3])
1514887Schin {
1524887Schin 	unsigned short *sp = (unsigned short*)&X;
1534887Schin 	a[0] = A0;
1544887Schin 	a[1] = A1;
1554887Schin 	a[2] = A2;
1564887Schin 	c = C;
1574887Schin 	oldval[0] = X[2];
1584887Schin 	oldval[1] = X[1];
1594887Schin 	oldval[2] = X[0];
1604887Schin 	X[0] = seed[2];
1614887Schin 	X[1] = seed[1];
1624887Schin 	X[2] = seed[0];
1634887Schin 	return(oldval);
1644887Schin }
1654887Schin 
srand48(long seedval)1664887Schin extern void srand48(long seedval)
1674887Schin {
1684887Schin 	a[0] = A0;
1694887Schin 	a[1] = A1;
1704887Schin 	a[2] = A2;
1714887Schin 	c = C;
1724887Schin 	X[0] = (unsigned short)(((unsigned long)seedval) >> 16);
1734887Schin 	X[1] = (unsigned short)seedval;
1744887Schin 	X[2] = XINIT;
1754887Schin }
1764887Schin 
1774887Schin #endif
178