174 lines
No EOL
4.8 KiB
C++
174 lines
No EOL
4.8 KiB
C++
#include <tiny/tdf.h>
|
|
#include <lua5.1/lua.h>
|
|
#include <lua5.1/lualib.h>
|
|
#include <lua5.1/lauxlib.h>
|
|
|
|
#define TDFLUASTART (lua_State*L) { tiny::TDF_FILE*file=(tiny::TDF_FILE*)lua_touserdata(L,1); std::vector<std::string>path;\
|
|
int n=lua_gettop(L); for(int i=2;i<=n;i++){ path.push_back(luaL_checkstring(L,i)); }try{
|
|
|
|
#define TDFLUAEND }catch(tiny::TDF_ERR&e){lua_pushnil(L);lua_pushstring(L,e.what());return 2;}return 1;}
|
|
|
|
|
|
#define TDFLUASETSTART (lua_State*L) { tiny::TDF_FILE*file=(tiny::TDF_FILE*)lua_touserdata(L,1); std::vector<std::string>path;\
|
|
int n=lua_gettop(L);for(int i=2;i<n;i++){ path.push_back(luaL_checkstring(L,i)); }try{
|
|
|
|
#define TDFLUASETEND return 0; }catch(tiny::TDF_ERR&e){lua_pushstring(L,e.what());lua_error(L);return 0; }}
|
|
|
|
|
|
static int luatdfread(lua_State*L){
|
|
const char*filepath=luaL_checkstring(L,1);
|
|
tiny::TDF_FILE*file=new tiny::TDF_FILE();
|
|
file->filepath=(char*)filepath;
|
|
try{
|
|
file->read();
|
|
lua_pushlightuserdata(L,file);
|
|
return 1;
|
|
}catch(tiny::TDF_ERR&e){
|
|
lua_pushnil(L);
|
|
lua_pushstring(L,e.what());
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
static int luatdfsave(lua_State*L){
|
|
tiny::TDF_FILE*file=(tiny::TDF_FILE*)lua_touserdata(L,1);
|
|
file->save();
|
|
return 0;
|
|
}
|
|
|
|
static int luatdfclose(lua_State*L){
|
|
tiny::TDF_FILE*file=(tiny::TDF_FILE*)lua_touserdata(L,1);
|
|
file->close();
|
|
delete file;
|
|
return 0;
|
|
}
|
|
|
|
|
|
//get
|
|
|
|
|
|
static int luatdfgetint
|
|
TDFLUASTART int val=file->getint(path); lua_pushinteger(L,val); TDFLUAEND
|
|
|
|
static int luatdfgetfloat
|
|
TDFLUASTART float val=file->getfloat(path); lua_pushnumber(L,val); TDFLUAEND
|
|
|
|
static int luatdfgetstring
|
|
TDFLUASTART std::string val=file->getstring(path); lua_pushstring(L,val.c_str()); TDFLUAEND
|
|
|
|
static int luatdfgetbool
|
|
TDFLUASTART bool val=file->getbool(path); lua_pushboolean(L,val); TDFLUAEND
|
|
|
|
static int luatdfgetchar
|
|
TDFLUASTART char val=file->getchar(path); char str[2]={val,0}; lua_pushstring(L,str); TDFLUAEND
|
|
|
|
static int luatdfgetpointer
|
|
TDFLUASTART std::vector<std::string>val=file->getpointer(path); lua_newtable(L); for(size_t i=0;i<val.size();i++){ lua_pushstring(L,val[i].c_str()); lua_rawseti(L,-2,i+1);} TDFLUAEND
|
|
|
|
static int luatdfgetclass
|
|
TDFLUASTART boost::unordered_map<std::string,tiny::TDF_DATA>*val=file->getclass(path); lua_pushlightuserdata(L,val); TDFLUAEND
|
|
|
|
|
|
//set
|
|
|
|
|
|
static int luatdfsetint
|
|
TDFLUASETSTART int val=luaL_checkinteger(L,n); file->setint(path,val); TDFLUASETEND
|
|
|
|
static int luatdfsetfloat
|
|
TDFLUASETSTART float val=luaL_checknumber(L,n); file->setfloat(path,val); TDFLUASETEND
|
|
|
|
static int luatdfsetstring
|
|
TDFLUASETSTART const char*val=luaL_checkstring(L,n); file->setstring(path,val); TDFLUASETEND
|
|
|
|
static int luatdfsetblock
|
|
TDFLUASETSTART const char*val=luaL_checkstring(L,n); file->setblock(path,val); TDFLUASETEND
|
|
|
|
static int luatdfsetbool
|
|
TDFLUASETSTART bool val=lua_toboolean(L,n); file->setbool(path,val); TDFLUASETEND
|
|
|
|
static int luatdfsetchar
|
|
TDFLUASETSTART const char*str=luaL_checkstring(L,n); file->setchar(path,str[0]); TDFLUASETEND
|
|
|
|
|
|
|
|
static int luatdfdefined(lua_State*L){
|
|
tiny::TDF_FILE*file=(tiny::TDF_FILE*)lua_touserdata(L,1);
|
|
std::vector<std::string>path;
|
|
int n=lua_gettop(L);
|
|
for(int i=2;i<=n;i++){
|
|
path.push_back(luaL_checkstring(L,i));
|
|
}
|
|
bool val=file->defined(path);
|
|
lua_pushboolean(L,val);
|
|
return 1;
|
|
}
|
|
|
|
|
|
static int luatdfsetpointer(lua_State*L){
|
|
tiny::TDF_FILE*file=(tiny::TDF_FILE*)lua_touserdata(L,1);
|
|
std::vector<std::string>path;
|
|
int n=lua_gettop(L);
|
|
for(int i=2;i<n;i++){
|
|
path.push_back(luaL_checkstring(L,i));
|
|
}
|
|
luaL_checktype(L,n,LUA_TTABLE);
|
|
std::vector<std::string>val;
|
|
int len=lua_objlen(L,n);
|
|
for(int i=1;i<=len;i++){
|
|
lua_rawgeti(L,n,i);
|
|
val.push_back(luaL_checkstring(L,-1));
|
|
lua_pop(L,1);
|
|
}
|
|
try{
|
|
file->setpointer(path,val);
|
|
return 0;
|
|
}catch(tiny::TDF_ERR&e){
|
|
lua_pushstring(L,e.what());
|
|
lua_error(L);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
static int luatdfdefine(lua_State*L){
|
|
tiny::TDF_FILE*file=(tiny::TDF_FILE*)lua_touserdata(L,1);
|
|
luaL_checktype(L,2,LUA_TTABLE);
|
|
const char*name=luaL_checkstring(L,3);
|
|
std::vector<std::string>defines;
|
|
int len=lua_objlen(L,2);
|
|
for(int i=1;i<=len;i++){
|
|
lua_rawgeti(L,2,i);
|
|
defines.push_back(luaL_checkstring(L,-1));
|
|
lua_pop(L,1);
|
|
}
|
|
file->define(defines,(char*)name);
|
|
return 0;
|
|
}
|
|
|
|
static const luaL_Reg tdflib[]={
|
|
{"read",luatdfread},
|
|
{"close",luatdfclose},
|
|
{"getint",luatdfgetint},
|
|
{"getfloat",luatdfgetfloat},
|
|
{"getstring",luatdfgetstring},
|
|
{"getbool",luatdfgetbool},
|
|
{"getchar",luatdfgetchar},
|
|
{"getpointer",luatdfgetpointer},
|
|
{"getclass",luatdfgetclass},
|
|
{"defined",luatdfdefined},
|
|
{"setint",luatdfsetint},
|
|
{"setfloat",luatdfsetfloat},
|
|
{"setstring",luatdfsetstring},
|
|
{"setblock",luatdfsetblock},
|
|
{"setbool",luatdfsetbool},
|
|
{"setchar",luatdfsetchar},
|
|
{"setpointer",luatdfsetpointer},
|
|
{"define",luatdfdefine},
|
|
{"save",luatdfsave},
|
|
{NULL,NULL}
|
|
};
|
|
|
|
extern "C" int luaopentdf(lua_State*L){
|
|
luaL_register(L,"tdf",tdflib);
|
|
return 1;
|
|
} |