|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
/* (find-es "lua5" "lbitlib")
* Written by Reuben Thomas for Lua4.0
* patched by Edrx for Lua5.0
*/
#include "lauxlib.h"
#include "lua.h"
typedef long long Integer;
typedef unsigned long long UInteger;
#define luaL_checkbit(L,n) ((Integer)luaL_checknumber(L, n))
#define luaL_checkubit(L,n) ((UInteger)luaL_checkbit(L, n))
#define TDYADIC(name, op, t1, t2) \
static int name(lua_State* L) { \
lua_pushnumber(L, \
luaL_check ## t1 ## bit(L, 1) op luaL_check ## t2 ## bit(L, 2)); \
return 1; \
}
#define DYADIC(name, op) TDYADIC(name, op, , )
#define MONADIC(name, op) \
static int name(lua_State* L) { \
lua_pushnumber(L, op luaL_checkbit(L, 1)); \
return 1; \
}
MONADIC(int_not, ~)
DYADIC(int_mod, %)
DYADIC(int_and, &)
DYADIC(int_or, |)
DYADIC(int_xor, ^)
TDYADIC(int_lshift, <<, , u)
TDYADIC(int_rshift, >>, u, u)
TDYADIC(int_arshift, >>, , u)
static const struct luaL_reg bitlib[] = {
{"bnot", int_not},
{"imod", int_mod}, /* "mod" already in Lua math library */
{"band", int_and},
{"bor", int_or},
{"bxor", int_xor},
{"lshift", int_lshift},
{"rshift", int_rshift},
{"arshift", int_arshift},
{NULL, NULL}
};
LUALIB_API int lua_bitlibopen (lua_State *L) {
lua_pushvalue(L, LUA_GLOBALSINDEX);
luaL_openlib(L, NULL, bitlib, 0);
return 0;
}