qemu-option: simplify search for end of key

Use strcspn to find an equal or comma value, and pass the result directly
to get_opt_name to avoid another strchr.

Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2020-11-08 10:21:21 -05:00
parent 4054adbdd2
commit 924e9b0da9
1 changed files with 13 additions and 22 deletions

View File

@ -38,27 +38,19 @@
#include "qemu/help_option.h"
/*
* Extracts the name of an option from the parameter string (p points at the
* Extracts the name of an option from the parameter string (@p points at the
* first byte of the option name)
*
* The option name is delimited by delim (usually , or =) or the string end
* and is copied into option. The caller is responsible for free'ing option
* when no longer required.
* The option name is @len characters long and is copied into @option. The
* caller is responsible for free'ing @option when no longer required.
*
* The return value is the position of the delimiter/zero byte after the option
* name in p.
* name in @p.
*/
static const char *get_opt_name(const char *p, char **option, char delim)
static const char *get_opt_name(const char *p, char **option, size_t len)
{
char *offset = strchr(p, delim);
if (offset) {
*option = g_strndup(p, offset - p);
return offset;
} else {
*option = g_strdup(p);
return p + strlen(p);
}
*option = g_strndup(p, len);
return p + len;
}
/*
@ -766,12 +758,11 @@ static const char *get_opt_name_value(const char *params,
const char *firstname,
char **name, char **value)
{
const char *p, *pe, *pc;
const char *p;
size_t len;
pe = strchr(params, '=');
pc = strchr(params, ',');
if (!pe || (pc && pc < pe)) {
len = strcspn(params, "=,");
if (params[len] != '=') {
/* found "foo,more" */
if (firstname) {
/* implicitly named first option */
@ -779,7 +770,7 @@ static const char *get_opt_name_value(const char *params,
p = get_opt_value(params, value);
} else {
/* option without value, must be a flag */
p = get_opt_name(params, name, ',');
p = get_opt_name(params, name, len);
if (strncmp(*name, "no", 2) == 0) {
memmove(*name, *name + 2, strlen(*name + 2) + 1);
*value = g_strdup("off");
@ -789,7 +780,7 @@ static const char *get_opt_name_value(const char *params,
}
} else {
/* found "foo=bar,more" */
p = get_opt_name(params, name, '=');
p = get_opt_name(params, name, len);
assert(*p == '=');
p++;
p = get_opt_value(p, value);