]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: lua: add ease functions
authorThierry FOURNIER <tfournier@haproxy.com>
Wed, 25 Feb 2015 17:48:12 +0000 (18:48 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 28 Feb 2015 22:12:33 +0000 (23:12 +0100)
This patch adds little convenient functions useful for lua basic
manipulation.

src/hlua.c

index 3e0b19f248bec96cb66b804cea151019f260ce30..cf2d858ffd07cb17d6c42540bb8fa15ec092eddd 100644 (file)
 #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 <nb> 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[<ud>] is an object of
+ * type <class_ref>.
+ */
+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)
 {
 }