嵌入的lua 主要是以配置为主,调试为主,后期在核心逻辑上加入,补丁功能,分享一下 我现在写的基础版本,其他大家,自由发挥
#include "mod_lua.h"
#include <time.h>
#include <unistd.h>
lua_State *lua_interface_stack;
int init_lua_state(void) {
lua_interface_stack = luaL_newstate();
if (lua_interface_stack != NULL) {
luaL_openlibs(lua_interface_stack);
return 0;
}
return -1;
}
int free_lua_state(void) {
lua_close(lua_interface_stack);
return 0;
}
static int lsleep_sec(lua_State *L) {
int cnts = luaL_checknumber(L, 1);
sleep(cnts);
return 1;
}
static int lsleep_usec(lua_State *L) {
int cnts = luaL_checknumber(L, 1);
usleep(cnts);
return 1;
}
/**
*
*
*/
static const lua_func_info_t lua_func[] = {{"lsleep_sec", lsleep_sec},
{"lsleep_usec", lsleep_usec}};
int lua_functions(lua_State *L) {
int n = sizeof(lua_func) / sizeof(lua_func[0]);
while (n--) {
lua_register(L, lua_func[n].name, lua_func[n].func);
}
return 1;
}
lua_module_register(lua_functions);
static void register_lib(lua_State *L, const char *name, lua_CFunction f) {
lua_getglobal(L, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, f);
lua_setfield(L, -2, name);
lua_pop(L, 2);
}
static int first_reg_func(lua_State *L) {
fprintf(stderr, "Hello World\n");
return 1;
}
static const struct luaL_Reg tdd_debug[] = {{"first_reg_func", first_reg_func},
{NULL, NULL}};
static int luaopen_tdd_debug(lua_State *L) {
luaL_newlib(L, tdd_debug);
return 1;
}
static const lua_func_info_t lua_libs[] = {{"tdd_debug", luaopen_tdd_debug}};
int Lua_libs(lua_State *L) {
int n = sizeof(lua_libs) / sizeof(lua_libs[0]);
while (n--) {
register_lib(L, lua_libs[n].name, lua_libs[n].func);
}
return 0;
}
lua_module_register(Lua_libs);
int init_lua_module(void) {
if (init_lua_state() == 0) {
lua_module *st = (lua_module *)&mod_lua_start;
lua_module *end = (lua_module *)&mod_lua_end;
lua_module *it = NULL;
for (it = st; it < end; it++) {
(*it)(lua_interface_stack);
}
} else {
fprintf(stderr, "[Lua error] %s \n", lua_tostring(lua_interface_stack, -1));
lua_pop(lua_interface_stack, 1); // pop error frome stack
free_lua_state();
return -1;
}
return 0;
}
int load_lua_config(const char *filename) {
if (lua_interface_stack == NULL || filename == NULL) {
fprintf(stderr, "[Lua error] nil Lua stack or filename ... ...\n");
return -1;
}
if (luaL_dofile(lua_interface_stack, filename)) {
fprintf(stderr, "[Lua error] %s \n", lua_tostring(lua_interface_stack, -1));
lua_pop(lua_interface_stack, 1); // pop error from lua stack
return -2;
}
return 0;
}
function Sleep(n)
os.execute("sleep " .. n)
end
print("first lua print \n")
t = {10,"hi",1.0}
for k,v in ipairs(t) do
print(k,v)
end
lsleep_usec(1000*500)
print("I am here ... ...")
local test_libs = require("tdd_debug")
test_libs.first_reg_func()