Paolo Bonzini <pbonz...@redhat.com> writes: > Allow parsing multiple keyval sequences into the same dictionary. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
I trust later patches will make the need for this obvious. I guess we could use qdict_join() instead. Observation, not objection. > --- > include/qemu/option.h | 2 ++ > util/keyval.c | 39 ++++++++++++++++++++++++++++++++------- > 2 files changed, 34 insertions(+), 7 deletions(-) > > diff --git a/include/qemu/option.h b/include/qemu/option.h > index f73e0dc7d9..092e291c37 100644 > --- a/include/qemu/option.h > +++ b/include/qemu/option.h > @@ -147,6 +147,8 @@ void qemu_opts_print_help(QemuOptsList *list, bool > print_caption); > void qemu_opts_free(QemuOptsList *list); > QemuOptsList *qemu_opts_append(QemuOptsList *dst, QemuOptsList *list); > > +QDict *keyval_parse_into(QDict *qdict, const char *params, const char > *implied_key, > + bool *p_help, Error **errp); > QDict *keyval_parse(const char *params, const char *implied_key, > bool *help, Error **errp); > > diff --git a/util/keyval.c b/util/keyval.c > index e7f708cd1e..1d4ca12129 100644 > --- a/util/keyval.c > +++ b/util/keyval.c > @@ -436,13 +436,12 @@ static QObject *keyval_listify(QDict *cur, GSList > *key_of_cur, Error **errp) > * If @p_help is not NULL, store whether help is requested there. > * If @p_help is NULL and help is requested, fail. > * > - * On success, return a dictionary of the parsed keys and values. > + * On success, return @dict, now filled with the parsed keys and values. > * On failure, store an error through @errp and return NULL. May @dict be modified then? > */ > -QDict *keyval_parse(const char *params, const char *implied_key, > - bool *p_help, Error **errp) > +QDict *keyval_parse_into(QDict *qdict, const char *params, const char > *implied_key, > + bool *p_help, Error **errp) > { > - QDict *qdict = qdict_new(); > QObject *listified; > g_autofree char *dup; > char *s; > @@ -452,7 +451,6 @@ QDict *keyval_parse(const char *params, const char > *implied_key, > while (*s) { > s = keyval_parse_one(qdict, s, implied_key, &help, errp); > if (!s) { > - qobject_unref(qdict); > return NULL; > } > implied_key = NULL; > @@ -462,15 +460,42 @@ QDict *keyval_parse(const char *params, const char > *implied_key, > *p_help = help; > } else if (help) { > error_setg(errp, "Help is not available for this option"); > - qobject_unref(qdict); > return NULL; > } > > listified = keyval_listify(qdict, NULL, errp); > if (!listified) { > - qobject_unref(qdict); > return NULL; > } > assert(listified == QOBJECT(qdict)); > return qdict; > } > + > +/* > + * Parse @params in QEMU's traditional KEY=VALUE,... syntax. > + * > + * If @implied_key, the first KEY= can be omitted. @implied_key is > + * implied then, and VALUE can't be empty or contain ',' or '='. > + * > + * A parameter "help" or "?" without a value isn't added to the > + * resulting dictionary, but instead is interpreted as help request. > + * All other options are parsed and returned normally so that context > + * specific help can be printed. > + * > + * If @p_help is not NULL, store whether help is requested there. > + * If @p_help is NULL and help is requested, fail. > + * > + * On success, return a dictionary of the parsed keys and values. > + * On failure, store an error through @errp and return NULL. > + */ > +QDict *keyval_parse(const char *params, const char *implied_key, > + bool *p_help, Error **errp) > +{ > + QDict *qdict = qdict_new(); > + QDict *ret = keyval_parse_into(qdict, params, implied_key, p_help, errp); > + > + if (!ret) { > + qobject_unref(qdict); > + } > + return ret; > +}