Message ID | 1372078125-31085-6-git-send-email-xiawenc@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
于 2013-6-24 20:48, Wenchao Xia 写道: > This patch allow auot completion work normal in sub command case, > "info block [DEVICE]" can auto complete now, by re-enter the completion > function. Also, original "info" is treated as a special case, now it is > treated as a sub command group, global variable info_cmds is not used > any more. > > "help" command is still treated as a special case, since it is not a sub > command group but want to auto complete command in root command table. > > Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> > --- > monitor.c | 36 ++++++++++++++++++++++++------------ > 1 files changed, 24 insertions(+), 12 deletions(-) > > diff --git a/monitor.c b/monitor.c > index aa641de..f364a0d 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -4179,10 +4179,11 @@ static const char *next_arg_type(const char *typestr) > return (p != NULL ? ++p : typestr); > } > > -static void monitor_find_completion(Monitor *mon, > - const char *cmdline) > +static void monitor_find_completion_by_table(Monitor *mon, > + const mon_cmd_t *cmd_table, > + const char *cmdline) > { > - const char *cmdname; > + const char *cmdname, *p; > char *args[MAX_ARGS]; > int nb_args, i, len; > const char *ptype, *str; > @@ -4212,12 +4213,12 @@ static void monitor_find_completion(Monitor *mon, > else > cmdname = args[0]; > readline_set_completion_index(mon->rs, strlen(cmdname)); > - for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) { > + for (cmd = cmd_table; cmd->name != NULL; cmd++) { > cmd_completion(mon, cmdname, cmd->name); > } > } else { > /* find the command */ > - for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) { > + for (cmd = cmd_table; cmd->name != NULL; cmd++) { > if (compare_cmd(args[0], cmd->name)) { > break; > } > @@ -4226,6 +4227,17 @@ static void monitor_find_completion(Monitor *mon, > goto cleanup; > } > > + /* locate next valid string in original cmdline used by re-enter */ > + p = cmdline + strlen(args[0]); > + while (qemu_isspace(*p)) { > + p++; > + } > + Here it can't handle command start with space such as " blk", I plan make parse_cmdline() return additional const char **args_cmdline, which point to cmdline correspond to each args. Just want to mention it to save reviewer's time, I'll fix it with any other comments:). > + if (cmd->sub_table) { > + monitor_find_completion_by_table(mon, cmd->sub_table, p); > + goto cleanup; > + } > + > ptype = next_arg_type(cmd->args_type); > for(i = 0; i < nb_args - 2; i++) { > if (*ptype != '\0') { > @@ -4252,13 +4264,7 @@ static void monitor_find_completion(Monitor *mon, > bdrv_iterate(block_completion_it, &mbs); > break; > case 's': > - /* XXX: more generic ? */ > - if (!strcmp(cmd->name, "info")) { > - readline_set_completion_index(mon->rs, strlen(str)); > - for(cmd = info_cmds; cmd->name != NULL; cmd++) { > - cmd_completion(mon, str, cmd->name); > - } > - } else if (!strcmp(cmd->name, "sendkey")) { > + if (!strcmp(cmd->name, "sendkey")) { > char *sep = strrchr(str, '-'); > if (sep) > str = sep + 1; > @@ -4284,6 +4290,12 @@ cleanup: > } > } > > +static void monitor_find_completion(Monitor *mon, > + const char *cmdline) > +{ > + return monitor_find_completion_by_table(mon, mon->cmd_table, cmdline); > +} > + > static int monitor_can_read(void *opaque) > { > Monitor *mon = opaque; >
On Wed, 26 Jun 2013 12:03:39 +0800 Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote: > 于 2013-6-24 20:48, Wenchao Xia 写道: > > This patch allow auot completion work normal in sub command case, > > "info block [DEVICE]" can auto complete now, by re-enter the completion > > function. Also, original "info" is treated as a special case, now it is > > treated as a sub command group, global variable info_cmds is not used > > any more. > > > > "help" command is still treated as a special case, since it is not a sub > > command group but want to auto complete command in root command table. > > > > Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> > > --- > > monitor.c | 36 ++++++++++++++++++++++++------------ > > 1 files changed, 24 insertions(+), 12 deletions(-) > > > > diff --git a/monitor.c b/monitor.c > > index aa641de..f364a0d 100644 > > --- a/monitor.c > > +++ b/monitor.c > > @@ -4179,10 +4179,11 @@ static const char *next_arg_type(const char *typestr) > > return (p != NULL ? ++p : typestr); > > } > > > > -static void monitor_find_completion(Monitor *mon, > > - const char *cmdline) > > +static void monitor_find_completion_by_table(Monitor *mon, > > + const mon_cmd_t *cmd_table, > > + const char *cmdline) > > { > > - const char *cmdname; > > + const char *cmdname, *p; > > char *args[MAX_ARGS]; > > int nb_args, i, len; > > const char *ptype, *str; > > @@ -4212,12 +4213,12 @@ static void monitor_find_completion(Monitor *mon, > > else > > cmdname = args[0]; > > readline_set_completion_index(mon->rs, strlen(cmdname)); > > - for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) { > > + for (cmd = cmd_table; cmd->name != NULL; cmd++) { > > cmd_completion(mon, cmdname, cmd->name); > > } > > } else { > > /* find the command */ > > - for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) { > > + for (cmd = cmd_table; cmd->name != NULL; cmd++) { > > if (compare_cmd(args[0], cmd->name)) { > > break; > > } > > @@ -4226,6 +4227,17 @@ static void monitor_find_completion(Monitor *mon, > > goto cleanup; > > } > > > > + /* locate next valid string in original cmdline used by re-enter */ > > + p = cmdline + strlen(args[0]); > > + while (qemu_isspace(*p)) { > > + p++; > > + } > > + > Here it can't handle command start with space such as " blk", I plan > make parse_cmdline() return additional const char **args_cmdline, which > point to cmdline correspond to each args. Just want to > mention it to save reviewer's time, I'll fix it with any other > comments:). I prefer you respin it first, because it's not unusual that a single change like this one ends up requiring more changes. Also, if the series is good enough I can apply it w/o having to wait for another version. > > > > + if (cmd->sub_table) { > > + monitor_find_completion_by_table(mon, cmd->sub_table, p); > > + goto cleanup; > > + } > > + > > ptype = next_arg_type(cmd->args_type); > > for(i = 0; i < nb_args - 2; i++) { > > if (*ptype != '\0') { > > @@ -4252,13 +4264,7 @@ static void monitor_find_completion(Monitor *mon, > > bdrv_iterate(block_completion_it, &mbs); > > break; > > case 's': > > - /* XXX: more generic ? */ > > - if (!strcmp(cmd->name, "info")) { > > - readline_set_completion_index(mon->rs, strlen(str)); > > - for(cmd = info_cmds; cmd->name != NULL; cmd++) { > > - cmd_completion(mon, str, cmd->name); > > - } > > - } else if (!strcmp(cmd->name, "sendkey")) { > > + if (!strcmp(cmd->name, "sendkey")) { > > char *sep = strrchr(str, '-'); > > if (sep) > > str = sep + 1; > > @@ -4284,6 +4290,12 @@ cleanup: > > } > > } > > > > +static void monitor_find_completion(Monitor *mon, > > + const char *cmdline) > > +{ > > + return monitor_find_completion_by_table(mon, mon->cmd_table, cmdline); > > +} > > + > > static int monitor_can_read(void *opaque) > > { > > Monitor *mon = opaque; > > > >
于 2013-6-27 0:03, Luiz Capitulino 写道: > On Wed, 26 Jun 2013 12:03:39 +0800 > Wenchao Xia <xiawenc@linux.vnet.ibm.com> wrote: > >> 于 2013-6-24 20:48, Wenchao Xia 写道: >>> This patch allow auot completion work normal in sub command case, >>> "info block [DEVICE]" can auto complete now, by re-enter the completion >>> function. Also, original "info" is treated as a special case, now it is >>> treated as a sub command group, global variable info_cmds is not used >>> any more. >>> >>> "help" command is still treated as a special case, since it is not a sub >>> command group but want to auto complete command in root command table. >>> >>> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> >>> --- >>> monitor.c | 36 ++++++++++++++++++++++++------------ >>> 1 files changed, 24 insertions(+), 12 deletions(-) >>> >>> diff --git a/monitor.c b/monitor.c >>> index aa641de..f364a0d 100644 >>> --- a/monitor.c >>> +++ b/monitor.c >>> @@ -4179,10 +4179,11 @@ static const char *next_arg_type(const char *typestr) >>> return (p != NULL ? ++p : typestr); >>> } >>> >>> -static void monitor_find_completion(Monitor *mon, >>> - const char *cmdline) >>> +static void monitor_find_completion_by_table(Monitor *mon, >>> + const mon_cmd_t *cmd_table, >>> + const char *cmdline) >>> { >>> - const char *cmdname; >>> + const char *cmdname, *p; >>> char *args[MAX_ARGS]; >>> int nb_args, i, len; >>> const char *ptype, *str; >>> @@ -4212,12 +4213,12 @@ static void monitor_find_completion(Monitor *mon, >>> else >>> cmdname = args[0]; >>> readline_set_completion_index(mon->rs, strlen(cmdname)); >>> - for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) { >>> + for (cmd = cmd_table; cmd->name != NULL; cmd++) { >>> cmd_completion(mon, cmdname, cmd->name); >>> } >>> } else { >>> /* find the command */ >>> - for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) { >>> + for (cmd = cmd_table; cmd->name != NULL; cmd++) { >>> if (compare_cmd(args[0], cmd->name)) { >>> break; >>> } >>> @@ -4226,6 +4227,17 @@ static void monitor_find_completion(Monitor *mon, >>> goto cleanup; >>> } >>> >>> + /* locate next valid string in original cmdline used by re-enter */ >>> + p = cmdline + strlen(args[0]); >>> + while (qemu_isspace(*p)) { >>> + p++; >>> + } >>> + >> Here it can't handle command start with space such as " blk", I plan >> make parse_cmdline() return additional const char **args_cmdline, which >> point to cmdline correspond to each args. Just want to >> mention it to save reviewer's time, I'll fix it with any other >> comments:). > > I prefer you respin it first, because it's not unusual that a single > change like this one ends up requiring more changes. Also, if the series > is good enough I can apply it w/o having to wait for another version. > OK, I'll respin. Thanks for your time. >> >> >>> + if (cmd->sub_table) { >>> + monitor_find_completion_by_table(mon, cmd->sub_table, p); >>> + goto cleanup; >>> + } >>> + >>> ptype = next_arg_type(cmd->args_type); >>> for(i = 0; i < nb_args - 2; i++) { >>> if (*ptype != '\0') { >>> @@ -4252,13 +4264,7 @@ static void monitor_find_completion(Monitor *mon, >>> bdrv_iterate(block_completion_it, &mbs); >>> break; >>> case 's': >>> - /* XXX: more generic ? */ >>> - if (!strcmp(cmd->name, "info")) { >>> - readline_set_completion_index(mon->rs, strlen(str)); >>> - for(cmd = info_cmds; cmd->name != NULL; cmd++) { >>> - cmd_completion(mon, str, cmd->name); >>> - } >>> - } else if (!strcmp(cmd->name, "sendkey")) { >>> + if (!strcmp(cmd->name, "sendkey")) { >>> char *sep = strrchr(str, '-'); >>> if (sep) >>> str = sep + 1; >>> @@ -4284,6 +4290,12 @@ cleanup: >>> } >>> } >>> >>> +static void monitor_find_completion(Monitor *mon, >>> + const char *cmdline) >>> +{ >>> + return monitor_find_completion_by_table(mon, mon->cmd_table, cmdline); >>> +} >>> + >>> static int monitor_can_read(void *opaque) >>> { >>> Monitor *mon = opaque; >>> >> >> >
diff --git a/monitor.c b/monitor.c index aa641de..f364a0d 100644 --- a/monitor.c +++ b/monitor.c @@ -4179,10 +4179,11 @@ static const char *next_arg_type(const char *typestr) return (p != NULL ? ++p : typestr); } -static void monitor_find_completion(Monitor *mon, - const char *cmdline) +static void monitor_find_completion_by_table(Monitor *mon, + const mon_cmd_t *cmd_table, + const char *cmdline) { - const char *cmdname; + const char *cmdname, *p; char *args[MAX_ARGS]; int nb_args, i, len; const char *ptype, *str; @@ -4212,12 +4213,12 @@ static void monitor_find_completion(Monitor *mon, else cmdname = args[0]; readline_set_completion_index(mon->rs, strlen(cmdname)); - for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) { + for (cmd = cmd_table; cmd->name != NULL; cmd++) { cmd_completion(mon, cmdname, cmd->name); } } else { /* find the command */ - for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) { + for (cmd = cmd_table; cmd->name != NULL; cmd++) { if (compare_cmd(args[0], cmd->name)) { break; } @@ -4226,6 +4227,17 @@ static void monitor_find_completion(Monitor *mon, goto cleanup; } + /* locate next valid string in original cmdline used by re-enter */ + p = cmdline + strlen(args[0]); + while (qemu_isspace(*p)) { + p++; + } + + if (cmd->sub_table) { + monitor_find_completion_by_table(mon, cmd->sub_table, p); + goto cleanup; + } + ptype = next_arg_type(cmd->args_type); for(i = 0; i < nb_args - 2; i++) { if (*ptype != '\0') { @@ -4252,13 +4264,7 @@ static void monitor_find_completion(Monitor *mon, bdrv_iterate(block_completion_it, &mbs); break; case 's': - /* XXX: more generic ? */ - if (!strcmp(cmd->name, "info")) { - readline_set_completion_index(mon->rs, strlen(str)); - for(cmd = info_cmds; cmd->name != NULL; cmd++) { - cmd_completion(mon, str, cmd->name); - } - } else if (!strcmp(cmd->name, "sendkey")) { + if (!strcmp(cmd->name, "sendkey")) { char *sep = strrchr(str, '-'); if (sep) str = sep + 1; @@ -4284,6 +4290,12 @@ cleanup: } } +static void monitor_find_completion(Monitor *mon, + const char *cmdline) +{ + return monitor_find_completion_by_table(mon, mon->cmd_table, cmdline); +} + static int monitor_can_read(void *opaque) { Monitor *mon = opaque;
This patch allow auot completion work normal in sub command case, "info block [DEVICE]" can auto complete now, by re-enter the completion function. Also, original "info" is treated as a special case, now it is treated as a sub command group, global variable info_cmds is not used any more. "help" command is still treated as a special case, since it is not a sub command group but want to auto complete command in root command table. Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> --- monitor.c | 36 ++++++++++++++++++++++++------------ 1 files changed, 24 insertions(+), 12 deletions(-)