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,
+ /* 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;
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)
# 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,
--
Anthony PERARD
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|