
On 20.08.2013 22:02, Tomas Meszaros wrote:
* vshMalloc is now used in vshDetermineCommandName * vshStrdup instead of vshMalloc + snprintf * joined if's in vshReadlineOptionsCompletionGenerator --- tools/virsh.c | 395 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 373 insertions(+), 22 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c index 15f529e..af6e939 100644 --- a/tools/virsh.c +++ b/tools/virsh.c
@@ -2605,22 +2613,365 @@ vshReadlineOptionsGenerator(const char *text, int state) return NULL; }
+/* + * Generator function for command completion, but unlike + * the vshRaadlineCommandGenerator which completes command name, this function
s/vshRaadlineCommandGenerator/tools/vshReadlineCommandGenerator/ (Raad vs Read).
+ * provides more advanced completion for commands by calling specific command + * completers (e.g. vshDomainCompleter). + */ +static char * +vshReadlineCommandCompletionGenerator(const char *text, int state) +{ + static const vshCmdDef *cmd = NULL;
+/* + * Returns current valid command option name present in the rl_line_buffer. + */ +static char * +vshCurrentOpt(const char *cmd_name) +{ + const vshCmdDef *cmd = NULL; + const char *name; + unsigned long int opt_index = 0; + size_t cmd_opt_list_index; + char *found_opt = NULL; + char *ptr = NULL; + + if (!cmd_name) + return NULL; + + cmd = vshCmddefSearch(cmd_name); + + if (!cmd) + return NULL; + + if (!cmd->opts) + return NULL; + + cmd_opt_list_index = 0; + + while ((name = cmd->opts[cmd_opt_list_index].name)) { + cmd_opt_list_index++; + + if ((ptr = strstr(rl_line_buffer, name))) { + if (opt_index < (ptr - rl_line_buffer)) { + opt_index = ptr - rl_line_buffer; + if (VIR_STRDUP(found_opt, name) < 0) + return NULL; + } + } + } + + if (!found_opt) + return NULL;
this if is useless.
+ + return found_opt; +} +
Michal