All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Andreas Färber" <afaerber@suse.de>
To: Igor Mammedov <imammedo@redhat.com>
Cc: qemu-devel@nongnu.org, ehabkost@redhat.com, mdroth@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH 1/2] qapi: add visitor for parsing int[KMGT] input string
Date: Fri, 07 Dec 2012 19:57:35 +0100	[thread overview]
Message-ID: <50C23C1F.6010102@suse.de> (raw)
In-Reply-To: <1354828325-16568-2-git-send-email-imammedo@redhat.com>

Am 06.12.2012 22:12, schrieb Igor Mammedov:
> Caller of visit_type_unit_suffixed_int() will have to specify
> value of 'K' suffix via unit argument.
> For Kbytes it's 1024, for Khz it's 1000.
> 
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  v2:
>   - convert type_freq to type_unit_suffixed_int.
>   - provide qapi_dealloc_type_unit_suffixed_int() impl.
> ---
>  qapi/qapi-dealloc-visitor.c |  7 +++++++
>  qapi/qapi-visit-core.c      | 13 +++++++++++++
>  qapi/qapi-visit-core.h      |  8 ++++++++
>  qapi/string-input-visitor.c | 22 ++++++++++++++++++++++
>  4 files changed, 50 insertions(+)
> 
> diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c
> index 75214e7..57e662c 100644
> --- a/qapi/qapi-dealloc-visitor.c
> +++ b/qapi/qapi-dealloc-visitor.c
> @@ -143,6 +143,12 @@ static void qapi_dealloc_type_enum(Visitor *v, int *obj, const char *strings[],
>  {
>  }
>  
> +static void qapi_dealloc_type_unit_suffixed_int(Visitor *v, int64_t *obj,
> +                                                const char *name,
> +                                                const int unit, Error **errp)
> +{
> +}
> +
>  Visitor *qapi_dealloc_get_visitor(QapiDeallocVisitor *v)
>  {
>      return &v->visitor;
> @@ -170,6 +176,7 @@ QapiDeallocVisitor *qapi_dealloc_visitor_new(void)
>      v->visitor.type_str = qapi_dealloc_type_str;
>      v->visitor.type_number = qapi_dealloc_type_number;
>      v->visitor.type_size = qapi_dealloc_type_size;
> +    v->visitor.type_unit_suffixed_int = qapi_dealloc_type_unit_suffixed_int;
>  
>      QTAILQ_INIT(&v->stack);
>  
> diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
> index 7a82b63..dcbc1a9 100644
> --- a/qapi/qapi-visit-core.c
> +++ b/qapi/qapi-visit-core.c
> @@ -311,3 +311,16 @@ void input_type_enum(Visitor *v, int *obj, const char *strings[],
>      g_free(enum_str);
>      *obj = value;
>  }
> +
> +void visit_type_unit_suffixed_int(Visitor *v, int64_t *obj, const char *name,
> +                                  const int unit, Error **errp)
> +{
> +    if (!error_is_set(errp)) {

if (error_is_set(errp)) {

> +        return;
> +    }
> +    if (v->type_unit_suffixed_int) {
> +        v->type_unit_suffixed_int(v, obj, name, unit, errp);
> +    } else {
> +        visit_type_int64(v, obj, name, errp);
> +    }
> +}
> diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h
> index 60aceda..04e690a 100644
> --- a/qapi/qapi-visit-core.h
> +++ b/qapi/qapi-visit-core.h
> @@ -62,6 +62,12 @@ struct Visitor
>      void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp);
>      /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */
>      void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp);
> +    /*
> +     * visit_unit_suffixed_int() falls back to (*type_int64)()
> +     * if type_unit_suffixed_int is unset
> +    */

Indentation is one off.

> +    void (*type_unit_suffixed_int)(Visitor *v, int64_t *obj, const char *name,
> +                                   const int unit, Error **errp);

Are we expecting differently suffixed ints? Otherwise we could
optionally shorten to type_suffixed_int (but that probably still doesn't
fit within one comment line ;)).

>  };
>  
>  void visit_start_handle(Visitor *v, void **obj, const char *kind,
> @@ -91,5 +97,7 @@ void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp);
>  void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp);
>  void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp);
>  void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp);
> +void visit_type_unit_suffixed_int(Visitor *v, int64_t *obj, const char *name,
> +                                  const int unit, Error **errp);
>  
>  #endif
> diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
> index 497eb9a..d2bd154 100644
> --- a/qapi/string-input-visitor.c
> +++ b/qapi/string-input-visitor.c
> @@ -110,6 +110,27 @@ static void parse_start_optional(Visitor *v, bool *present,
>      *present = true;
>  }
>  
> +static void parse_type_unit_suffixed_int(Visitor *v, int64_t *obj,
> +                                         const char *name, const int unit,
> +                                         Error **errp)
> +{
> +    StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v);
> +    char *endp = (char *) siv->string;
> +    long long val = 0;
> +
> +    if (siv->string) {
> +        val = strtosz_suffix_unit(siv->string, &endp,
> +                             STRTOSZ_DEFSUFFIX_B, unit);
> +    }
> +    if (!siv->string || val == -1 || *endp) {
> +        error_set(errp, QERR_INVALID_PARAMETER_VALUE, name,
> +              "a value representable as a non-negative int64");

Weird indentation remaining, looks as if we could align with errp within
80 chars.

However, I wonder if "unit" is the (physically etc.) correct term here?
Isn't the "unit" Hz / byte / ... and 1000 more of a conversion factor or
something? At least that's the way I've seen unit used in the API of
another project, passing an enum of Hertz, gram, meter/second, etc.

Andreas

> +        return;
> +    }
> +
> +    *obj = val;
> +}
> +
>  Visitor *string_input_get_visitor(StringInputVisitor *v)
>  {
>      return &v->visitor;
> @@ -132,6 +153,7 @@ StringInputVisitor *string_input_visitor_new(const char *str)
>      v->visitor.type_str = parse_type_str;
>      v->visitor.type_number = parse_type_number;
>      v->visitor.start_optional = parse_start_optional;
> +    v->visitor.type_unit_suffixed_int = parse_type_unit_suffixed_int;
>  
>      v->string = str;
>      return v;
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

  parent reply	other threads:[~2012-12-07 18:57 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-06 21:12 [Qemu-devel] [PATCH 0/2] introduce visitor for parsing suffixed integer Igor Mammedov
2012-12-06 21:12 ` [Qemu-devel] [PATCH 1/2] qapi: add visitor for parsing int[KMGT] input string Igor Mammedov
2012-12-06 22:24   ` mdroth
2012-12-07 11:55   ` Eduardo Habkost
2012-12-07 18:57   ` Andreas Färber [this message]
2012-12-07 19:53     ` Eduardo Habkost
2012-12-10 16:01     ` Igor Mammedov
2012-12-10 17:27       ` mdroth
2012-12-10 19:03         ` Igor Mammedov
2012-12-06 21:12 ` [Qemu-devel] [PATCH 2/2] target-i386: use visit_type_unit_suffixed_int() to parse tsc_freq property value Igor Mammedov
2012-12-06 22:24   ` mdroth
2012-12-07 11:57   ` Eduardo Habkost
2012-12-07 19:00   ` Andreas Färber
2012-12-07 20:09     ` Eduardo Habkost
2012-12-10 16:13       ` Igor Mammedov
2012-12-10 17:21         ` mdroth
2012-12-10 20:47     ` Igor Mammedov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50C23C1F.6010102@suse.de \
    --to=afaerber@suse.de \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.