X-Git-Url: http://git.tuebingen.mpg.de/?p=adu.git;a=blobdiff_plain;f=interactive.c;h=494a4f8760fabdc95db2a9213a2057194ca80a74;hp=686a89f192aecfbc65373b49a7c0cd2486a57b71;hb=cecbe8525740b4a899cb1a6c91064e195ae1ada2;hpb=b01ff57775258c8df4c486b0962fc67cfdfef439 diff --git a/interactive.c b/interactive.c index 686a89f..494a4f8 100644 --- a/interactive.c +++ b/interactive.c @@ -4,29 +4,34 @@ #include "cmdline.h" #include "select.cmdline.h" -struct select_args_info select_conf; - struct interactive_command { const char *name; int (*handler)(char *); + const char *desc; }; +static struct uid_range *admissible_uids; + #define INTERACTIVE_COMMANDS \ - INTERACTIVE_COMMAND(dump) \ - INTERACTIVE_COMMAND(set) \ - INTERACTIVE_COMMAND(def) \ + INTERACTIVE_COMMAND(dump, "dump the current configuration") \ + INTERACTIVE_COMMAND(set, "change the current configuration") \ + INTERACTIVE_COMMAND(reset, "reset configuration to defaults") \ + INTERACTIVE_COMMAND(help, "show list of commands and one-line descriptions") \ + INTERACTIVE_COMMAND(run, "start the query according to the current options") -#define INTERACTIVE_COMMAND(name) \ + +#define INTERACTIVE_COMMAND(name, desc) \ static int icom_ ## name (char *line); INTERACTIVE_COMMANDS #undef INTERACTIVE_COMMAND -#define INTERACTIVE_COMMAND(_name) \ +#define INTERACTIVE_COMMAND(_name, _desc) \ { \ .name = #_name, \ - .handler = icom_ ## _name \ + .handler = icom_ ## _name, \ + .desc = _desc \ }, struct interactive_command icmds[] = { @@ -34,12 +39,28 @@ struct interactive_command icmds[] = { {.name = NULL} }; +#define FOR_EACH_COMMAND(c) for (c = icmds; c->name; c++) + static int read_input_line(char *line, size_t size) { return fgets(line, size, stdin)? 1 : -1; } -static int icom_def(__a_unused char *line) +static int icom_run(__a_unused char *line) +{ + return run_select_query(admissible_uids); +} + +static int icom_help(__a_unused char *line) +{ + struct interactive_command *c; + + FOR_EACH_COMMAND(c) + fprintf(stdout, "%s\t%s\n", c->name, c->desc); + return 1; +} + +static int icom_reset(__a_unused char *line) { select_cmdline_parser_init(&select_conf); return 1; @@ -54,9 +75,10 @@ static int icom_set(char *line) .check_ambiguity = 0, .print_errors = 1 }; - return select_cmdline_parser_string_ext(line, &select_conf, "select", - ¶ms)? - -E_SYNTAX : 1; + if (select_cmdline_parser_string_ext(line, &select_conf, "select", + ¶ms)) + return -E_SYNTAX; + return parse_uid_arg(select_conf.uid_arg, &admissible_uids); } static int icom_dump(__a_unused char *line) @@ -93,6 +115,7 @@ int com_interactive(void) char line[255]; int ret = 1; + select_cmdline_parser_init(&select_conf); while (read_input_line(line, sizeof(line)) >= 0) { size_t len = strlen(line); if (!len)