diff --git a/docs/changes.txt b/docs/changes.txt index 9fe08e2..96082ca 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -50,3 +50,6 @@ v0.4 * nfqws2: execution_plan, execution_plan_cancel * blockcheck2: fix broken dns cache * nfqws2: LUA_COMPAT_VER tracking + +v0.5 +* nfqws2: u8add,u16add,u24add,u32add luacalls diff --git a/nfq2/lua.c b/nfq2/lua.c index 1b36589..be4b91e 100644 --- a/nfq2/lua.c +++ b/nfq2/lua.c @@ -212,6 +212,40 @@ static int luacall_swap16(lua_State *L) lua_pushinteger(L,(u>>8) | ((u&0xFF)<<8)); return 1; } +static int lua_uxadd(lua_State *L, uint32_t max) +{ + lua_Integer sum=0, v; + int argc = lua_gettop(L); + for(int i=1;i<=argc;i++) + { + v = luaL_checkinteger(L,i); + if (v>max || v<-(lua_Integer)max) luaL_error(L, "out of range"); + sum+=v; + } + lua_pushinteger(L, sum & max); + return 1; +} +static int luacall_u8add(lua_State *L) +{ + lua_check_argc_range(L,"u8add",2,100); + return lua_uxadd(L, 0xFF); +} +static int luacall_u16add(lua_State *L) +{ + lua_check_argc_range(L,"u16add",2,100); + return lua_uxadd(L, 0xFFFF); +} +static int luacall_u24add(lua_State *L) +{ + lua_check_argc_range(L,"u24add",2,100); + return lua_uxadd(L, 0xFFFFFF); +} +static int luacall_u32add(lua_State *L) +{ + lua_check_argc_range(L,"u32add",2,100); + return lua_uxadd(L, 0xFFFFFFFF); +} + static int luacall_swap32(lua_State *L) { lua_check_argc(L,"swap32",1); @@ -2948,6 +2982,11 @@ static void lua_init_functions(void) {"u16",luacall_u16}, {"u24",luacall_u24}, {"u32",luacall_u32}, + // add any number of arguments as they would be unsigned int of specific size + {"u8add",luacall_u8add}, + {"u16add",luacall_u16add}, + {"u24add",luacall_u24add}, + {"u32add",luacall_u32add}, // convert number to blob (string) - big endian {"bu8",luacall_bu8}, {"bu16",luacall_bu16},