aboutsummaryrefslogtreecommitdiff
path: root/lbitlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lbitlib.c')
-rw-r--r--lbitlib.c25
1 files changed, 9 insertions, 16 deletions
diff --git a/lbitlib.c b/lbitlib.c
index 3bebccd5..7d7de63c 100644
--- a/lbitlib.c
+++ b/lbitlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbitlib.c,v 1.6 2010/07/02 12:01:53 roberto Exp roberto $ 2** $Id: lbitlib.c,v 1.7 2010/10/25 14:32:36 roberto Exp roberto $
3** Standard library for bitwise operations 3** Standard library for bitwise operations
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -21,14 +21,7 @@ typedef LUA_INT32 b_int;
21typedef unsigned LUA_INT32 b_uint; 21typedef unsigned LUA_INT32 b_uint;
22 22
23 23
24static b_uint getuintarg (lua_State *L, int arg) { 24#define getuintarg(L,arg) luaL_checkunsigned(L,arg)
25 b_uint r;
26 int isnum;
27 lua_Number x = lua_tonumberx(L, arg, &isnum);
28 if (!isnum) luaL_typeerror(L, arg, "number");
29 lua_number2uint(r, x);
30 return r;
31}
32 25
33 26
34static b_uint andaux (lua_State *L) { 27static b_uint andaux (lua_State *L) {
@@ -42,7 +35,7 @@ static b_uint andaux (lua_State *L) {
42 35
43static int b_and (lua_State *L) { 36static int b_and (lua_State *L) {
44 b_uint r = andaux(L); 37 b_uint r = andaux(L);
45 lua_pushnumber(L, lua_uint2number(r)); 38 lua_pushunsigned(L, r);
46 return 1; 39 return 1;
47} 40}
48 41
@@ -59,7 +52,7 @@ static int b_or (lua_State *L) {
59 b_uint r = 0; 52 b_uint r = 0;
60 for (i = 1; i <= n; i++) 53 for (i = 1; i <= n; i++)
61 r |= getuintarg(L, i); 54 r |= getuintarg(L, i);
62 lua_pushnumber(L, lua_uint2number(r)); 55 lua_pushunsigned(L, r);
63 return 1; 56 return 1;
64} 57}
65 58
@@ -69,14 +62,14 @@ static int b_xor (lua_State *L) {
69 b_uint r = 0; 62 b_uint r = 0;
70 for (i = 1; i <= n; i++) 63 for (i = 1; i <= n; i++)
71 r ^= getuintarg(L, i); 64 r ^= getuintarg(L, i);
72 lua_pushnumber(L, lua_uint2number(r)); 65 lua_pushunsigned(L, r);
73 return 1; 66 return 1;
74} 67}
75 68
76 69
77static int b_not (lua_State *L) { 70static int b_not (lua_State *L) {
78 b_uint r = ~getuintarg(L, 1); 71 b_uint r = ~getuintarg(L, 1);
79 lua_pushnumber(L, lua_uint2number(r)); 72 lua_pushunsigned(L, r);
80 return 1; 73 return 1;
81} 74}
82 75
@@ -91,7 +84,7 @@ static int b_shift (lua_State *L, b_uint r, int i) {
91 if (i >= NBITS) r = 0; 84 if (i >= NBITS) r = 0;
92 else r <<= i; 85 else r <<= i;
93 } 86 }
94 lua_pushnumber(L, lua_uint2number(r)); 87 lua_pushunsigned(L, r);
95 return 1; 88 return 1;
96} 89}
97 90
@@ -115,7 +108,7 @@ static int b_arshift (lua_State *L) {
115 if (i >= NBITS) r = 0xffffffff; 108 if (i >= NBITS) r = 0xffffffff;
116 else 109 else
117 r = (r >> i) | ~(~(b_uint)0 >> i); /* add signal bit */ 110 r = (r >> i) | ~(~(b_uint)0 >> i); /* add signal bit */
118 lua_pushnumber(L, lua_uint2number(r)); 111 lua_pushunsigned(L, r);
119 return 1; 112 return 1;
120 } 113 }
121} 114}
@@ -125,7 +118,7 @@ static int b_rot (lua_State *L, int i) {
125 b_uint r = getuintarg(L, 1); 118 b_uint r = getuintarg(L, 1);
126 i &= (NBITS - 1); /* i = i % NBITS */ 119 i &= (NBITS - 1); /* i = i % NBITS */
127 r = (r << i) | (r >> (NBITS - i)); 120 r = (r << i) | (r >> (NBITS - i));
128 lua_pushnumber(L, lua_uint2number(r)); 121 lua_pushunsigned(L, r);
129 return 1; 122 return 1;
130} 123}
131 124