#ifndef HONEYSUCKLE_H #define HONEYSUCKLE_H #include #include #include #include #include "va_nargs.h" /* type constants */ typedef enum { HS_BOOL, HS_INT, HS_NUM, HS_STR, HS_TBL, HS_FUNC, HS_CFUNC, HS_USER, HS_LIGHT, HS_NIL, HS_ANY, } hs_type; const char* hs_type_to_string(hs_type type); /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * hs_parse_args and hs_parse_overloaded * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ struct hs_arg { hs_type type; union { bool *boolean; lua_Integer *integer; lua_Number *number; char **string; int *stack_index; lua_CFunction *function; void **userdata; } ptr; }; #define hs_bool(x) { .type=HS_BOOL, .ptr.boolean = &(x) } #define hs_int(x) { .type=HS_INT, .ptr.integer = &(x) } #define hs_num(x) { .type=HS_NUM, .ptr.number = &(x) } #define hs_str(x) { .type=HS_STR, .ptr.string = &(x) } #define hs_tbl(x) { .type=HS_TBL, .ptr.stack_index = &(x) } #define hs_func(x) { .type=HS_FUNC, .ptr.stack_index = &(x) } #define hs_cfunc(x) { .type=HS_CFUNC, .ptr.function = &(x) } #define hs_user(x) { .type=HS_USER, .ptr.userdata = &(x) } #define hs_light(x) { .type=HS_LIGHT, .ptr.userdata = &(x) } #define hs_nil(x) { .type=HS_NIL, .ptr.stack_index = &(x) } #define hs_any(x) { .type=HS_ANY, .ptr.stack_index = &(x) } void hs_parse_args_(lua_State *L, int n_args, struct hs_arg *arguments); #define hs_parse_args(L, ...) \ hs_parse_args_(L, VA_NARGS(__VA_ARGS__)/2, (struct hs_arg[]) { __VA_ARGS__ }) //int hs_parse_overloaded_(lua_State *L, ...); int hs_create_table(lua_State *L, ...); void hs_process_table(lua_State *L, int table_index, void *data, ...); // default processors void hs_pt_set_boolean(bool value, void *data); void hs_pt_set_integer(lua_Integer value, void *data); void hs_pt_set_number(lua_Number value, void *data); void hs_pt_set_string(const char *value, void *data); void hs_vpushstring(lua_State *L, const char *format_string, va_list args); void hs_pushstring(lua_State *L, const char *format_string, ...); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void hs_throw_error(lua_State *L, const char *format_string, ...); int hs_traceback(lua_State *L); int hs_call(lua_State *L, int nargs, int nret); #define hs_rstore(L) luaL_ref(L, LUA_REGISTRYINDEX); #define hs_rload(L, ref) lua_rawgeti(L, LUA_REGISTRYINDEX, ref) #define hs_rdel(L, ref) luaL_unref(L, LUA_REGISTRYINDEX, ref) #endif