diff options
author | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2012-09-05 23:08:38 -0700 |
---|---|---|
committer | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2012-09-05 23:08:38 -0700 |
commit | 6e3bd47994d2709366c2a7ae12c48f114a6c7826 (patch) | |
tree | d5c249ed9427d9b0544fbe86e1b4ec0e21154787 | |
parent | 1e29cceb800115252168226437454aea81bbe6db (diff) |
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.
m--------- | Balau | 0 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/Dalos-cli.cc | 109 |
3 files changed, 107 insertions, 4 deletions
diff --git a/Balau b/Balau -Subproject 983cb6320349852b16a4edc1c71d45f94b68954 +Subproject 2ff5eca44aefd7e6233b5f8fa628af7fc81ec3d @@ -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 <getopt.h> +#include <readline/readline.h> +#include <readline/history.h> #include <Main.h> #include <TaskMan.h> #include <LuaTask.h> +#include <Input.h> 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 <command> executes that command\n" +" -i interactive mode\n" +" -h help page\n" +, binname); + + if (longhelp) + Printer::print( +"\n" +); +} + void MainTask::Do() { + std::vector<String> 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<Input> 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); + } } |