aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorantirez <antirez>2005-02-26 23:36:01 +0000
committerantirez <antirez>2005-02-26 23:36:01 +0000
commit1453584a33f57a7863c4e64aca4d58777ebc9de9 (patch)
treedc72555e70df7d24320e9e332d28c1ef3bcc84fb /jim.c
parente1c5f59ad33249769c0de4a4edf931f921453565 (diff)
downloadjimtcl-1453584a33f57a7863c4e64aca4d58777ebc9de9.zip
jimtcl-1453584a33f57a7863c4e64aca4d58777ebc9de9.tar.gz
jimtcl-1453584a33f57a7863c4e64aca4d58777ebc9de9.tar.bz2
Pat <<< and >>> operators but converted to 32bit rotation.
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/jim.c b/jim.c
index b9e03c6..88cca1e 100644
--- a/jim.c
+++ b/jim.c
@@ -4946,6 +4946,8 @@ typedef struct Jim_ExprOperator {
#define JIM_EXPROP_LSHIFT 9
#define JIM_EXPROP_RSHIFT 10
+#define JIM_EXPROP_ROTL 30
+#define JIM_EXPROP_ROTR 31
#define JIM_EXPROP_LT 11
#define JIM_EXPROP_GT 12
@@ -4987,6 +4989,8 @@ static struct Jim_ExprOperator Jim_ExprOperators[] = {
{"-", 100, 2, JIM_EXPROP_SUB},
{"+", 100, 2, JIM_EXPROP_ADD},
+ {"<<<", 90, 3, JIM_EXPROP_ROTL},
+ {">>>", 90, 3, JIM_EXPROP_ROTR},
{"<<", 90, 2, JIM_EXPROP_LSHIFT},
{">>", 90, 2, JIM_EXPROP_RSHIFT},
@@ -5221,6 +5225,8 @@ static int ExprCheckCorrectness(ExprByteCode *expr)
case JIM_EXPROP_GT:
case JIM_EXPROP_LTE:
case JIM_EXPROP_GTE:
+ case JIM_EXPROP_ROTL:
+ case JIM_EXPROP_ROTR:
case JIM_EXPROP_LSHIFT:
case JIM_EXPROP_RSHIFT:
case JIM_EXPROP_NUMEQ:
@@ -5538,6 +5544,8 @@ int Jim_EvalExpression(Jim_Interp *interp, Jim_Obj *exprObjPtr,
case JIM_EXPROP_GT:
case JIM_EXPROP_LTE:
case JIM_EXPROP_GTE:
+ case JIM_EXPROP_ROTL:
+ case JIM_EXPROP_ROTR:
case JIM_EXPROP_LSHIFT:
case JIM_EXPROP_RSHIFT:
case JIM_EXPROP_NUMEQ:
@@ -5587,6 +5595,18 @@ int Jim_EvalExpression(Jim_Interp *interp, Jim_Obj *exprObjPtr,
if (wB == 0) goto divbyzero;
wC = wA%wB;
break;
+ case JIM_EXPROP_ROTL: {
+ unsigned long uA = (unsigned jim_wide)wA&0xFFFFFFFF;
+ const unsigned int S = sizeof(unsigned long) * 8;
+ wC = (jim_wide)((uA<<wB)|(uA>>(S-wB)));
+ break;
+ }
+ case JIM_EXPROP_ROTR: {
+ unsigned long uA = (unsigned jim_wide)wA&0xFFFFFFFF;
+ const unsigned int S = sizeof(unsigned long) * 8;
+ wC = (jim_wide)((uA>>wB)|(uA<<(S-wB)));
+ break;
+ }
default:
wC = 0; /* avoid gcc warning */
@@ -5608,6 +5628,8 @@ trydouble:
Jim_DecrRefCount(interp, A);
Jim_DecrRefCount(interp, B);
switch(expr->opcode[i]) {
+ case JIM_EXPROP_ROTL:
+ case JIM_EXPROP_ROTR:
case JIM_EXPROP_LSHIFT:
case JIM_EXPROP_RSHIFT:
case JIM_EXPROP_BITAND: