Takes out the optional ('?') message parsing from the main switch loop
in monitor_parse_command. Adds optional argument option for boolean parameters.

Signed-off-by: Alon Levy <al...@redhat.com>
---
Hi,

 I think I've sent this before as part of another series, but the rest of the
 patches became non relevant (the problem was fixed in another way), and since
 I still have this floating around and it seems like a good fix - less code,
 makes it easier to determine which paramter types can be used as optional
 arguments, maybe someone can take it?

Alon

 monitor.c |   79 +++++++++++++++++++++++-------------------------------------
 1 files changed, 30 insertions(+), 49 deletions(-)

diff --git a/monitor.c b/monitor.c
index ffda0fe..de4ee2f 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3976,6 +3976,29 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
             break;
         c = *typestr;
         typestr++;
+        while (qemu_isspace(*p)) {
+            p++;
+        }
+        /* take care of optional arguments */
+        switch (c) {
+        case 's':
+        case 'i':
+        case 'l':
+        case 'M':
+        case 'o':
+        case 'T':
+        case 'b':
+            if (*typestr == '?') {
+                typestr++;
+                if (*p == '\0') {
+                    /* missing optional argument: NULL argument */
+                    qemu_free(key);
+                    key = NULL;
+                    continue;
+                }
+            }
+            break;
+        }
         switch(c) {
         case 'F':
         case 'B':
@@ -3983,15 +4006,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
             {
                 int ret;
 
-                while (qemu_isspace(*p))
-                    p++;
-                if (*typestr == '?') {
-                    typestr++;
-                    if (*p == '\0') {
-                        /* no optional string: NULL argument */
-                        break;
-                    }
-                }
                 ret = get_str(buf, sizeof(buf), &p);
                 if (ret < 0) {
                     switch(c) {
@@ -4021,9 +4035,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
                 if (!opts_list || opts_list->desc->name) {
                     goto bad_type;
                 }
-                while (qemu_isspace(*p)) {
-                    p++;
-                }
                 if (!*p)
                     break;
                 if (get_str(buf, sizeof(buf), &p) < 0) {
@@ -4041,8 +4052,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
             {
                 int count, format, size;
 
-                while (qemu_isspace(*p))
-                    p++;
                 if (*p == '/') {
                     /* format found */
                     p++;
@@ -4122,23 +4131,15 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
             {
                 int64_t val;
 
-                while (qemu_isspace(*p))
-                    p++;
-                if (*typestr == '?' || *typestr == '.') {
-                    if (*typestr == '?') {
-                        if (*p == '\0') {
-                            typestr++;
-                            break;
-                        }
-                    } else {
-                        if (*p == '.') {
+                if (*typestr == '.') {
+                    if (*p == '.') {
+                        p++;
+                        while (qemu_isspace(*p)) {
                             p++;
-                            while (qemu_isspace(*p))
-                                p++;
-                        } else {
-                            typestr++;
-                            break;
                         }
+                    } else {
+                        typestr++;
+                        break;
                     }
                     typestr++;
                 }
@@ -4160,15 +4161,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
                 int64_t val;
                 char *end;
 
-                while (qemu_isspace(*p)) {
-                    p++;
-                }
-                if (*typestr == '?') {
-                    typestr++;
-                    if (*p == '\0') {
-                        break;
-                    }
-                }
                 val = strtosz(p, &end);
                 if (val < 0) {
                     monitor_printf(mon, "invalid size\n");
@@ -4182,14 +4174,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
             {
                 double val;
 
-                while (qemu_isspace(*p))
-                    p++;
-                if (*typestr == '?') {
-                    typestr++;
-                    if (*p == '\0') {
-                        break;
-                    }
-                }
                 if (get_double(mon, &val, &p) < 0) {
                     goto fail;
                 }
@@ -4215,9 +4199,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor 
*mon,
                 const char *beg;
                 int val;
 
-                while (qemu_isspace(*p)) {
-                    p++;
-                }
                 beg = p;
                 while (qemu_isgraph(*p)) {
                     p++;
-- 
1.7.6.4


Reply via email to