diff --git a/plugins/Dfusion/dfusion.cpp b/plugins/Dfusion/dfusion.cpp index 4b740c43c..29492d801 100644 --- a/plugins/Dfusion/dfusion.cpp +++ b/plugins/Dfusion/dfusion.cpp @@ -28,6 +28,8 @@ static tthread::mutex* mymutex=0; static tthread::thread* thread_dfusion=0; uint64_t timeLast=0; +DFHACK_PLUGIN("dfusion") + command_result dfusion (Core * c, vector & parameters); command_result lua_run (Core * c, vector & parameters); diff --git a/plugins/Dfusion/include/lua_VersionInfo.h b/plugins/Dfusion/include/lua_VersionInfo.h index 99010f590..a4d7ed658 100644 --- a/plugins/Dfusion/include/lua_VersionInfo.h +++ b/plugins/Dfusion/include/lua_VersionInfo.h @@ -5,33 +5,7 @@ #include "luamain.h" namespace lua { -class OffsetGroup -{ - int tblid; - DFHack::OffsetGroup *p; -public: - int GetTableId(){return tblid;}; - //OffsetGroup(lua_State *L,DFHack::OffsetGroup *p); //constructor from c++ - OffsetGroup(lua_State *L,int id); //constructor from lua - - int getOffset(lua_State *L); - int getAddress(lua_State *L); - int getHexValue(lua_State *L); - int getString(lua_State *L); - int getGroup(lua_State *L); - - int getSafeOffset(lua_State *L); - int getSafeAddress(lua_State *L); - - int PrintOffsets(lua_State *L); - int getName(lua_State *L); - int getFullName(lua_State *L); - int getParent(lua_State *L); - int getKeys(lua_State *L); - - DEF_LUNE(OffsetGroup); -}; void RegisterVersionInfo(lua::state &st); } diff --git a/plugins/Dfusion/luafiles/patterns/xml_angavrilov.lua b/plugins/Dfusion/luafiles/patterns/xml_angavrilov.lua new file mode 100644 index 000000000..71e60645b --- /dev/null +++ b/plugins/Dfusion/luafiles/patterns/xml_angavrilov.lua @@ -0,0 +1,55 @@ + +function parseargs(s) + local arg = {} + string.gsub(s, "(%w+)=([\"'])(.-)%2", function (w, _, a) + arg[w] = a + end) + return arg +end + +function collect(s) + local stack = {} + local top = {} + table.insert(stack, top) + local ni,c,label,xarg, empty + local i, j = 1, 1 + while true do + ni,j,c,label,xarg, empty = string.find(s, "<(%/?)([%w:%-]+)(.-)(%/?)>", i) + if not ni then break end + local text = string.sub(s, i, ni-1) + if not string.find(text, "^%s*$") then + table.insert(top, text) + end + if empty == "/" then -- empty element tag + table.insert(top, {label=label, xarg=parseargs(xarg), empty=1}) + elseif c == "" then -- start tag + top = {label=label, xarg=parseargs(xarg)} + table.insert(stack, top) -- new level + else -- end tag + local toclose = table.remove(stack) -- remove top + top = stack[#stack] + if #stack < 1 then + error("nothing to close with "..label) + end + if toclose.label ~= label then + error("trying to close "..toclose.label.." with "..label) + end + table.insert(top, toclose) + end + i = j+1 + end + local text = string.sub(s, i) + if not string.find(text, "^%s*$") then + table.insert(stack[#stack], text) + end + if #stack > 1 then + error("unclosed "..stack[#stack].label) + end + return stack[1] +end + +function parseXmlFile(path) + local f, e = io.open(path, "r") + local xml = f:read("*a") + return collect(xml)[1] +end \ No newline at end of file diff --git a/plugins/Dfusion/src/lua_VersionInfo.cpp b/plugins/Dfusion/src/lua_VersionInfo.cpp index 8dd6b5f23..5ce469d35 100644 --- a/plugins/Dfusion/src/lua_VersionInfo.cpp +++ b/plugins/Dfusion/src/lua_VersionInfo.cpp @@ -1,460 +1,107 @@ #include "lua_VersionInfo.h" -namespace lua -{ -OffsetGroup::OffsetGroup(lua_State *L,int id):tblid(id) -{ - p=static_cast(lua_touserdata(L,1)); -} -int OffsetGroup::getOffset(lua_State *L) -{ - lua::state st(L); - int32_t ret=p->getOffset(st.as(1)); - st.push(ret); - return 1; -} -int OffsetGroup::getAddress(lua_State *L) -{ - lua::state st(L); - uint32_t ret= (uint32_t)p->getAddress(st.as(1)); - st.push(ret); - return 1; -} -int OffsetGroup::getHexValue(lua_State *L) -{ - lua::state st(L); - uint32_t ret=p->getHexValue(st.as(1)); - st.push(ret); - return 1; -} -int OffsetGroup::getString(lua_State *L) -{ - lua::state st(L); - std::string ret=p->getString(st.as(1)); - st.push(ret); - return 1; -} -int OffsetGroup::getGroup(lua_State *L) -{ - lua::state st(L); - DFHack::OffsetGroup* t= p->getGroup(st.as(1)); - st.getglobal("OffsetGroup"); - st.getfield("new"); - st.getglobal("OffsetGroup"); - st.pushlightuserdata(t); - st.pcall(2,1); +#define VI_FUNC(name) int lua_VI_ ## name (lua_State *L){\ + lua::state s(L);\ + DFHack::VersionInfo* vif=DFHack::Core::getInstance().vinfo; +#define END_VI_FUNC } + +VI_FUNC(getBase) +//int lua_VI_getBase(lua_State *L) + s.push(vif->getBase()); return 1; -} -int OffsetGroup::getSafeOffset(lua_State *L) -{ - lua::state st(L); - int32_t out; - bool ret=p->getSafeOffset(st.as(1),out); - st.push(ret); - st.push(out); - return 2; -} -int OffsetGroup::getSafeAddress(lua_State *L) -{ - lua::state st(L); - void * out; - bool ret=p->getSafeAddress(st.as(1),out); - st.push(ret); - st.push(out); - return 2; -} -int OffsetGroup::PrintOffsets(lua_State *L) -{ - lua::state st(L); - std::string output; - output=p->PrintOffsets(st.as(1)); - st.push(output); - return 1; -} -int OffsetGroup::getName(lua_State *L) -{ - lua::state st(L); - std::string ret=p->getName(); - st.push(ret); - return 1; -} -int OffsetGroup::getFullName(lua_State *L) -{ - lua::state st(L); - std::string ret=p->getFullName(); - st.push(ret); - return 1; -} -int OffsetGroup::getParent(lua_State *L) -{ - lua::state st(L); - DFHack::OffsetGroup* t= p->getParent(); - st.getglobal("OffsetGroup"); - st.getfield("new"); - st.getglobal("OffsetGroup"); - st.pushlightuserdata(t); - st.pcall(2,1); +END_VI_FUNC + +VI_FUNC(setBase) + uint32_t val=s.as(1); + vif->setBase(val); + return 0; +END_VI_FUNC +VI_FUNC(rebaseTo) + uint32_t val=s.as(1); + vif->rebaseTo(val); + return 0; +END_VI_FUNC +VI_FUNC(addMD5) + std::string val=s.as(1); + vif->addMD5(val); + return 0; +END_VI_FUNC +VI_FUNC(hasMD5) + std::string val=s.as(1); + s.push(vif->hasMD5(val)); return 1; -} -int OffsetGroup::getKeys(lua_State *L) -{ - const char* invalids[]={"notset","invalid","valid"}; - const char* keytypes[]={"offset","address","hexval","string","group"}; - lua::state st(L); - std::vector t= p->getKeys(); - st.newtable(); - for(size_t i=0;i(1); + vif->addPE(val); + return 0; +END_VI_FUNC - st.settable(); - } +VI_FUNC(hasPE) + uint32_t val=s.as(1); + s.push(vif->hasPE(val)); return 1; -} +END_VI_FUNC + +VI_FUNC(setVersion) + std::string val=s.as(1); + vif->setVersion(val); + return 0; +END_VI_FUNC -} -IMP_LUNE(lua::OffsetGroup,OffsetGroup); -LUNE_METHODS_START(lua::OffsetGroup) - method(lua::OffsetGroup,getOffset), - method(lua::OffsetGroup,getAddress), - method(lua::OffsetGroup,getHexValue), - method(lua::OffsetGroup,getString), - method(lua::OffsetGroup,getGroup), +VI_FUNC(getVersion) + s.push(vif->getVersion()); + return 1; +END_VI_FUNC - method(lua::OffsetGroup,getSafeOffset), - method(lua::OffsetGroup,getSafeAddress), +VI_FUNC(setAddress) + std::string key=s.as(1); + uint32_t val=s.as(2); + vif->setAddress(key,val); + return 0; +END_VI_FUNC - method(lua::OffsetGroup,PrintOffsets), - method(lua::OffsetGroup,getName), - method(lua::OffsetGroup,getFullName), - method(lua::OffsetGroup,getParent), - method(lua::OffsetGroup,getKeys), -LUNE_METHODS_END(); -// VersionInfo Stuff -static int __lua_getMD5(lua_State *S) -{ - lua::state st(S); - std::string output; - bool ret=DFHack::Core::getInstance().vinfo->getMD5(output); - st.push(ret); - st.push(output); - return 2; -} -static int __lua_getPE(lua_State *S) -{ - lua::state st(S); - uint32_t output; - bool ret=DFHack::Core::getInstance().vinfo->getPE(output); - st.push(ret); - st.push(output); - return 2; -} -static int __lua_PrintOffsets(lua_State *S) -{ - lua::state st(S); - std::string output; - //if(st.is(1)) - output=DFHack::Core::getInstance().vinfo->PrintOffsets(); - //else - // output=DFHack::Core::getInstance().vinfo->PrintOffsets(st.as(1)); //TODO add when virtual methods are ok - st.push(output); - return 1; -} -static int __lua_getMood(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getMood(st.as(1)); - st.push(output); - return 1; -} -/*static int __lua_getString(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getString(st.as(1)); - st.push(output); - return 1; -}*/ -static int __lua_getProfession(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getProfession(st.as(1)); - st.push(output); - return 1; -} -static int __lua_getJob(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getJob(st.as(1)); - st.push(output); - return 1; -} -static int __lua_getSkill(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getSkill(st.as(1)); - st.push(output); - return 1; -} -static int __lua_getTrait(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getTrait(st.as(1),st.as(2)); - st.push(output); - return 1; -} -static int __lua_getTraitName(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getTraitName(st.as(1)); - st.push(output); - return 1; -} -static int __lua_getLabor(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getLabor(st.as(1)); - st.push(output); - return 1; -} -static int __lua_getAllTraits(lua_State *S) -{ - lua::state st(S); - std::vector< std::vector > output=DFHack::Core::getInstance().vinfo->getAllTraits(); - st.newtable(); - for(size_t i=0;i output=DFHack::Core::getInstance().vinfo->getAllLabours(); - st.newtable(); - for(std::map::iterator it=output.begin();it!=output.end();it++) - { - st.push(it->first); - st.push(it->second); - st.settable(); - } - return 1; -} -static int __lua_getLevelInfo(lua_State *S) -{ - lua::state st(S); - DFHack::t_level output=DFHack::Core::getInstance().vinfo->getLevelInfo(st.as(1)); - st.newtable(); - st.push(output.level); - st.setfield("level"); - st.push(output.name); - st.setfield("name"); - st.push(output.xpNxtLvl); - st.setfield("xpNxtLvl"); - return 1; -} -static int __lua_getVersion(lua_State *S) -{ - lua::state st(S); - std::string output=DFHack::Core::getInstance().vinfo->getVersion(); - st.push(output); - return 1; -} -static int __lua_getOS(lua_State *S) -{ - lua::state st(S); - DFHack::OSType output=DFHack::Core::getInstance().vinfo->getOS(); - st.push(output); - return 1; -} -static int __lua_resolveObjectToClassID(lua_State *S) -{ - lua::state st(S); - int32_t ret; - bool output=DFHack::Core::getInstance().vinfo->resolveObjectToClassID((char *)st.as(1),ret); - st.push(output); - st.push(ret); - return 2; -} -static int __lua_resolveClassnameToClassID(lua_State *S) -{ - lua::state st(S); - int32_t ret; - bool output=DFHack::Core::getInstance().vinfo->resolveClassnameToClassID(st.as(1),ret); - st.push(output); - st.push(ret); - return 2; -} -static int __lua_resolveClassnameToVPtr(lua_State *S) -{ - lua::state st(S); - void * ret; - bool output=DFHack::Core::getInstance().vinfo->resolveClassnameToVPtr(st.as(1),ret); - st.push(output); - st.pushlightuserdata(ret); - return 2; -} -static int __lua_resolveClassIDToClassname(lua_State *S) -{ - lua::state st(S); - std::string ret; - bool output=DFHack::Core::getInstance().vinfo->resolveClassIDToClassname(st.as(1),ret); - st.push(output); - st.push(ret); - return 2; -} -// OFFSET BASE STUFF (for version info) -static int __lua_getOffset(lua_State *S) -{ - lua::state st(S); - int32_t ret=DFHack::Core::getInstance().vinfo->getOffset(st.as(1)); - st.push(ret); - return 1; -} -static int __lua_getAddress(lua_State *S) -{ - lua::state st(S); - void * ret=DFHack::Core::getInstance().vinfo->getAddress(st.as(1)); - st.push(ret); - return 1; -} -static int __lua_getHexValue(lua_State *S) -{ - lua::state st(S); - uint32_t ret=DFHack::Core::getInstance().vinfo->getHexValue(st.as(1)); - st.push(ret); - return 1; -} -/*static int __lua_getString(lua_State *S) //from offsetbase -{ - lua::state st(S); - std::string ret=DFHack::Core::getInstance().vinfo->getString(st.as(1)); - st.push(ret); - return 1; -}*/ -static int __lua_getGroup(lua_State *S) -{ - lua::state st(S); - if(st.as(1)=="") //if no argument, return version info as a groupoffset (dynamic cast) - { - st.getglobal("OffsetGroup"); - st.getfield("new"); - st.getglobal("OffsetGroup"); - st.pushlightuserdata(dynamic_cast(DFHack::Core::getInstance().vinfo)); - st.pcall(2,1); - } - else - { - DFHack::OffsetGroup* t= DFHack::Core::getInstance().vinfo->getGroup(st.as(1)); - st.getglobal("OffsetGroup"); - st.getfield("new"); - st.getglobal("OffsetGroup"); - st.pushlightuserdata(t); - st.pcall(2,1); - } - return 1; -} -static int __lua_getParent(lua_State *S) -{ - lua::state st(S); - DFHack::OffsetGroup* t= DFHack::Core::getInstance().vinfo->getParent(); - st.getglobal("OffsetGroup"); - st.getfield("new"); - st.getglobal("OffsetGroup"); - st.pushlightuserdata(t); - st.pcall(2,1); +VI_FUNC(getAddress) + std::string key=s.as(1); + + s.push(vif->getAddress(key)); return 1; -} -static int __lua_getSafeOffset(lua_State *S) -{ - lua::state st(S); - int32_t out; - bool ret=DFHack::Core::getInstance().vinfo->getSafeOffset(st.as(1),out); - st.push(ret); - st.push(out); - return 2; -} -static int __lua_getSafeAddress(lua_State *S) -{ - lua::state st(S); - void * out; - bool ret=DFHack::Core::getInstance().vinfo->getSafeAddress(st.as(1),out); - st.push(ret); - st.push(out); - return 2; -} -//std::string PrintOffsets(int indentation); //overload up there^^^ -static int __lua_getName(lua_State *S) -{ - lua::state st(S); - std::string ret=DFHack::Core::getInstance().vinfo->getName(); - st.push(ret); - return 1; -} -static int __lua_getFullName(lua_State *S) -{ - lua::state st(S); - std::string ret=DFHack::Core::getInstance().vinfo->getFullName(); - st.push(ret); - return 1; -} +END_VI_FUNC + +VI_FUNC(setOS) + unsigned os=s.as(1); + vif->setOS((DFHack::OSType)os); + return 0; +END_VI_FUNC -#define ___m(x) {#x,__lua_##x} +VI_FUNC(getOS) + s.push(vif->getOS()); + return 1; +END_VI_FUNC +#undef VI_FUNC +#undef END_VI_FUNC +#define VI_FUNC(name) {#name,lua_VI_ ## name} const luaL_Reg lua_vinfo_func[]= { - ___m(getMD5), - ___m(getPE), - ___m(PrintOffsets), - ___m(getMood), -// ___m(getString), - ___m(getProfession), - ___m(getJob), - ___m(getSkill), - ___m(getTrait), - ___m(getTraitName), - ___m(getLabor), - ___m(getAllTraits), - ___m(getAllLabours), - ___m(getLevelInfo), - ___m(getVersion), - ___m(getOS), - ___m(resolveObjectToClassID), - ___m(resolveClassnameToClassID), - ___m(resolveClassnameToVPtr), - ___m(resolveClassIDToClassname), - - ___m(getGroup), - ___m(getParent), - - ___m(getOffset), - ___m(getAddress), - ___m(getHexValue), - //___m(getString), - ___m(getSafeOffset), - ___m(getSafeAddress), - ___m(getName), - ___m(getFullName), - - {NULL,NULL} + VI_FUNC(getBase), + VI_FUNC(setBase), + VI_FUNC(rebaseTo), + VI_FUNC(addMD5), + VI_FUNC(hasMD5), + VI_FUNC(addPE), + VI_FUNC(hasPE), + VI_FUNC(setVersion), + VI_FUNC(getVersion), + VI_FUNC(setAddress), + VI_FUNC(getAddress), + VI_FUNC(setOS), + VI_FUNC(getOS) }; -#undef ___m +#undef VI_FUNC void lua::RegisterVersionInfo(lua::state &st) { + st.getglobal("VersionInfo"); if(st.is()) { @@ -464,5 +111,4 @@ void lua::RegisterVersionInfo(lua::state &st) lua::RegFunctionsLocal(st, lua_vinfo_func); st.setglobal("VersionInfo"); - Lune::Register(st); }