qemu-devel
[Top][All Lists]
Advanced

[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;
> +}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]