]> git.eshelyaron.com Git - emacs.git/commitdiff
* sysdep.c (get_random): Don't assume EMACS_INT is no wider than long.
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 28 Apr 2011 08:18:53 +0000 (01:18 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 28 Apr 2011 08:18:53 +0000 (01:18 -0700)
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/ChangeLog
src/lisp.h
src/sysdep.c

index 2bda5ffa46f88d6283b50b9c4881ef3e4d948d09..40fb601e0616569d3e58a47e070fc16c655e3fbc 100644 (file)
@@ -1,5 +1,11 @@
 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
index 625027769cf6cebf788c0a593a7b85339345101d..dca3b4d9a32efa96b8dff2a7a55c248986714fee 100644 (file)
@@ -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);
index ca7de4f54bb4c5d0c79a9bd19e9b6d72ba6d0641..43f50cdb0a926a9070c5761c2b21a8f762b775dd 100644 (file)
@@ -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