[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] monitor: refactor whitespace and optional argum
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH] monitor: refactor whitespace and optional argument parsing |
Date: |
Mon, 24 Oct 2011 10:49:48 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) |
Alon Levy <address@hidden> writes:
> 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 <address@hidden>
> ---
> Previous patch used qemu_free (that's how old it is), fixed.
>
> monitor.c | 79 +++++++++++++++++++++++-------------------------------------
> 1 files changed, 30 insertions(+), 49 deletions(-)
>
> diff --git a/monitor.c b/monitor.c
> index ffda0fe..a482705 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 */
> + g_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) {
This is cases 'F', 'B' and 's'. I'm afraid your new code covers only
's'.
> @@ -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++;
Could be split into parts:
1. Hoist the space skip out of the switch
2. Hoist handling of '?' out of the switch
3. Permit optional boolean parameters
I'd delay the third part until there's a user.