qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, Wenchao Xia <xiawenc@linux.vnet.ibm.com>,
	armbru@redhat.com, lcapitulino@redhat.com
Subject: [Qemu-devel] [PATCH V7 10/13] monitor: refine monitor_find_completion()
Date: Sat, 20 Jul 2013 09:44:12 +0800	[thread overview]
Message-ID: <1374284656-12025-11-git-send-email-xiawenc@linux.vnet.ibm.com> (raw)
In-Reply-To: <1374284656-12025-1-git-send-email-xiawenc@linux.vnet.ibm.com>

In order to support sub command in auto completion, an reentrant function
is needed, so monitor_find_completion() is splitted into two parts. The
first part does parsing of user input which need to be done only once,
the second part does the auto completion job according to the parsing
result, which contains the necessary code to support sub command and
works as the reentrant function. The global "info_cmds" is still used
in second part, which will be replaced by sub command code later.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 monitor.c |   65 ++++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 39 insertions(+), 26 deletions(-)

diff --git a/monitor.c b/monitor.c
index 5aa65d6..b6e7b64 100644
--- a/monitor.c
+++ b/monitor.c
@@ -4214,34 +4214,17 @@ 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,
+                                             char **args,
+                                             int nb_args)
 {
     const char *cmdname;
-    char *args[MAX_ARGS];
-    int nb_args, i, len;
+    int i;
     const char *ptype, *str;
     const mon_cmd_t *cmd;
     MonitorBlockComplete mbs;
 
-    if (parse_cmdline(cmdline, &nb_args, args) < 0) {
-        return;
-    }
-#ifdef DEBUG_COMPLETION
-    for (i = 0; i < nb_args; i++) {
-        monitor_printf(mon, "arg%d = '%s'\n", i, args[i]);
-    }
-#endif
-
-    /* if the line ends with a space, it means we want to complete the
-       next arg */
-    len = strlen(cmdline);
-    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
-        if (nb_args >= MAX_ARGS) {
-            goto cleanup;
-        }
-        args[nb_args++] = g_strdup("");
-    }
     if (nb_args <= 1) {
         /* command completion */
         if (nb_args == 0)
@@ -4249,18 +4232,18 @@ 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;
             }
         }
         if (!cmd->name) {
-            goto cleanup;
+            return;
         }
 
         ptype = next_arg_type(cmd->args_type);
@@ -4305,7 +4288,7 @@ static void monitor_find_completion(Monitor *mon,
                 }
             } else if (!strcmp(cmd->name, "help|?")) {
                 readline_set_completion_index(mon->rs, strlen(str));
-                for (cmd = mon->cmd_table; cmd->name != NULL; cmd++) {
+                for (cmd = cmd_table; cmd->name != NULL; cmd++) {
                     cmd_completion(mon, str, cmd->name);
                 }
             }
@@ -4314,6 +4297,36 @@ static void monitor_find_completion(Monitor *mon,
             break;
         }
     }
+}
+
+static void monitor_find_completion(Monitor *mon,
+                                    const char *cmdline)
+{
+    char *args[MAX_ARGS];
+    int nb_args, len;
+
+    /* 1. parse the cmdline */
+    if (parse_cmdline(cmdline, &nb_args, args) < 0) {
+        return;
+    }
+#ifdef DEBUG_COMPLETION
+    for (i = 0; i < nb_args; i++) {
+        monitor_printf(mon, "arg%d = '%s'\n", i, args[i]);
+    }
+#endif
+
+    /* if the line ends with a space, it means we want to complete the
+       next arg */
+    len = strlen(cmdline);
+    if (len > 0 && qemu_isspace(cmdline[len - 1])) {
+        if (nb_args >= MAX_ARGS) {
+            goto cleanup;
+        }
+        args[nb_args++] = g_strdup("");
+    }
+
+    /* 2. auto complete according to args */
+    monitor_find_completion_by_table(mon, mon->cmd_table, args, nb_args);
 
 cleanup:
     free_cmdline_args(args, nb_args);
-- 
1.7.1

  parent reply	other threads:[~2013-07-20  1:46 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-20  1:44 [Qemu-devel] [PATCH V7 00/13] monitor: support sub command group in auto completion and help Wenchao Xia
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 01/13] monitor: avoid use of global *cur_mon in cmd_completion() Wenchao Xia
2013-07-20 11:49   ` Eric Blake
2013-07-20 13:13     ` Wenchao Xia
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 02/13] monitor: avoid use of global *cur_mon in file_completion() Wenchao Xia
2013-07-20 11:58   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 03/13] monitor: avoid use of global *cur_mon in block_completion_it() Wenchao Xia
2013-07-20 11:59   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 04/13] monitor: avoid use of global *cur_mon in monitor_find_completion() Wenchao Xia
2013-07-20 12:02   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 05/13] monitor: avoid use of global *cur_mon in readline_completion() Wenchao Xia
2013-07-20 12:03   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 06/13] monitor: avoid direct use of global variable *mon_cmds Wenchao Xia
2013-07-20 12:04   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 07/13] monitor: code move for parse_cmdline() Wenchao Xia
2013-07-20 12:25   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 08/13] monitor: refine parse_cmdline() Wenchao Xia
2013-07-20 12:27   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 09/13] monitor: support sub command in help Wenchao Xia
2013-07-24 22:46   ` Eric Blake
2013-07-20  1:44 ` Wenchao Xia [this message]
2013-07-25 15:56   ` [Qemu-devel] [PATCH V7 10/13] monitor: refine monitor_find_completion() Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 11/13] monitor: support sub command in auto completion Wenchao Xia
2013-07-25 16:26   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 12/13] monitor: allow "help" show message for single command in sub group Wenchao Xia
2013-07-25 16:39   ` Eric Blake
2013-07-20  1:44 ` [Qemu-devel] [PATCH V7 13/13] monitor: improve auto complete of "help" " Wenchao Xia
2013-07-25 16:51   ` Eric Blake
2013-07-24 13:26 ` [Qemu-devel] [PATCH V7 00/13] monitor: support sub command group in auto completion and help Wenchao Xia
2013-07-26  3:22   ` Wenchao Xia
2013-07-29 14:01     ` Luiz Capitulino

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1374284656-12025-11-git-send-email-xiawenc@linux.vnet.ibm.com \
    --to=xiawenc@linux.vnet.ibm.com \
    --cc=armbru@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).