[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |