Commit ede49d71 authored by Paul Eggert's avatar Paul Eggert
Browse files

* sysdep.c (get_random): Don't assume EMACS_INT is no wider than long.

Also, don't assume VALBITS / RAND_BITS is less than 5,
and don't rely on undefined behavior when shifting a 1 left into
the sign bit.
* lisp.h (get_random): Change signature to match.
parent 2f30ecd0
2011-04-28 Paul Eggert <eggert@cs.ucla.edu>
* sysdep.c (get_random): Don't assume EMACS_INT is no wider than long.
Also, don't assume VALBITS / RAND_BITS is less than 5,
and don't rely on undefined behavior when shifting a 1 left into
the sign bit.
* lisp.h (get_random): Change signature to match.
* lread.c (hash_string): Use size_t, not int, for hash computation.
Normally we prefer signed values; but hashing is special, because
it's better to use unsigned division on hash table sizes so that
......
......@@ -3353,7 +3353,7 @@ extern void flush_pending_output (int);
extern void child_setup_tty (int);
extern void setup_pty (int);
extern int set_window_size (int, int, int);
extern long get_random (void);
extern EMACS_INT get_random (void);
extern void seed_random (long);
extern int emacs_open (const char *, int, int);
extern int emacs_close (int);
......
......@@ -1760,23 +1760,14 @@ seed_random (long int arg)
* Build a full Emacs-sized word out of whatever we've got.
* This suffices even for a 64-bit architecture with a 15-bit rand.
*/
long
EMACS_INT
get_random (void)
{
long val = random ();
#if VALBITS > RAND_BITS
val = (val << RAND_BITS) ^ random ();
#if VALBITS > 2*RAND_BITS
val = (val << RAND_BITS) ^ random ();
#if VALBITS > 3*RAND_BITS
val = (val << RAND_BITS) ^ random ();
#if VALBITS > 4*RAND_BITS
val = (val << RAND_BITS) ^ random ();
#endif /* need at least 5 */
#endif /* need at least 4 */
#endif /* need at least 3 */
#endif /* need at least 2 */
return val & ((1L << VALBITS) - 1);
EMACS_UINT val = 0;
int i;
for (i = 0; i < (VALBITS + RAND_BITS - 1) / RAND_BITS; i++)
val = (val << RAND_BITS) ^ random ();
return val & (((EMACS_INT) 1 << VALBITS) - 1);
}
#ifndef HAVE_STRERROR
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment