From ede49d7153ed628078bcbc2473f898904b5250ea Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 28 Apr 2011 01:18:53 -0700 Subject: * 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. --- src/sysdep.c | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) (limited to 'src/sysdep.c') diff --git a/src/sysdep.c b/src/sysdep.c index ca7de4f54bb..43f50cdb0a9 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -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 -- cgit v1.2.1