lua 与 c/c++ 交互(4)将lua作为一种配置文件

来源:互联网 发布:淘宝司法拍卖有佣金吗 编辑:程序博客网 时间:2024/06/03 01:31

将lua作为一种配置文件

假设C程序里有一个窗口,希望用户能指定窗口的 颜色值.
可能 有人 会觉得, 我写一个 txt文件 也可以 实现, 
不过 将 lua 做为一种配置 文件的 好处 有 : lua可以处理所有的语法细节 和语法错误. 其次是  实现更复杂的逻辑

这个小程序 是从 文件里 读取 颜色值. 颜色值 可以 设置 成 r,g,b的 table 或者 "red" 这样的 字符串.

下面 上 代码:

test.lua

color= {r = 255,g = 0,b = 0}
或者 
color = "red"


// LuaCApi.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
using namespace std;
extern "C"{
#include "lua\lua.h"
#include "lua\lauxlib.h"
#include "lua\lualib.h"
}

typedef struct Color
{
const char * name;
int colorR;
int colorG;
int colorB;
};

//设置 一些 常量 rgb
Color c[] = {
{"red",255,0,0},
{"green",0,255,0},
{"blue",0,0,255}
};

int getColorField(lua_State * l,const char * k){
lua_getfield(l,-1,k);
if (lua_isnumber(l,-1))
{
int k = lua_tonumber(l,-1);
lua_pop(l,1);//保持调用前的栈状态
return k;
}
}

//错误处理
void error(lua_State *l,const char * formart,...){
va_list args;
va_start(args,formart);
vfprintf(stderr,formart,args);
va_end(args);
lua_close(l);
exit(-1);
}


int _tmain(int argc, _TCHAR* argv[])
{
lua_State * l  = luaL_newstate();
luaL_openlibs(l);
if (luaL_loadfile(l,"test.lua") || lua_pcall(l,0,0,0))//执行lua.test
{
error(l,"error :%s",lua_tostring(l,-1));
}
lua_getglobal(l,"color");
int type = lua_type(l,-1);
if (type == LUA_TSTRING)//color 是一个字符串
{
const char * colorName = lua_tostring(l,-1);
int i = 0;
for (; c[i].name != NULL; i++)
{
if (strcmp(colorName,c[i].name) == 0)
{
break;
}
}
if (c[i].name != NULL)
{
int r = c[i].colorR;
int b = c[i].colorB;
int g = c[i].colorG;
printf("%d %d %d",r,g,b);
}
else{
printf("无效的 颜色字符:%s",colorName);
}
}
else if(type == LUA_TTABLE){//color 是 一个 rgb table
int r = getColorField(l,"r");
int g = getColorField(l,"g");
int b = getColorField(l,"b");
printf("%d %d %d",r,g,b);
}
else
{
printf("无效的颜色值");
}
return 0;
}


0 0