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
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);
* 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