From: Thierry FOURNIER Date: Wed, 25 Feb 2015 17:48:12 +0000 (+0100) Subject: MINOR: lua: add ease functions X-Git-Tag: v1.6-dev1~106 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8b9a40d22ff8b1afa03760a4129a56b101d74b5;p=thirdparty%2Fhaproxy.git MINOR: lua: add ease functions This patch adds little convenient functions useful for lua basic manipulation. --- diff --git a/src/hlua.c b/src/hlua.c index 3e0b19f248..cf2d858ffd 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -13,6 +13,111 @@ #define WILL_LJMP(func) func #define MAY_LJMP(func) func +/* Used to check an Lua function type in the stack. It creates and + * returns a reference of the function. This function throws an + * error if the rgument is not a "function". + */ +__LJMP unsigned int hlua_checkfunction(lua_State *L, int argno) +{ + if (!lua_isfunction(L, argno)) { + const char *msg = lua_pushfstring(L, "function expected, got %s", luaL_typename(L, -1)); + WILL_LJMP(luaL_argerror(L, argno, msg)); + } + lua_pushvalue(L, argno); + return luaL_ref(L, LUA_REGISTRYINDEX); +} + +/* The three following functions are useful for adding entries + * in a table. These functions takes a string and respectively an + * integer, a string or a function and add it to the table in the + * top of the stack. + * + * These functions throws an error if no more stack size is + * available. + */ +__LJMP static inline void hlua_class_const_int(lua_State *L, const char *name, + unsigned int value) +{ + if (!lua_checkstack(L, 2)) + WILL_LJMP(luaL_error(L, "full stack")); + lua_pushstring(L, name); + lua_pushunsigned(L, value); + lua_settable(L, -3); +} +__LJMP static inline void hlua_class_const_str(lua_State *L, const char *name, + const char *value) +{ + if (!lua_checkstack(L, 2)) + WILL_LJMP(luaL_error(L, "full stack")); + lua_pushstring(L, name); + lua_pushstring(L, value); + lua_settable(L, -3); +} +__LJMP static inline void hlua_class_function(lua_State *L, const char *name, + int (*function)(lua_State *L)) +{ + if (!lua_checkstack(L, 2)) + WILL_LJMP(luaL_error(L, "full stack")); + lua_pushstring(L, name); + lua_pushcclosure(L, function, 0); + lua_settable(L, -3); +} + +/* This function check the number of arguments available in the + * stack. If the number of arguments available is not the same + * then an error is throwed. + */ +__LJMP static inline void check_args(lua_State *L, int nb, char *fcn) +{ + if (lua_gettop(L) == nb) + return; + WILL_LJMP(luaL_error(L, "'%s' needs %d arguments", fcn, nb)); +} + +/* Return true if the data in stack[] is an object of + * type . + */ +static int hlua_udataistype(lua_State *L, int ud, int class_ref) +{ + void *p = lua_touserdata(L, ud); + if (!p) + return 0; + + if (!lua_getmetatable(L, ud)) + return 0; + + lua_rawgeti(L, LUA_REGISTRYINDEX, class_ref); + if (!lua_rawequal(L, -1, -2)) { + lua_pop(L, 2); + return 0; + } + + lua_pop(L, 2); + return 1; +} + +/* Return an object of the expected type, or throws an error. */ +__LJMP static void *hlua_checkudata(lua_State *L, int ud, int class_ref) +{ + if (!hlua_udataistype(L, ud, class_ref)) + WILL_LJMP(luaL_argerror(L, 1, NULL)); + return lua_touserdata(L, ud); +} + +/* This fucntion push an error string prefixed by the file name + * and the line number where the error is encountered. + */ +static int hlua_pusherror(lua_State *L, const char *fmt, ...) +{ + va_list argp; + va_start(argp, fmt); + luaL_where(L, 1); + lua_pushvfstring(L, fmt, argp); + va_end(argp); + lua_concat(L, 2); + return 1; +} + void hlua_init(void) { }