1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
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
_STUB_srand48()26 void _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
64 static unsigned short oldval[3];
65 static unsigned short X[3] = { 0, 0, XINIT};
66 static unsigned short a[3] = { A0, A1, A2};
67 static unsigned short c = C;
68
multadd(unsigned short x[3],unsigned short a[3],unsigned short c)69 static 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
drand48(void)87 extern 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
erand48(unsigned short xsubi[3])97 extern 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
jrand48(unsigned short xsubi[3])107 extern 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
lcong48(unsigned short param[7])115 extern 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
lrand48(void)126 extern 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
mrand48(void)134 extern 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
nrand48(unsigned short xsubi[3])142 extern 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
seed48(unsigned short seed[3])150 extern 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
srand48(long seedval)166 extern 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