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