LuaSession: allow multi-line commands and functions
This commit is contained in:
parent
9b2612f686
commit
f83e87cf3b
@ -398,6 +398,19 @@ static void setup_lua ()
|
|||||||
AudioEngine::instance ()->stop ();
|
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, "<eof>") == 0) {
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
init ();
|
init ();
|
||||||
@ -406,6 +419,7 @@ int main (int argc, char **argv)
|
|||||||
using_history ();
|
using_history ();
|
||||||
std::string histfile = Glib::build_filename (user_config_directory(), "/luahist");
|
std::string histfile = Glib::build_filename (user_config_directory(), "/luahist");
|
||||||
|
|
||||||
|
rl_bind_key ('\t', rl_insert); // disable completion
|
||||||
read_history (histfile.c_str());
|
read_history (histfile.c_str());
|
||||||
|
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
@ -421,8 +435,30 @@ int main (int argc, char **argv)
|
|||||||
continue;
|
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)) {
|
if (lua->do_command (line)) {
|
||||||
// error
|
/* error */
|
||||||
|
free (line); line = NULL;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
add_history (line);
|
add_history (line);
|
||||||
|
Loading…
Reference in New Issue
Block a user