[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 07/25] keyval: introduce keyval_parse_into
From: |
Markus Armbruster |
Subject: |
Re: [PATCH 07/25] keyval: introduce keyval_parse_into |
Date: |
Fri, 22 Jan 2021 15:22:15 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) |
Paolo Bonzini <pbonzini@redhat.com> writes:
> Allow parsing multiple keyval sequences into the same dictionary.
>
> Signed-off-by: Paolo Bonzini <pbonzini@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;
> +}
- Re: [PATCH 05/25] keyval: simplify keyval_parse_one, (continued)
[PATCH 03/25] qemu-option: warn for short-form boolean options, Paolo Bonzini, 2021/01/18
- Re: [PATCH 03/25] qemu-option: warn for short-form boolean options, Markus Armbruster, 2021/01/19
- Re: [PATCH 03/25] qemu-option: warn for short-form boolean options, Paolo Bonzini, 2021/01/19
- Re: [PATCH 03/25] qemu-option: warn for short-form boolean options, Markus Armbruster, 2021/01/20
- Re: [PATCH 03/25] qemu-option: warn for short-form boolean options, Paolo Bonzini, 2021/01/20
- Re: [PATCH 03/25] qemu-option: warn for short-form boolean options, Markus Armbruster, 2021/01/20
- Re: [PATCH 03/25] qemu-option: warn for short-form boolean options, Paolo Bonzini, 2021/01/20
[PATCH 07/25] keyval: introduce keyval_parse_into, Paolo Bonzini, 2021/01/18
- Re: [PATCH 07/25] keyval: introduce keyval_parse_into,
Markus Armbruster <=
[PATCH 09/25] qom: use qemu_printf to print help for user-creatable objects, Paolo Bonzini, 2021/01/18
[PATCH 11/25] remove -writeconfig, Paolo Bonzini, 2021/01/18
[PATCH 06/25] tests: convert check-qom-proplist to keyval, Paolo Bonzini, 2021/01/18