From f83e87cf3b75a0eaf8a306b8a242ad79730b3879 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 12 Nov 2018 23:14:48 +0100 Subject: LuaSession: allow multi-line commands and functions --- tools/luadevel/luasession.cc | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/luadevel/luasession.cc b/tools/luadevel/luasession.cc index c6977529c0..13c4460c9d 100644 --- a/tools/luadevel/luasession.cc +++ b/tools/luadevel/luasession.cc @@ -398,6 +398,19 @@ static void setup_lua () AudioEngine::instance ()->stop (); } +static int +incomplete (lua_State* L, int status) { + if (status == LUA_ERRSYNTAX) { + size_t lmsg; + const char *msg = lua_tolstring (L, -1, &lmsg); + if (lmsg >= 5 && strcmp(msg + lmsg - 5, "") == 0) { + lua_pop(L, 1); + return 1; + } + } + return 0; +} + int main (int argc, char **argv) { init (); @@ -406,6 +419,7 @@ int main (int argc, char **argv) using_history (); std::string histfile = Glib::build_filename (user_config_directory(), "/luahist"); + rl_bind_key ('\t', rl_insert); // disable completion read_history (histfile.c_str()); char *line = NULL; @@ -421,8 +435,30 @@ int main (int argc, char **argv) continue; } + do { + LuaState lt; + lua_State* L = lt.getState (); + int status = luaL_loadbuffer (L, line, strlen(line), "=stdin"); + if (!incomplete (L, status)) { + break; + } + char *l2 = readline (">> "); + if (!l2) { + break; + } + if (strlen (l2) == 0) { + continue; + } + line = (char*) realloc ((void*)line, (strlen(line) + strlen (l2) + 2) * sizeof(char)); + strcat (line, "\n"); + strcat (line, l2); + free (l2); + } while (1); + if (lua->do_command (line)) { - // error + /* error */ + free (line); line = NULL; + continue; } add_history (line); -- cgit v1.2.3