|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: lbitlib.c,v 1.6 2010/07/02 12:01:53 roberto Exp roberto $
|
|
|
+** $Id: lbitlib.c,v 1.7 2010/10/25 14:32:36 roberto Exp roberto $
|
|
|
** Standard library for bitwise operations
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -21,14 +21,7 @@ typedef LUA_INT32 b_int;
|
|
|
typedef unsigned LUA_INT32 b_uint;
|
|
|
|
|
|
|
|
|
-static b_uint getuintarg (lua_State *L, int arg) {
|
|
|
- b_uint r;
|
|
|
- int isnum;
|
|
|
- lua_Number x = lua_tonumberx(L, arg, &isnum);
|
|
|
- if (!isnum) luaL_typeerror(L, arg, "number");
|
|
|
- lua_number2uint(r, x);
|
|
|
- return r;
|
|
|
-}
|
|
|
+#define getuintarg(L,arg) luaL_checkunsigned(L,arg)
|
|
|
|
|
|
|
|
|
static b_uint andaux (lua_State *L) {
|
|
@@ -42,7 +35,7 @@ static b_uint andaux (lua_State *L) {
|
|
|
|
|
|
static int b_and (lua_State *L) {
|
|
|
b_uint r = andaux(L);
|
|
|
- lua_pushnumber(L, lua_uint2number(r));
|
|
|
+ lua_pushunsigned(L, r);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -59,7 +52,7 @@ static int b_or (lua_State *L) {
|
|
|
b_uint r = 0;
|
|
|
for (i = 1; i <= n; i++)
|
|
|
r |= getuintarg(L, i);
|
|
|
- lua_pushnumber(L, lua_uint2number(r));
|
|
|
+ lua_pushunsigned(L, r);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -69,14 +62,14 @@ static int b_xor (lua_State *L) {
|
|
|
b_uint r = 0;
|
|
|
for (i = 1; i <= n; i++)
|
|
|
r ^= getuintarg(L, i);
|
|
|
- lua_pushnumber(L, lua_uint2number(r));
|
|
|
+ lua_pushunsigned(L, r);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
|
|
|
static int b_not (lua_State *L) {
|
|
|
b_uint r = ~getuintarg(L, 1);
|
|
|
- lua_pushnumber(L, lua_uint2number(r));
|
|
|
+ lua_pushunsigned(L, r);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -91,7 +84,7 @@ static int b_shift (lua_State *L, b_uint r, int i) {
|
|
|
if (i >= NBITS) r = 0;
|
|
|
else r <<= i;
|
|
|
}
|
|
|
- lua_pushnumber(L, lua_uint2number(r));
|
|
|
+ lua_pushunsigned(L, r);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -115,7 +108,7 @@ static int b_arshift (lua_State *L) {
|
|
|
if (i >= NBITS) r = 0xffffffff;
|
|
|
else
|
|
|
r = (r >> i) | ~(~(b_uint)0 >> i); /* add signal bit */
|
|
|
- lua_pushnumber(L, lua_uint2number(r));
|
|
|
+ lua_pushunsigned(L, r);
|
|
|
return 1;
|
|
|
}
|
|
|
}
|
|
@@ -125,7 +118,7 @@ static int b_rot (lua_State *L, int i) {
|
|
|
b_uint r = getuintarg(L, 1);
|
|
|
i &= (NBITS - 1); /* i = i % NBITS */
|
|
|
r = (r << i) | (r >> (NBITS - i));
|
|
|
- lua_pushnumber(L, lua_uint2number(r));
|
|
|
+ lua_pushunsigned(L, r);
|
|
|
return 1;
|
|
|
}
|
|
|
|