qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 19/29] monitor: Split monitor_handle_command()


From: Luiz Capitulino
Subject: [Qemu-devel] [PATCH 19/29] monitor: Split monitor_handle_command()
Date: Thu, 13 Aug 2009 10:50:18 -0300

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>
---
 monitor.c |   67 +++++++++++++++++++++++++++++++-----------------------------
 1 files changed, 35 insertions(+), 32 deletions(-)

diff --git a/monitor.c b/monitor.c
index 675b321..0c8d933 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2651,18 +2651,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);
@@ -2671,7 +2671,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++) {
@@ -2681,14 +2681,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;
@@ -2933,28 +2928,36 @@ static void monitor_handle_command(Monitor *mon, const 
char *cmdline)
         goto fail;
     }
 
-    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);
-        goto fail;
-    }
- fail:
+    return cmd;
+
+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);
+        handler = cmd->handler;
+        handler(mon, qdict);
+    }
+
     qobject_decref(QOBJECT(qdict));
+
+    for (i = 0; i < MAX_ARGS; i++)
+        qemu_free(str_allocated[i]);
 }
 
 static void cmd_completion(const char *name, const char *list)
-- 
1.6.4.67.gea5b1





reply via email to

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