From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54324) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UrsCF-0006Ti-T2 for qemu-devel@nongnu.org; Wed, 26 Jun 2013 12:03:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UrsCE-0005iK-EJ for qemu-devel@nongnu.org; Wed, 26 Jun 2013 12:03:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43159) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UrsCE-0005iE-6K for qemu-devel@nongnu.org; Wed, 26 Jun 2013 12:03:50 -0400 Date: Wed, 26 Jun 2013 12:03:23 -0400 From: Luiz Capitulino Message-ID: <20130626120323.05c279af@redhat.com> In-Reply-To: <51CA681B.5030203@linux.vnet.ibm.com> References: <1372078125-31085-1-git-send-email-xiawenc@linux.vnet.ibm.com> <1372078125-31085-6-git-send-email-xiawenc@linux.vnet.ibm.com> <51CA681B.5030203@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH V2 5/7] monitor: support sub commands in auto completion List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Wenchao Xia Cc: pbonzini@redhat.com, qemu-devel@nongnu.org, armbru@redhat.com On Wed, 26 Jun 2013 12:03:39 +0800 Wenchao Xia wrote: > =E4=BA=8E 2013-6-24 20:48, Wenchao Xia =E5=86=99=E9=81=93: > > 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. > >=20 > > "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. > >=20 > > Signed-off-by: Wenchao Xia > > --- > > monitor.c | 36 ++++++++++++++++++++++++------------ > > 1 files changed, 24 insertions(+), 12 deletions(-) > >=20 > > 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 *ty= pestr) > > return (p !=3D NULL ? ++p : typestr); > > } > >=20 > > -static void monitor_find_completion(Monitor *mon, > > - const char *cmdline) > > +static void monitor_find_completion_by_table(Monitor *mon, > > + const mon_cmd_t *cmd_tabl= e, > > + 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 *mo= n, > > else > > cmdname =3D args[0]; > > readline_set_completion_index(mon->rs, strlen(cmdname)); > > - for (cmd =3D mon->cmd_table; cmd->name !=3D NULL; cmd++) { > > + for (cmd =3D cmd_table; cmd->name !=3D NULL; cmd++) { > > cmd_completion(mon, cmdname, cmd->name); > > } > > } else { > > /* find the command */ > > - for (cmd =3D mon->cmd_table; cmd->name !=3D NULL; cmd++) { > > + for (cmd =3D cmd_table; cmd->name !=3D NULL; cmd++) { > > if (compare_cmd(args[0], cmd->name)) { > > break; > > } > > @@ -4226,6 +4227,17 @@ static void monitor_find_completion(Monitor *mon, > > goto cleanup; > > } > >=20 > > + /* locate next valid string in original cmdline used by re-ent= er */ > > + p =3D 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. >=20 >=20 > > + if (cmd->sub_table) { > > + monitor_find_completion_by_table(mon, cmd->sub_table, p); > > + goto cleanup; > > + } > > + > > ptype =3D next_arg_type(cmd->args_type); > > for(i =3D 0; i < nb_args - 2; i++) { > > if (*ptype !=3D '\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 =3D info_cmds; cmd->name !=3D NULL; cmd++) { > > - cmd_completion(mon, str, cmd->name); > > - } > > - } else if (!strcmp(cmd->name, "sendkey")) { > > + if (!strcmp(cmd->name, "sendkey")) { > > char *sep =3D strrchr(str, '-'); > > if (sep) > > str =3D sep + 1; > > @@ -4284,6 +4290,12 @@ cleanup: > > } > > } > >=20 > > +static void monitor_find_completion(Monitor *mon, > > + const char *cmdline) > > +{ > > + return monitor_find_completion_by_table(mon, mon->cmd_table, cmdli= ne); > > +} > > + > > static int monitor_can_read(void *opaque) > > { > > Monitor *mon =3D opaque; > >=20 >=20 >=20