1*4887Schin /*********************************************************************** 2*4887Schin * * 3*4887Schin * This software is part of the ast package * 4*4887Schin * Copyright (c) 1985-2007 AT&T Knowledge Ventures * 5*4887Schin * and is licensed under the * 6*4887Schin * Common Public License, Version 1.0 * 7*4887Schin * by AT&T Knowledge Ventures * 8*4887Schin * * 9*4887Schin * A copy of the License is available at * 10*4887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 11*4887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12*4887Schin * * 13*4887Schin * Information and Software Systems Research * 14*4887Schin * AT&T Research * 15*4887Schin * Florham Park NJ * 16*4887Schin * * 17*4887Schin * Glenn Fowler <gsf@research.att.com> * 18*4887Schin * David Korn <dgk@research.att.com> * 19*4887Schin * Phong Vo <kpv@research.att.com> * 20*4887Schin * * 21*4887Schin ***********************************************************************/ 22*4887Schin #include "FEATURE/uwin" 23*4887Schin 24*4887Schin #if !_UWIN || _lib_srand48 25*4887Schin 26*4887Schin void _STUB_srand48(){} 27*4887Schin 28*4887Schin #else 29*4887Schin 30*4887Schin #define drand48 ______drand48 31*4887Schin #define erand48 ______erand48 32*4887Schin #define jrand48 ______jrand48 33*4887Schin #define lcong48 ______lcong48 34*4887Schin #define lrand48 ______lrand48 35*4887Schin #define mrand48 ______mrand48 36*4887Schin #define nrand48 ______nrand48 37*4887Schin #define seed48 ______seed48 38*4887Schin #define srand48 ______srand48 39*4887Schin 40*4887Schin #include <stdlib.h> 41*4887Schin 42*4887Schin #undef drand48 43*4887Schin #undef erand48 44*4887Schin #undef jrand48 45*4887Schin #undef lcong48 46*4887Schin #undef lrand48 47*4887Schin #undef mrand48 48*4887Schin #undef nrand48 49*4887Schin #undef seed48 50*4887Schin #undef srand48 51*4887Schin 52*4887Schin #if defined(__EXPORT__) 53*4887Schin #define extern __EXPORT__ 54*4887Schin #endif 55*4887Schin 56*4887Schin #define A 0x5DEECE66D 57*4887Schin #define A0 0X5 58*4887Schin #define A1 0xDEEC 59*4887Schin #define A2 0xE66D 60*4887Schin #define C 0xB 61*4887Schin #define XINIT 0x330E 62*4887Schin #define SCALE 3.55271e-15 63*4887Schin 64*4887Schin static unsigned short oldval[3]; 65*4887Schin static unsigned short X[3] = { 0, 0, XINIT}; 66*4887Schin static unsigned short a[3] = { A0, A1, A2}; 67*4887Schin static unsigned short c = C; 68*4887Schin 69*4887Schin static void multadd(unsigned short x[3], unsigned short a[3], unsigned short c) 70*4887Schin { 71*4887Schin register unsigned long r = c; 72*4887Schin unsigned short x2 = x[2]; 73*4887Schin unsigned short x1 = x[1]; 74*4887Schin r += a[2]*x2; 75*4887Schin x[2] = (unsigned short)r; 76*4887Schin r >>= 16; 77*4887Schin r += a[1]*x2; 78*4887Schin r += a[2]*x1; 79*4887Schin x[1] = (unsigned short)r; 80*4887Schin r >>= 16; 81*4887Schin r += a[2]*x[0]; 82*4887Schin r += a[1]*x1; 83*4887Schin r += a[0]*x2; 84*4887Schin x[0] = (unsigned short)r; 85*4887Schin } 86*4887Schin 87*4887Schin extern double drand48(void) 88*4887Schin { 89*4887Schin double d; 90*4887Schin unsigned long u; 91*4887Schin multadd(X,a,c); 92*4887Schin u = (X[0]<<16) + X[1]; 93*4887Schin d = (u*65536.) + X[2]; 94*4887Schin return(d*SCALE); 95*4887Schin } 96*4887Schin 97*4887Schin extern double erand48(unsigned short xsubi[3]) 98*4887Schin { 99*4887Schin double d; 100*4887Schin unsigned long u; 101*4887Schin multadd(xsubi,a,c); 102*4887Schin u = (xsubi[0]<<16) + xsubi[1]; 103*4887Schin d = (u*65536.) + xsubi[2]; 104*4887Schin return(d*SCALE); 105*4887Schin } 106*4887Schin 107*4887Schin extern long jrand48(unsigned short xsubi[3]) 108*4887Schin { 109*4887Schin long u; 110*4887Schin multadd(xsubi,a,c); 111*4887Schin u = (xsubi[0]<<16) | xsubi[1]; 112*4887Schin return((long)u); 113*4887Schin } 114*4887Schin 115*4887Schin extern void lcong48(unsigned short param[7]) 116*4887Schin { 117*4887Schin X[0] = param[0]; 118*4887Schin X[1] = param[1]; 119*4887Schin X[2] = param[2]; 120*4887Schin a[0] = param[3]; 121*4887Schin a[1] = param[4]; 122*4887Schin a[2] = param[5]; 123*4887Schin c = param[6]; 124*4887Schin } 125*4887Schin 126*4887Schin extern long lrand48(void) 127*4887Schin { 128*4887Schin long l; 129*4887Schin multadd(X,a,c); 130*4887Schin l = (X[0]<<15)|(X[1]>>1); 131*4887Schin return(l); 132*4887Schin } 133*4887Schin 134*4887Schin extern long mrand48(void) 135*4887Schin { 136*4887Schin unsigned long u; 137*4887Schin multadd(X,a,c); 138*4887Schin u = (X[0]<<16) | X[1]; 139*4887Schin return((long)u); 140*4887Schin } 141*4887Schin 142*4887Schin extern long nrand48(unsigned short xsubi[3]) 143*4887Schin { 144*4887Schin long l; 145*4887Schin multadd(xsubi,a,c); 146*4887Schin l = (xsubi[0]<<15)|(xsubi[1]>>1); 147*4887Schin return(l); 148*4887Schin } 149*4887Schin 150*4887Schin extern unsigned short *seed48(unsigned short seed[3]) 151*4887Schin { 152*4887Schin unsigned short *sp = (unsigned short*)&X; 153*4887Schin a[0] = A0; 154*4887Schin a[1] = A1; 155*4887Schin a[2] = A2; 156*4887Schin c = C; 157*4887Schin oldval[0] = X[2]; 158*4887Schin oldval[1] = X[1]; 159*4887Schin oldval[2] = X[0]; 160*4887Schin X[0] = seed[2]; 161*4887Schin X[1] = seed[1]; 162*4887Schin X[2] = seed[0]; 163*4887Schin return(oldval); 164*4887Schin } 165*4887Schin 166*4887Schin extern void srand48(long seedval) 167*4887Schin { 168*4887Schin a[0] = A0; 169*4887Schin a[1] = A1; 170*4887Schin a[2] = A2; 171*4887Schin c = C; 172*4887Schin X[0] = (unsigned short)(((unsigned long)seedval) >> 16); 173*4887Schin X[1] = (unsigned short)seedval; 174*4887Schin X[2] = XINIT; 175*4887Schin } 176*4887Schin 177*4887Schin #endif 178