diff options
Diffstat (limited to 'monitor.c')
-rw-r--r-- | monitor.c | 48 |
1 files changed, 43 insertions, 5 deletions
@@ -2508,6 +2508,33 @@ static const char *get_command_name(const char *cmdline, return p; } +/** + * Read key of 'type' into 'key' and return the current + * 'type' pointer. + */ +static char *key_get_info(const char *type, char **key) +{ + size_t len; + char *p, *str; + + if (*type == ',') + type++; + + p = strchr(type, ':'); + if (!p) { + *key = NULL; + return NULL; + } + len = p - type; + + str = qemu_malloc(len + 1); + memcpy(str, type, len); + str[len] = '\0'; + + *key = str; + return ++p; +} + static int default_fmt_format = 'x'; static int default_fmt_size = 4; @@ -2520,6 +2547,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline) const mon_cmd_t *cmd; char cmdname[256]; char buf[1024]; + char *key; void *str_allocated[MAX_ARGS]; void *args[MAX_ARGS]; void (*handler_0)(Monitor *mon); @@ -2571,9 +2599,10 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline) typestr = cmd->args_type; nb_args = 0; for(;;) { - c = *typestr; - if (c == '\0') + typestr = key_get_info(typestr, &key); + if (!typestr) break; + c = *typestr; typestr++; switch(c) { case 'F': @@ -2787,6 +2816,8 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline) monitor_printf(mon, "%s: unknown type '%c'\n", cmdname, c); goto fail; } + qemu_free(key); + key = NULL; } /* check that all arguments were parsed */ while (qemu_isspace(*p)) @@ -2854,6 +2885,7 @@ static void monitor_handle_command(Monitor *mon, const char *cmdline) qemu_errors_to_previous(); fail: + qemu_free(key); for(i = 0; i < MAX_ARGS; i++) qemu_free(str_allocated[i]); } @@ -2972,6 +3004,12 @@ static void parse_cmdline(const char *cmdline, *pnb_args = nb_args; } +static const char *next_arg_type(const char *typestr) +{ + const char *p = strchr(typestr, ':'); + return (p != NULL ? ++p : typestr); +} + static void monitor_find_completion(const char *cmdline) { const char *cmdname; @@ -3014,12 +3052,12 @@ static void monitor_find_completion(const char *cmdline) } return; found: - ptype = cmd->args_type; + ptype = next_arg_type(cmd->args_type); for(i = 0; i < nb_args - 2; i++) { if (*ptype != '\0') { - ptype++; + ptype = next_arg_type(ptype); while (*ptype == '?') - ptype++; + ptype = next_arg_type(ptype); } } str = args[nb_args - 1]; |