#include #include #include "cli.h" #include "log.h" #include "serval.h" #include "rhizome.h" int cli_usage(const struct cli_schema *commands) { printf("Usage:\n"); unsigned cmd; for (cmd = 0; commands[cmd].function; ++cmd) { unsigned opt; const char *word; for (opt = 0; (word = commands[cmd].words[opt]); ++opt) { if (word[0] == '\\') ++word; printf(" %s", word); } printf("\n %s\n",commands[cmd].description); } return 0; } int cli_parse(const int argc, const char *const *args, const struct cli_schema *commands, struct cli_parsed *parsed) { int ambiguous = 0; int matched_cmd = -1; int cmd; for (cmd = 0; commands[cmd].function; ++cmd) { struct cli_parsed cmdpa; memset(&cmdpa, 0, sizeof cmdpa); cmdpa.command = &commands[cmd]; cmdpa.args = args; cmdpa.argc = argc; cmdpa.labelc = 0; cmdpa.varargi = -1; const char *word = NULL; unsigned arg = 0; unsigned opt = 0; while ((word = commands[cmd].words[opt])) { //DEBUGF("cmd=%d opt=%d word='%s' args[arg=%d]='%s'", cmd, opt, word, arg, arg < argc ? args[arg] : ""); unsigned wordlen = strlen(word); if (cmdpa.varargi != -1) return WHYF("Internal error: commands[%d].word[%d]=\"%s\" - more words not allowed after \"...\"", cmd, opt, word); /* These are the argument matching rules: * * "..." consumes all remaining arguments * * "word" consumes one argument that exactly matches "word", does not label it * * "\word" consumes one argument that exactly matches "word" and labels it "word" * * "[word]" consumes one argument if it exactly matches "word", records it with label * "word" * * "