summaryrefslogtreecommitdiff
path: root/libs/lua/luastate.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/lua/luastate.cc')
-rw-r--r--libs/lua/luastate.cc106
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;
+}