diff options
Diffstat (limited to 'libs/lua/luastate.cc')
-rw-r--r-- | libs/lua/luastate.cc | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/libs/lua/luastate.cc b/libs/lua/luastate.cc new file mode 100644 index 0000000000..546b02a006 --- /dev/null +++ b/libs/lua/luastate.cc @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2016 Robin Gareus <robin@gareus.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <assert.h> +#include "lua/luastate.h" + +// from lauxlib.c +static int panic (lua_State *L) { + lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n", + lua_tostring(L, -1)); + return 0; /* return to Lua to abort */ +} + +LuaState::LuaState() + : L (luaL_newstate ()) +{ + assert (L); + init (); +} + +LuaState::LuaState(lua_State *ls) + : L (ls) +{ + assert (L); + init (); +} + +LuaState::~LuaState() { + lua_close (L); +} + +void +LuaState::init() { + lua_atpanic (L, &panic); + luaL_openlibs (L); + lua_pushlightuserdata (L, this); + lua_pushcclosure (L, &LuaState::_print, 1); + lua_setglobal (L, "print"); +} + +int +LuaState::do_command (std::string cmd) { + int result = luaL_dostring (L, cmd.c_str()); + if (result != 0) { + print ("Error: " + std::string (lua_tostring (L, -1))); + } + return result; +} + +int +LuaState::do_file (std::string fn) { + int result = luaL_dofile (L, fn.c_str()); + if (result != 0) { + print ("Error: " + std::string (lua_tostring (L, -1))); + } + return result; +} + +void +LuaState::collect_garbage () { + lua_gc (L, LUA_GCCOLLECT, 0); +} + +void +LuaState::print (std::string text) { + Print (text); /* EMIT SIGNAL */ +} + +int +LuaState::_print (lua_State *L) { + LuaState* const luaState = static_cast <LuaState*> (lua_touserdata (L, lua_upvalueindex (1))); + std::string text; + int n = lua_gettop(L); /* number of arguments */ + int i; + lua_getglobal(L, "tostring"); + for (i=1; i<=n; i++) { + const char *s; + size_t l; + lua_pushvalue(L, -1); /* function to be called */ + lua_pushvalue(L, i); /* value to print */ + lua_call(L, 1, 1); + s = lua_tolstring(L, -1, &l); /* get result */ + if (s == NULL) + return luaL_error(L, "'tostring' must return a string to 'print'"); + if (i > 1) text += " "; + text += std::string (s, l); + lua_pop(L, 1); /* pop result */ + } + luaState->print (text); + return 0; +} |