[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH V2 09/11] libxl_json, Handle number abrove LONG_MAX.



On Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
> The integers are now "long long" in the json_object. If strtoll failed to
> convert a string into a number, the number is stored as it (a char*).
> 
> Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
> ---
>  tools/libxl/libxl_internal.h |    7 +++--
>  tools/libxl/libxl_json.c     |   52 +++++++++++++++++++++++------------------
>  2 files changed, 33 insertions(+), 26 deletions(-)
> 
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 5720b31..849b251 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -465,7 +465,8 @@ typedef enum {
>      JSON_TRUE,
>      JSON_FALSE,
>      JSON_INTEGER,
> -    JSON_DOUBLE,

Did you accidentally remove this ...

> +    /* number is store in string, it's too big to be a long long */
> +    JSON_NUMBER,
>      JSON_STRING,
>      JSON_MAP,
>      JSON_ARRAY,
> @@ -475,7 +476,7 @@ typedef enum {
>  typedef struct libxl__json_object {
>      libxl__json_node_type type;
>      union {
> -        long i;
> +        long long i;
>          double d;

... or accidentally leave this?

>          char *string;
>          /* List of libxl__json_object */
> @@ -534,7 +535,7 @@ flexarray_t *libxl__json_object_get_array(const 
> libxl__json_object *o)
>      else
>          return NULL;
>  }
> -static inline long libxl__json_object_get_integer(const libxl__json_object 
> *o)
> +static inline long long libxl__json_object_get_integer(const 
> libxl__json_object *o)
>  {
>      if (libxl__json_object_is_integer(o))
>          return o->u.i;
> diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
> index c743114..2d8f61e 100644
> --- a/tools/libxl/libxl_json.c
> +++ b/tools/libxl/libxl_json.c
> @@ -44,6 +44,7 @@ struct libxl__yajl_ctx {
>  #  define DEBUG_GEN(ctx, type)              yajl_gen_##type(ctx->g)
>  #  define DEBUG_GEN_VALUE(ctx, type, value) yajl_gen_##type(ctx->g, value)
>  #  define DEBUG_GEN_STRING(ctx, str, n)     yajl_gen_string(ctx->g, str, n)
> +#  define DEBUG_GEN_NUMBER(ctx, str, n)     yajl_gen_number(ctx->g, str, n)
>  #  define DEBUG_GEN_REPORT(yajl_ctx) \
>      do { \
>          const unsigned char *buf = NULL; \
> @@ -60,6 +61,7 @@ struct libxl__yajl_ctx {
>  #  define DEBUG_GEN(ctx, type)                  ((void)0)
>  #  define DEBUG_GEN_VALUE(ctx, type, value)     ((void)0)
>  #  define DEBUG_GEN_STRING(ctx, value, lenght)  ((void)0)
> +#  define DEBUG_GEN_NUMBER(ctx, value, lenght)  ((void)0)

that typo got propagated...

>  #  define DEBUG_GEN_REPORT(ctx)                 ((void)0)
>  #endif
>  
> @@ -363,6 +365,7 @@ void libxl__json_object_free(libxl__gc *gc, 
> libxl__json_object *obj)
>          return;
>      switch (obj->type) {
>      case JSON_STRING:
> +    case JSON_NUMBER:
>          free(obj->u.string);
>          break;
>      case JSON_MAP: {
> @@ -504,35 +507,38 @@ static int json_callback_boolean(void *opaque, int 
> boolean)
>      return 1;
>  }
>  
> -static int json_callback_integer(void *opaque, long value)
> +static int json_callback_number(void *opaque, const char *s, unsigned int 
> len)
>  {
>      libxl__yajl_ctx *ctx = opaque;
> -    libxl__json_object *obj;
> -
> -    DEBUG_GEN_VALUE(ctx, integer, value);
> +    libxl__json_object *obj = NULL;
> +    long long i;
>  
> -    if ((obj = json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL)
> -        return 0;
> -    obj->u.i = value;
> +    /* should be replace by number */
> +    DEBUG_GEN_NUMBER(ctx, s, len);
>  
> -    if (json_object_append_to(ctx->gc, obj, ctx->current) == -1) {
> -        libxl__json_object_free(ctx->gc, obj);
> -        return 0;
> -    }
> +    i = strtoll(s, NULL, 10);
>  
> -    return 1;
> -}
> +    if ((i == LLONG_MIN || i == LLONG_MAX) && errno == ERANGE) {
> +        char *t = NULL;
>  
> -static int json_callback_double(void *opaque, double value)
> -{
> -    libxl__yajl_ctx *ctx = opaque;
> -    libxl__json_object *obj;
> +        if ((obj = json_object_alloc(ctx->gc, JSON_NUMBER)) == NULL)
> +            return 0;
>  
> -    DEBUG_GEN_VALUE(ctx, double, value);
> +        t = malloc(len + 1);
> +        if (t == NULL) {
> +            LIBXL__LOG_ERRNO(libxl__gc_owner(ctx->gc), LIBXL__LOG_ERROR,
> +                             "Failed to allocate");
> +            return 0;
> +        }
> +        strncpy(t, s, len);
> +        t[len] = 0;
>  
> -    if ((obj = json_object_alloc(ctx->gc, JSON_DOUBLE)) == NULL)
> -        return 0;
> -    obj->u.d = value;
> +        obj->u.string = t;
> +    } else {
> +        if ((obj = json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL)
> +            return 0;
> +        obj->u.i = i;
> +    }
>  
>      if (json_object_append_to(ctx->gc, obj, ctx->current) == -1) {
>          libxl__json_object_free(ctx->gc, obj);
> @@ -706,9 +712,9 @@ static int json_callback_end_array(void *opaque)
>  static yajl_callbacks callbacks = {
>      json_callback_null,
>      json_callback_boolean,
> -    json_callback_integer,
> -    json_callback_double,
>      NULL,
> +    NULL,
> +    json_callback_number,
>      json_callback_string,
>      json_callback_start_map,
>      json_callback_map_key,



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.