qemu-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-commits] [COMMIT 55f81d9] monitor: Split monitor_handle_command()


From: Anthony Liguori
Subject: [Qemu-commits] [COMMIT 55f81d9] monitor: Split monitor_handle_command()
Date: Fri, 04 Sep 2009 14:44:03 -0000

From: Luiz Capitulino <address@hidden>

In order to help the integration with unit-tests and having a better
design, this commit splits monitor_handle_command() into two parts.

The parsing code is moved to a function called monitor_parse_command(),
while allocating memory and calling the handler is still done by
monitor_handle_command().

Signed-off-by: Luiz Capitulino <address@hidden>
Signed-off-by: Anthony Liguori <address@hidden>

diff --git a/monitor.c b/monitor.c
index 7195447..b27bcbc 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2590,18 +2590,18 @@ static int default_fmt_size = 4;
 
 #define MAX_ARGS 16
 
-static void monitor_handle_command(Monitor *mon, const char *cmdline)
+static const mon_cmd_t *monitor_parse_command(Monitor *mon,
+                                              const char *cmdline,
+                                              void *str_allocated[],
+                                              QDict *qdict)
 {
     const char *p, *typestr;
-    int c, nb_args, i, has_arg;
+    int c, nb_args, has_arg;
     const mon_cmd_t *cmd;
     char cmdname[256];
     char buf[1024];
     char *key;
-    QDict *qdict;
-    void *str_allocated[MAX_ARGS];
     void *args[MAX_ARGS];
-    void (*handler_d)(Monitor *mon, const QDict *qdict);
 
 #ifdef DEBUG
     monitor_printf(mon, "command='%s'\n", cmdline);
@@ -2610,7 +2610,7 @@ static void monitor_handle_command(Monitor *mon, const 
char *cmdline)
     /* extract the command name */
     p = get_command_name(cmdline, cmdname, sizeof(cmdname));
     if (!p)
-        return;
+        return NULL;
 
     /* find the command */
     for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
@@ -2620,14 +2620,9 @@ static void monitor_handle_command(Monitor *mon, const 
char *cmdline)
 
     if (cmd->name == NULL) {
         monitor_printf(mon, "unknown command: '%s'\n", cmdname);
-        return;
+        return NULL;
     }
 
-    qdict = qdict_new();
-
-    for(i = 0; i < MAX_ARGS; i++)
-        str_allocated[i] = NULL;
-
     /* parse the parameters */
     typestr = cmd->args_type;
     nb_args = 0;
@@ -2872,31 +2867,41 @@ static void monitor_handle_command(Monitor *mon, const 
char *cmdline)
         goto fail;
     }
 
-    qemu_errors_to_mon(mon);
-    switch(nb_args) {
-    case 0:
-    case 1:
-    case 2:
-    case 3:
-    case 4:
-    case 5:
-    case 6:
-    case 7:
-    case 10:
-        handler_d = cmd->handler;
-        handler_d(mon, qdict);
-        break;
-    default:
-        monitor_printf(mon, "unsupported number of arguments: %d\n", nb_args);
-        break;
-    }
-    qemu_errors_to_previous();
+    return cmd;
 
- fail:
+fail:
     qemu_free(key);
-    for(i = 0; i < MAX_ARGS; i++)
-        qemu_free(str_allocated[i]);
+    return NULL;
+}
+
+static void monitor_handle_command(Monitor *mon, const char *cmdline)
+{
+    int i;
+    QDict *qdict;
+    const mon_cmd_t *cmd;
+    void *str_allocated[MAX_ARGS];
+
+    qdict = qdict_new();
+
+    for (i = 0; i < MAX_ARGS; i++)
+        str_allocated[i] = NULL;
+
+    cmd = monitor_parse_command(mon, cmdline, str_allocated, qdict);
+    if (cmd) {
+        void (*handler)(Monitor *mon, const QDict *qdict);
+
+        qemu_errors_to_mon(mon);
+
+        handler = cmd->handler;
+        handler(mon, qdict);
+
+        qemu_errors_to_previous();
+    }
+
     QDECREF(qdict);
+
+    for (i = 0; i < MAX_ARGS; i++)
+        qemu_free(str_allocated[i]);
 }
 
 static void cmd_completion(const char *name, const char *list)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]