strtod: avoid C99 decl-after-statement
[gnulib.git] / lib / random_r.c
1 /*
2    Copyright (C) 1995, 2005, 2008 Free Software Foundation
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 /*
20    Copyright (C) 1983 Regents of the University of California.
21    All rights reserved.
22
23    Redistribution and use in source and binary forms, with or without
24    modification, are permitted provided that the following conditions
25    are met:
26
27    1. Redistributions of source code must retain the above copyright
28       notice, this list of conditions and the following disclaimer.
29    2. Redistributions in binary form must reproduce the above copyright
30       notice, this list of conditions and the following disclaimer in the
31       documentation and/or other materials provided with the distribution.
32    4. Neither the name of the University nor the names of its contributors
33       may be used to endorse or promote products derived from this software
34       without specific prior written permission.
35
36    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
37    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
39    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
40    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
41    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
42    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
44    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
45    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46    SUCH DAMAGE.*/
47
48 /*
49  * This is derived from the Berkeley source:
50  *      @(#)random.c    5.5 (Berkeley) 7/6/88
51  * It was reworked for the GNU C Library by Roland McGrath.
52  * Rewritten to be reentrant by Ulrich Drepper, 1995
53  */
54
55 #include <config.h>
56
57 #include <errno.h>
58 #include <limits.h>
59 #include <stddef.h>
60 #include <stdlib.h>
61 #include <inttypes.h>
62
63
64 /* An improved random number generation package.  In addition to the standard
65    rand()/srand() like interface, this package also has a special state info
66    interface.  The initstate() routine is called with a seed, an array of
67    bytes, and a count of how many bytes are being passed in; this array is
68    then initialized to contain information for random number generation with
69    that much state information.  Good sizes for the amount of state
70    information are 32, 64, 128, and 256 bytes.  The state can be switched by
71    calling the setstate() function with the same array as was initialized
72    with initstate().  By default, the package runs with 128 bytes of state
73    information and generates far better random numbers than a linear
74    congruential generator.  If the amount of state information is less than
75    32 bytes, a simple linear congruential R.N.G. is used.  Internally, the
76    state information is treated as an array of longs; the zeroth element of
77    the array is the type of R.N.G. being used (small integer); the remainder
78    of the array is the state information for the R.N.G.  Thus, 32 bytes of
79    state information will give 7 longs worth of state information, which will
80    allow a degree seven polynomial.  (Note: The zeroth word of state
81    information also has some other information stored in it; see setstate
82    for details).  The random number generation technique is a linear feedback
83    shift register approach, employing trinomials (since there are fewer terms
84    to sum up that way).  In this approach, the least significant bit of all
85    the numbers in the state table will act as a linear feedback shift register,
86    and will have period 2^deg - 1 (where deg is the degree of the polynomial
87    being used, assuming that the polynomial is irreducible and primitive).
88    The higher order bits will have longer periods, since their values are
89    also influenced by pseudo-random carries out of the lower bits.  The
90    total period of the generator is approximately deg*(2**deg - 1); thus
91    doubling the amount of state information has a vast influence on the
92    period of the generator.  Note: The deg*(2**deg - 1) is an approximation
93    only good for large deg, when the period of the shift register is the
94    dominant factor.  With deg equal to seven, the period is actually much
95    longer than the 7*(2**7 - 1) predicted by this formula.  */
96
97
98
99 /* For each of the currently supported random number generators, we have a
100    break value on the amount of state information (you need at least this many
101    bytes of state info to support this random number generator), a degree for
102    the polynomial (actually a trinomial) that the R.N.G. is based on, and
103    separation between the two lower order coefficients of the trinomial.  */
104
105 /* Linear congruential.  */
106 #define TYPE_0          0
107 #define BREAK_0         8
108 #define DEG_0           0
109 #define SEP_0           0
110
111 /* x**7 + x**3 + 1.  */
112 #define TYPE_1          1
113 #define BREAK_1         32
114 #define DEG_1           7
115 #define SEP_1           3
116
117 /* x**15 + x + 1.  */
118 #define TYPE_2          2
119 #define BREAK_2         64
120 #define DEG_2           15
121 #define SEP_2           1
122
123 /* x**31 + x**3 + 1.  */
124 #define TYPE_3          3
125 #define BREAK_3         128
126 #define DEG_3           31
127 #define SEP_3           3
128
129 /* x**63 + x + 1.  */
130 #define TYPE_4          4
131 #define BREAK_4         256
132 #define DEG_4           63
133 #define SEP_4           1
134
135
136 /* Array versions of the above information to make code run faster.
137    Relies on fact that TYPE_i == i.  */
138
139 #define MAX_TYPES       5       /* Max number of types above.  */
140
141 struct random_poly_info
142 {
143   int seps[MAX_TYPES];
144   int degrees[MAX_TYPES];
145 };
146
147 static const struct random_poly_info random_poly_info =
148 {
149   { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 },
150   { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }
151 };
152
153 #ifndef _LIBC
154 # define weak_alias(local, symbol)
155 # define __set_errno(e) errno = (e)
156 # define __srandom_r srandom_r
157 # define __initstate_r initstate_r
158 # define __setstate_r setstate_r
159 # define __random_r random_r
160 #endif
161
162
163 \f
164 /* Initialize the random number generator based on the given seed.  If the
165    type is the trivial no-state-information type, just remember the seed.
166    Otherwise, initializes state[] based on the given "seed" via a linear
167    congruential generator.  Then, the pointers are set to known locations
168    that are exactly rand_sep places apart.  Lastly, it cycles the state
169    information a given number of times to get rid of any initial dependencies
170    introduced by the L.C.R.N.G.  Note that the initialization of randtbl[]
171    for default usage relies on values produced by this routine.  */
172 int
173 __srandom_r (unsigned int seed, struct random_data *buf)
174 {
175   int type;
176   int32_t *state;
177   long int i;
178   long int word;
179   int32_t *dst;
180   int kc;
181
182   if (buf == NULL)
183     goto fail;
184   type = buf->rand_type;
185   if ((unsigned int) type >= MAX_TYPES)
186     goto fail;
187
188   state = buf->state;
189   /* We must make sure the seed is not 0.  Take arbitrarily 1 in this case.  */
190   if (seed == 0)
191     seed = 1;
192   state[0] = seed;
193   if (type == TYPE_0)
194     goto done;
195
196   dst = state;
197   word = seed;
198   kc = buf->rand_deg;
199   for (i = 1; i < kc; ++i)
200     {
201       /* This does:
202            state[i] = (16807 * state[i - 1]) % 2147483647;
203          but avoids overflowing 31 bits.  */
204       long int hi = word / 127773;
205       long int lo = word % 127773;
206       word = 16807 * lo - 2836 * hi;
207       if (word < 0)
208         word += 2147483647;
209       *++dst = word;
210     }
211
212   buf->fptr = &state[buf->rand_sep];
213   buf->rptr = &state[0];
214   kc *= 10;
215   while (--kc >= 0)
216     {
217       int32_t discard;
218       (void) __random_r (buf, &discard);
219     }
220
221  done:
222   return 0;
223
224  fail:
225   return -1;
226 }
227
228 weak_alias (__srandom_r, srandom_r)
229 \f
230 /* Initialize the state information in the given array of N bytes for
231    future random number generation.  Based on the number of bytes we
232    are given, and the break values for the different R.N.G.'s, we choose
233    the best (largest) one we can and set things up for it.  srandom is
234    then called to initialize the state information.  Note that on return
235    from srandom, we set state[-1] to be the type multiplexed with the current
236    value of the rear pointer; this is so successive calls to initstate won't
237    lose this information and will be able to restart with setstate.
238    Note: The first thing we do is save the current state, if any, just like
239    setstate so that it doesn't matter when initstate is called.
240    Returns a pointer to the old state.  */
241 int
242 __initstate_r (unsigned int seed, char *arg_state, size_t n,
243                struct random_data *buf)
244 {
245   int32_t *old_state;
246   int32_t *state;
247   int type;
248   int degree;
249   int separation;
250
251   if (buf == NULL)
252     goto fail;
253
254   old_state = buf->state;
255   if (old_state != NULL)
256     {
257       int old_type = buf->rand_type;
258       if (old_type == TYPE_0)
259         old_state[-1] = TYPE_0;
260       else
261         old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
262     }
263
264   if (n >= BREAK_3)
265     type = n < BREAK_4 ? TYPE_3 : TYPE_4;
266   else if (n < BREAK_1)
267     {
268       if (n < BREAK_0)
269         {
270           __set_errno (EINVAL);
271           goto fail;
272         }
273       type = TYPE_0;
274     }
275   else
276     type = n < BREAK_2 ? TYPE_1 : TYPE_2;
277
278   degree = random_poly_info.degrees[type];
279   separation = random_poly_info.seps[type];
280
281   buf->rand_type = type;
282   buf->rand_sep = separation;
283   buf->rand_deg = degree;
284   state = &((int32_t *) arg_state)[1];  /* First location.  */
285   /* Must set END_PTR before srandom.  */
286   buf->end_ptr = &state[degree];
287
288   buf->state = state;
289
290   __srandom_r (seed, buf);
291
292   state[-1] = TYPE_0;
293   if (type != TYPE_0)
294     state[-1] = (buf->rptr - state) * MAX_TYPES + type;
295
296   return 0;
297
298  fail:
299   __set_errno (EINVAL);
300   return -1;
301 }
302
303 weak_alias (__initstate_r, initstate_r)
304 \f
305 /* Restore the state from the given state array.
306    Note: It is important that we also remember the locations of the pointers
307    in the current state information, and restore the locations of the pointers
308    from the old state information.  This is done by multiplexing the pointer
309    location into the zeroth word of the state information. Note that due
310    to the order in which things are done, it is OK to call setstate with the
311    same state as the current state
312    Returns a pointer to the old state information.  */
313 int
314 __setstate_r (char *arg_state, struct random_data *buf)
315 {
316   int32_t *new_state = 1 + (int32_t *) arg_state;
317   int type;
318   int old_type;
319   int32_t *old_state;
320   int degree;
321   int separation;
322
323   if (arg_state == NULL || buf == NULL)
324     goto fail;
325
326   old_type = buf->rand_type;
327   old_state = buf->state;
328   if (old_type == TYPE_0)
329     old_state[-1] = TYPE_0;
330   else
331     old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
332
333   type = new_state[-1] % MAX_TYPES;
334   if (type < TYPE_0 || type > TYPE_4)
335     goto fail;
336
337   buf->rand_deg = degree = random_poly_info.degrees[type];
338   buf->rand_sep = separation = random_poly_info.seps[type];
339   buf->rand_type = type;
340
341   if (type != TYPE_0)
342     {
343       int rear = new_state[-1] / MAX_TYPES;
344       buf->rptr = &new_state[rear];
345       buf->fptr = &new_state[(rear + separation) % degree];
346     }
347   buf->state = new_state;
348   /* Set end_ptr too.  */
349   buf->end_ptr = &new_state[degree];
350
351   return 0;
352
353  fail:
354   __set_errno (EINVAL);
355   return -1;
356 }
357
358 weak_alias (__setstate_r, setstate_r)
359 \f
360 /* If we are using the trivial TYPE_0 R.N.G., just do the old linear
361    congruential bit.  Otherwise, we do our fancy trinomial stuff, which is the
362    same in all the other cases due to all the global variables that have been
363    set up.  The basic operation is to add the number at the rear pointer into
364    the one at the front pointer.  Then both pointers are advanced to the next
365    location cyclically in the table.  The value returned is the sum generated,
366    reduced to 31 bits by throwing away the "least random" low bit.
367    Note: The code takes advantage of the fact that both the front and
368    rear pointers can't wrap on the same call by not testing the rear
369    pointer if the front one has wrapped.  Returns a 31-bit random number.  */
370
371 int
372 __random_r (struct random_data *buf, int32_t *result)
373 {
374   int32_t *state;
375
376   if (buf == NULL || result == NULL)
377     goto fail;
378
379   state = buf->state;
380
381   if (buf->rand_type == TYPE_0)
382     {
383       int32_t val = state[0];
384       val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
385       state[0] = val;
386       *result = val;
387     }
388   else
389     {
390       int32_t *fptr = buf->fptr;
391       int32_t *rptr = buf->rptr;
392       int32_t *end_ptr = buf->end_ptr;
393       int32_t val;
394
395       val = *fptr += *rptr;
396       /* Chucking least random bit.  */
397       *result = (val >> 1) & 0x7fffffff;
398       ++fptr;
399       if (fptr >= end_ptr)
400         {
401           fptr = state;
402           ++rptr;
403         }
404       else
405         {
406           ++rptr;
407           if (rptr >= end_ptr)
408             rptr = state;
409         }
410       buf->fptr = fptr;
411       buf->rptr = rptr;
412     }
413   return 0;
414
415  fail:
416   __set_errno (EINVAL);
417   return -1;
418 }
419
420 weak_alias (__random_r, random_r)