mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
76 lines
2.0 KiB
C++
76 lines
2.0 KiB
C++
/* Bitwise operations library
|
|
* by Reuben Thomas (rrt@sc3d.org)
|
|
* bitlib is a C library for Lua 5.x that provides bitwise operations
|
|
* It is copyright Reuben Thomas 2000-2006, and is released under the
|
|
* MIT license, like Lua (see http://www.lua.org/copyright.html for the
|
|
* full license; it's basically the same as the BSD license). There is no
|
|
* warranty.
|
|
* the most recent copy can be found at http://rrt.sc3d.org/Software/Lua/
|
|
**/
|
|
|
|
extern "C" {
|
|
#include "lauxlib.h"
|
|
#include "lua.h"
|
|
}
|
|
|
|
#include "nse_bit.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, checkbit1, checkbit2) \
|
|
static int bit_ ## name(lua_State* L) { \
|
|
lua_pushnumber(L, \
|
|
(lua_Number)(checkbit1(L, 1) op checkbit2(L, 2))); \
|
|
return 1; \
|
|
}
|
|
|
|
#define DYADIC(name, op) \
|
|
TDYADIC(name, op, luaL_checkbit, luaL_checkbit)
|
|
|
|
#define MONADIC(name, op) \
|
|
static int bit_ ## name(lua_State* L) { \
|
|
lua_pushnumber(L, (lua_Number)(op luaL_checkbit(L, 1))); \
|
|
return 1; \
|
|
}
|
|
|
|
#define VARIADIC(name, op) \
|
|
static int bit_ ## name(lua_State *L) { \
|
|
int n = lua_gettop(L), i; \
|
|
Integer w = luaL_checkbit(L, 1); \
|
|
for (i = 2; i <= n; i++) \
|
|
w op luaL_checkbit(L, i); \
|
|
lua_pushnumber(L, (lua_Number)w); \
|
|
return 1; \
|
|
}
|
|
|
|
MONADIC(bnot, ~)
|
|
VARIADIC(band, &=)
|
|
VARIADIC(bor, |=)
|
|
VARIADIC(bxor, ^=)
|
|
TDYADIC(lshift, <<, luaL_checkbit, luaL_checkubit)
|
|
TDYADIC(rshift, >>, luaL_checkubit, luaL_checkubit)
|
|
TDYADIC(arshift, >>, luaL_checkbit, luaL_checkubit)
|
|
DYADIC(mod, %)
|
|
|
|
static const struct luaL_Reg bitlib[] = {
|
|
{"bnot", bit_bnot},
|
|
{"band", bit_band},
|
|
{"bor", bit_bor},
|
|
{"bxor", bit_bxor},
|
|
{"lshift", bit_lshift},
|
|
{"rshift", bit_rshift},
|
|
{"arshift", bit_arshift},
|
|
{"mod", bit_mod},
|
|
{NULL, NULL}
|
|
};
|
|
|
|
LUALIB_API int luaopen_bit(lua_State *L) {
|
|
luaL_newlib(L, bitlib);
|
|
return 1;
|
|
}
|
|
|