#include #include #include #include #define TDFLUASTART (lua_State*L) { tiny::TDF_FILE*file=(tiny::TDF_FILE*)lua_touserdata(L,1); std::vectorpath;\ 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::vectorpath;\ int n=lua_gettop(L);for(int i=2;ifilepath=(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::vectorval=file->getpointer(path); lua_newtable(L); for(size_t i=0;i*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::vectorpath; 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::vectorpath; int n=lua_gettop(L); for(int i=2;ival; 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::vectordefines; 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; }