From 260bdfac0d9c0f416fe6c493e314a6e8d1fdc2bb Mon Sep 17 00:00:00 2001 From: Warmist Date: Wed, 27 Jul 2011 23:41:56 +0300 Subject: [PATCH] Peek and pokes with lua bindings Signed-off-by: Warmist --- plugins/Dfusion/dfusion.cpp | 26 +++++- plugins/Dfusion/src/lua_Offsets.cpp | 134 +++++++++++++++++++++++++++- 2 files changed, 157 insertions(+), 3 deletions(-) diff --git a/plugins/Dfusion/dfusion.cpp b/plugins/Dfusion/dfusion.cpp index 28977c51d..0324716ef 100644 --- a/plugins/Dfusion/dfusion.cpp +++ b/plugins/Dfusion/dfusion.cpp @@ -82,7 +82,29 @@ DFhackCExport command_result plugin_onupdate ( Core * c ) return CR_OK; } - +void InterpreterLoop(Core* c) +{ + Console &con=c->con; + lua::state s=lua::glua::Get(); + string curline; + con.print("Type quit to exit interactive mode\n"); + con.lineedit(">>",curline); + + while (curline!="quit") { + try + { + s.loadstring(curline); + s.pcall(); + } + catch(lua::exception &e) + { + con.printerr("Error:%s\n",e.what()); + s.settop(0); + } + con.lineedit(">>",curline); + } + s.settop(0); +} DFhackCExport command_result lua_run (Core * c, vector & parameters) { Console &con=c->con; @@ -101,7 +123,7 @@ DFhackCExport command_result lua_run (Core * c, vector & parameters) } else { - //TODO interpreter... + InterpreterLoop(c); } s.settop(0);// clean up mymutex->unlock(); diff --git a/plugins/Dfusion/src/lua_Offsets.cpp b/plugins/Dfusion/src/lua_Offsets.cpp index 86768d051..459920ae4 100644 --- a/plugins/Dfusion/src/lua_Offsets.cpp +++ b/plugins/Dfusion/src/lua_Offsets.cpp @@ -12,7 +12,139 @@ unsigned peekd(size_t offset) { return *((unsigned*)(offset)); } -void lua::RegisterEngine(lua::state &st) +void peekarb(size_t offset, void *mem,size_t size) +{ + memcpy(mem,(void*)offset,size); +} +void peekstr(size_t offset, char* buf, size_t maxsize) +{ + strcpy_s(buf,maxsize,(char*)offset); +} +void pokeb(size_t offset,unsigned char val) +{ + *((unsigned char*)(offset))=val; +} +void pokew(size_t offset,unsigned short val) +{ + *((unsigned short*)(offset))=val; +} +void poked(size_t offset,unsigned val) +{ + *((unsigned*)(offset))=val; +} +void pokearb(size_t offset, void *mem,size_t size) { + memcpy((void*)offset,mem,size); +} +void pokestr(size_t offset, char* buf, size_t maxsize) +{ + strcpy_s((char*)offset,maxsize,buf); +} +template +T peek(size_t offset) //prob lower performance +{ + T tmp; + peekarb(offset,&tmp,sizeof(T)); + return tmp; +} +//// lua stuff here +static int lua_peekb(lua_State *L) +{ + lua::state st(L); + st.push(peekb(st.as(1))); + return 1; +} +static int lua_peekd(lua_State *L) +{ + lua::state st(L); + st.push(peekd(st.as(1))); + return 1; +} +static int lua_peekw(lua_State *L) +{ + lua::state st(L); + st.push(peekw(st.as(1))); + return 1; +} +static int lua_peekarb(lua_State *L) +{ + lua::state st(L); + size_t size=st.as(2); + void *p=st.newuserdata(size); + peekarb(st.as(1),p,size); + return 1; +} +static int lua_peekstr(lua_State *L) +{ + lua::state st(L); + char *buf; + buf=new char[256]; + peekstr(st.as(1),buf,256); + std::string tstr(buf); + st.push(tstr); + delete [] buf; + return 1; +} +/*static int lua_peekarb(lua_State *L) +{ + lua::state st(L); + st.push(peekarb(st.as(1))); + return 1; +}*/ +static int lua_pokeb(lua_State *L) +{ + lua::state st(L); + pokeb(st.as(1),st.as(2)); + return 0; +} +static int lua_poked(lua_State *L) +{ + lua::state st(L); + poked(st.as(1),st.as(2)); + return 0; +} +static int lua_pokew(lua_State *L) +{ + lua::state st(L); + pokew(st.as(1),st.as(2)); + return 0; +} +static int lua_pokearb(lua_State *L) +{ + lua::state st(L); + + + void *p=(void *)lua_touserdata(L, 2);//st.as(2); + size_t size=st.as(3); + + pokearb(st.as(1),p,size); + return 0; +} +static int lua_pokestr(lua_State *L) +{ + lua::state st(L); + std::string trg=st.as(2); + pokestr(st.as(1),(char*)trg.c_str(),trg.size()); + return 0; +} +const luaL_Reg lua_engine_func[]= +{ + {"peekb",lua_peekb}, + {"peekw",lua_peekw}, + {"peekd",lua_peekd}, + {"peekarb",lua_peekarb}, + {"peekstr",lua_peekstr}, + {"pokeb",lua_pokeb}, + {"pokew",lua_pokew}, + {"poked",lua_poked}, + {"pokearb",lua_pokearb}, + {"pokestr",lua_pokestr}, + {NULL,NULL} +}; +void lua::RegisterEngine(lua::state &st) +{ + st.newtable(); + lua::RegFunctionsLocal(st,lua_engine_func); + st.setglobal("engine"); } \ No newline at end of file