前幾天也轉載過LUA的一片文章,但自己驗證時發現上面寫的例子缺少一些東西直接跑不通,不過我已經修正。
詳細的教程可參見:http://www.troubleshooters.com/codecorn/lua/lua_c_calls_lua.htm
話不多說,看代碼吧:
(以下代碼已上傳至:https://github.com/szhu/ez-lua)
--parser.lua
local file=io.open("./test.conf", "r");
modulename="NOT Found";
port=-1;
function get_modulename(line)
if (string.find(line, "lib.*.so$")) then
modulename = string.sub(line, string.find(line, "lib.*.so$"));
end
end
function get_port(line)
if (string.find(line, "^port=%d+$")) then
sport = string.sub(line, string.find(line, "%d+$"));
port = tonumber(sport);
end
end
for line in file:lines() do
get_modulename(line);
get_port(line);
end
file:close();
接着是配置文件
//test.conf
name:libaccess_udp_plugin.so
port=2000
C語言主調程序
#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#define err_exit(num,fmt,args...) \
do{printf("[%s:%d]"fmt"\n",__FILE__,__LINE__,##args);exit(num);} while(0)
#define err_return(num,fmt,args...) \
do{printf("[%s:%d]"fmt"\n",__FILE__,__LINE__,##args);return(num);} while(0)
int main(int argc, char* argv[]){
lua_State * L;
L = luaL_newstate() ; /* Create Lua state variable */
if ( L == NULL ) err_return(-1,"luaL_newstat() failed");
luaL_openlibs(L); /* Load Lua libraries */
int ret = 0 ;
ret = luaL_loadfile(L, "./parser.lua") ; /* Load but don't run the Lua script */
if ( ret != 0 ) err_return(-1,"luaL_loadfile failed") ;
ret = lua_pcall(L, 0, 0, 0) ; /* Run the loaded Lua script */
if ( ret != 0 ) err_return(-1,"lua_pcall failed:%s",lua_tostring(L,-1)) ;
lua_getglobal(L,"modulename"); //獲取lua中定義的變量
lua_getglobal(L,"port");
printf("modulename:%s port=%d\n", lua_tostring(L,-2), lua_tointeger(L,-1)) ;
lua_pop(L,1) ;
printf("C Language main\n");
return 0;
}
Makefile
CC=gcc
CFLAGS = $(shell pkg-config --cflags lua5.1)
LDFLAGS = $(shell pkg-config --libs lua5.1)
all:luaconf
luaconf:luaconf.o
$(CC) $< $(LDFLAGS) -o $@
%.o: %.c
$(CC) $< $(CFLAGS) -c -o $@
clean:
rm -rf *.o $(EXAMPLES)