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