From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55504) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Us1Fk-0003xl-AP for qemu-devel@nongnu.org; Wed, 26 Jun 2013 21:44:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Us1Fi-0006He-TG for qemu-devel@nongnu.org; Wed, 26 Jun 2013 21:44:04 -0400 Received: from e28smtp03.in.ibm.com ([122.248.162.3]:44369) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Us1Fi-0006HD-90 for qemu-devel@nongnu.org; Wed, 26 Jun 2013 21:44:02 -0400 Received: from /spool/local by e28smtp03.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 27 Jun 2013 07:07:54 +0530 Received: from d28relay03.in.ibm.com (d28relay03.in.ibm.com [9.184.220.60]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id CFB493940043 for ; Thu, 27 Jun 2013 07:13:54 +0530 (IST) Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63]) by d28relay03.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r5R1iBgU30605432 for ; Thu, 27 Jun 2013 07:14:12 +0530 Received: from d28av01.in.ibm.com (loopback [127.0.0.1]) by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r5R1hrVp015850 for ; Thu, 27 Jun 2013 01:43:54 GMT Message-ID: <51CB98C0.2080602@linux.vnet.ibm.com> Date: Thu, 27 Jun 2013 09:43:28 +0800 From: Wenchao Xia MIME-Version: 1.0 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> <20130626120323.05c279af@redhat.com> In-Reply-To: <20130626120323.05c279af@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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: Luiz Capitulino Cc: pbonzini@redhat.com, qemu-devel@nongnu.org, armbru@redhat.com 于 2013-6-27 0:03, Luiz Capitulino 写道: > On Wed, 26 Jun 2013 12:03:39 +0800 > Wenchao Xia 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 >>> --- >>> 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; >>> >> >> > -- Best Regards Wenchao Xia