[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH V9 12/15] monitor: refine monitor_find_completion()
From: |
Wenchao Xia |
Subject: |
[Qemu-devel] [PATCH V9 12/15] monitor: refine monitor_find_completion() |
Date: |
Fri, 23 Aug 2013 16:18:04 +0800 |
In order to support sub command in auto completion, a reentrant function
is needed, so monitor_find_completion() is split 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 <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
monitor.c | 65 ++++++++++++++++++++++++++++++++++++------------------------
1 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/monitor.c b/monitor.c
index 1ace29e..49a5a88 100644
--- a/monitor.c
+++ b/monitor.c
@@ -4230,34 +4230,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)
@@ -4265,18 +4248,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);
@@ -4321,7 +4304,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);
}
}
@@ -4330,6 +4313,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
- [Qemu-devel] [PATCH V9 03/15] monitor: avoid use of global *cur_mon in block_completion_it(), (continued)
- [Qemu-devel] [PATCH V9 03/15] monitor: avoid use of global *cur_mon in block_completion_it(), Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 04/15] monitor: avoid use of global *cur_mon in monitor_find_completion(), Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 05/15] monitor: avoid use of global *cur_mon in readline_completion(), Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 06/15] monitor: call sortcmdlist() only one time, Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 02/15] monitor: avoid use of global *cur_mon in file_completion(), Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 07/15] monitor: split off monitor_data_init(), Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 08/15] monitor: avoid direct use of global variable *mon_cmds, Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 09/15] monitor: code move for parse_cmdline(), Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 10/15] monitor: refine parse_cmdline(), Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 11/15] monitor: support sub command in help, Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 12/15] monitor: refine monitor_find_completion(),
Wenchao Xia <=
- [Qemu-devel] [PATCH V9 13/15] monitor: support sub command in auto completion, Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 14/15] monitor: allow "help" show message for single command in sub group, Wenchao Xia, 2013/08/23
- [Qemu-devel] [PATCH V9 15/15] monitor: improve auto complete of "help" for single command in sub group, Wenchao Xia, 2013/08/23
- Re: [Qemu-devel] [PATCH V9 00/15] monitor: support sub command group in auto completion and help, Luiz Capitulino, 2013/08/26