From 6e3bd47994d2709366c2a7ae12c48f114a6c7826 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 5 Sep 2012 23:08:38 -0700 Subject: Dalos-cli is alive. It has an interactive loop, a way to handle command line, and can run Lua code. Probably not win32-compatible yet though. --- Balau | 2 +- Makefile | 2 +- src/Dalos-cli.cc | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 108 insertions(+), 5 deletions(-) diff --git a/Balau b/Balau index 983cb63..2ff5eca 160000 --- a/Balau +++ b/Balau @@ -1 +1 @@ -Subproject commit 983cb6320349852b16a4edc1c71d45f94b689544 +Subproject commit 2ff5eca44aefd7e6233b5f8fa628af7fc81ec3d1 diff --git a/Makefile b/Makefile index 656b6d8..bf331cd 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ LDFLAGS += -g endif INCLUDES = includes Balau/includes Balau/libcoro Balau/libeio Balau/libev Balau/LuaJIT/src -LIBS = z +LIBS = z readline ifeq ($(SYSTEM),Darwin) CC = clang diff --git a/src/Dalos-cli.cc b/src/Dalos-cli.cc index 7a5c5ba..0b24f83 100644 --- a/src/Dalos-cli.cc +++ b/src/Dalos-cli.cc @@ -1,13 +1,116 @@ +#include +#include +#include #include #include #include +#include using namespace Balau; +int getopt_flag = 0; + +struct option long_options[] = { + { "help", 0, NULL, 'h' }, + { "verbose", 0, NULL, 'v' }, + { "exec", 1, NULL, 'e' }, + { "interactive", 0, NULL, 'i' }, + { NULL, 0, NULL, 0 }, +}; + +static void showhelp(const char * binname, bool longhelp) { + Printer::print( +"Usage:\n" +"%s [options] [lua-script-1] [lua-script-2] ...\n" +"\n" +"Options:\n" +" -v for verbose mode\n" +" -e executes that command\n" +" -i interactive mode\n" +" -h help page\n" +, binname); + + if (longhelp) + Printer::print( +"\n" +); +} + void MainTask::Do() { + std::vector execs; + bool interactive = false; + bool todo = false; + bool error = false; + char c; + Printer::log(M_STATUS, "Dalos-cli starting"); - LuaMainTask * luaMainTask = createTask(new LuaMainTask); - LuaExecString luaExecString("print 'foo'"); - luaExecString.exec(luaMainTask); + LuaMainTask * luaMainTask = TaskMan::registerTask(new LuaMainTask); + + while ((c = getopt_long(argc, argv, "Hhve:i", long_options, NULL)) != EOF) { + switch (c) { + case 'h': + case 'H': + case '?': + showhelp(argv[0], true); + return; + case 'v': + Printer::enable(M_ALL); + break; + case 'e': + execs.push_back(optarg); + break; + case 'i': + interactive = true; + break; + default: + showhelp(argv[0], false); + return; + } + } + + while (optind < argc) { + todo = true; + IO file(new Input(argv[optind++])); + LuaExecFile luaExecFile(file); + luaExecFile.exec(luaMainTask); + if (luaExecFile.gotError()) + return; + } + + for (auto & exec : execs) { + todo = true; + LuaExecString luaExecString(exec); + luaExecString.exec(luaMainTask); + if (luaExecString.gotError()) + return; + } + + if (!todo && !interactive) + showhelp(argv[0], false); + + if (!interactive) + return; + + char prompt[3] = "> ", * line_read = NULL; + + for (;;) { + if (line_read) + free(line_read); + + line_read = readline(prompt); + + if (!line_read) { + Printer::print("\n"); + break; + } + + if (*line_read) + add_history(line_read); + + String line = line_read; + + LuaExecString luaExecString(line); + luaExecString.exec(luaMainTask); + } } -- cgit v1.2.3