aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>1998-04-29 00:59:22 +0000
committerRichard M. Stallman <[email protected]>1998-04-29 00:59:22 +0000
commit81d7062685d40fa1e58a291db552b7866e088d33 (patch)
tree04a2e22fa1f220a75dd260a7c940a2c822a09269 /src/data.c
parent3036594f2ac4967e7c89efaec9fcba574eefdf30 (diff)
(Flsh, Fash): Handle out-of-range shift counts reasonably.
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/data.c b/src/data.c
index 1835404621..eb1cbf77bb 100644
--- a/src/data.c
+++ b/src/data.c
@@ -2481,8 +2481,12 @@ In this case, the sign bit is duplicated.")
CHECK_NUMBER (value, 0);
CHECK_NUMBER (count, 1);
- if (XINT (count) > 0)
+ if (XINT (count) >= BITS_PER_EMACS_INT)
+ XSETINT (val, 0);
+ else if (XINT (count) > 0)
XSETINT (val, XINT (value) << XFASTINT (count));
+ else if (XINT (count) <= -BITS_PER_EMACS_INT)
+ XSETINT (val, XINT (value) < 0 ? -1 : 0);
else
XSETINT (val, XINT (value) >> -XINT (count));
return val;
@@ -2500,8 +2504,12 @@ In this case, zeros are shifted in on the left.")
CHECK_NUMBER (value, 0);
CHECK_NUMBER (count, 1);
- if (XINT (count) > 0)
+ if (XINT (count) >= BITS_PER_EMACS_INT)
+ XSETINT (val, 0);
+ else if (XINT (count) > 0)
XSETINT (val, (EMACS_UINT) XUINT (value) << XFASTINT (count));
+ else if (XINT (count) <= -BITS_PER_EMACS_INT)
+ XSETINT (val, 0);
else
XSETINT (val, (EMACS_UINT) XUINT (value) >> -XINT (count));
return val;