new type lua_Unsigned and corresponding projection/injection functions

This commit is contained in:
Roberto Ierusalimschy
2010-10-25 18:31:11 -02:00
parent 4590a89b32
commit c6b64ffe65
6 changed files with 66 additions and 22 deletions

View File

@@ -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;
}