14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*8462SApril.Chin@Sun.COM * Copyright (c) 1985-2008 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 7*8462SApril.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 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 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 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 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 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 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 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 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 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 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 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