[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V4 09/24] libxl_json: introduce parser functions for builtin types
On Tue, May 06, 2014 at 03:04:20PM +0100, Wei Liu wrote: > On Tue, May 06, 2014 at 02:57:13PM +0100, Anthony PERARD wrote: > > On Tue, May 06, 2014 at 01:57:38PM +0100, Ian Campbell wrote: > > > On Thu, 2014-05-01 at 13:58 +0100, Wei Liu wrote: > > > > > > Anthony, are you OK with this one now? > > > > Well, I think I commented the V3 just after the V4 was sent, so every > > comments still applies. > > > > I have this one in queue: > > > From 28f45d7e0edd26187285d4c3dea507776f2523d7 Mon Sep 17 00:00:00 2001 > From: Wei Liu <wei.liu2@xxxxxxxxxx> > Date: Tue, 8 Apr 2014 15:27:04 +0100 > Subject: [PATCH] libxl_json: introduce parser functions for builtin types > > This changeset introduces following functions: > * libxl_defbool_parse_json > * libxl__bool_parse_json > * libxl_uuid_parse_json > * libxl_mac_parse_json > * libxl_bitmap_parse_json > * libxl_cpuid_policy_list_parse_json > * libxl_string_list_parse_json > * libxl_key_value_list_parse_json > * libxl_hwcap_parse_json > * libxl__int_parse_json > * libxl__uint{8,16,32,64}_parse_json > * libxl__string_parse_json > > They will be used in later patch to convert the libxl__json_object > tree of a builtin type to libxl_FOO struct. > > Also remove delcaration of libxl_domid_gen_json as libxl_domid uses > yajl_gen_integer to generate JSON object. > > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> > Cc: Anthony Perard <anthony.perard@xxxxxxxxxx> > --- > tools/libxl/libxl_cpuid.c | 89 +++++++++++++--- > tools/libxl/libxl_json.c | 239 > +++++++++++++++++++++++++++++++++++++++++++ > tools/libxl/libxl_json.h | 36 ++++++- > tools/libxl/libxl_nocpuid.c | 7 ++ > 4 files changed, 354 insertions(+), 17 deletions(-) > > diff --git a/tools/libxl/libxl_cpuid.c b/tools/libxl/libxl_cpuid.c > index 8a59c4d..7ac5b74 100644 > --- a/tools/libxl/libxl_cpuid.c > +++ b/tools/libxl/libxl_cpuid.c > @@ -337,29 +337,29 @@ void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid, > (const char**)(cpuid[i].policy), cpuid_res); > } > > +static const char *input_names[2] = { "leaf", "subleaf" }; > +static const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" }; > +/* > + * Aiming for: > + * [ > + * { 'leaf': 'val-eax', > + * 'subleaf': 'val-ecx', > + * 'eax': 'filter', > + * 'ebx': 'filter', > + * 'ecx': 'filter', > + * 'edx': 'filter' }, > + * { 'leaf': 'val-eax', ..., 'eax': 'filter', ... }, > + * ... etc ... > + * ] > + */ > + > yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand, > libxl_cpuid_policy_list *pcpuid) > { > libxl_cpuid_policy_list cpuid = *pcpuid; > yajl_gen_status s; > - const char *input_names[2] = { "leaf", "subleaf" }; > - const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" }; > int i, j; > > - /* > - * Aiming for: > - * [ > - * { 'leaf': 'val-eax', > - * 'subleaf': 'val-ecx', > - * 'eax': 'filter', > - * 'ebx': 'filter', > - * 'ecx': 'filter', > - * 'edx': 'filter' }, > - * { 'leaf': 'val-eax', ..., 'eax': 'filter', ... }, > - * ... etc ... > - * ] > - */ > - > s = yajl_gen_array_open(hand); > if (s != yajl_gen_status_ok) goto out; > > @@ -397,6 +397,63 @@ out: > return s; > } > > +int libxl_cpuid_policy_list_parse_json(libxl__gc *gc, > + const libxl__json_object *o, > + libxl_cpuid_policy_list *p) > +{ > + int i, size; > + libxl_cpuid_policy_list l; > + flexarray_t *array; > + > + if (!libxl__json_object_is_array(o)) > + return ERROR_FAIL; > + > + array = libxl__json_object_get_array(o); > + if (!array->count) > + return 0; > + > + size = array->count; > + /* need one extra slot as sentinel */ > + l = *p = libxl__calloc(NOGC, size + 1, sizeof(libxl_cpuid_policy)); > + > + l[size].input[0] = XEN_CPUID_INPUT_UNUSED; > + l[size].input[1] = XEN_CPUID_INPUT_UNUSED; > + > + for (i = 0; i < size; i++) { > + const libxl__json_object *t; > + int j; > + > + if (flexarray_get(array, i, (void**)&t) != 0) > + return ERROR_FAIL; > + > + if (!libxl__json_object_is_map(t)) > + return ERROR_FAIL; > + > + for (j = 0; j < ARRAY_SIZE(l[0].input); j++) { > + const libxl__json_object *r; > + > + r = libxl__json_map_get(input_names[j], t, JSON_INTEGER); > + if (!r) > + l[i].input[j] = XEN_CPUID_INPUT_UNUSED; > + else > + l[i].input[j] = libxl__json_object_get_integer(r); > + } > + > + for (j = 0; j < ARRAY_SIZE(l[0].policy); j++) { > + const libxl__json_object *r; > + > + r = libxl__json_map_get(policy_names[j], t, JSON_STRING); > + if (!r) > + l[i].policy[j] = NULL; > + else > + l[i].policy[j] = > + libxl__strdup(NOGC, libxl__json_object_get_string(r)); > + } > + } > + > + return 0; > +} > + > /* > * Local variables: > * mode: C > diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c > index 27cce9c..8228fcb 100644 > --- a/tools/libxl/libxl_json.c > +++ b/tools/libxl/libxl_json.c > @@ -100,6 +100,42 @@ yajl_gen_status libxl_defbool_gen_json(yajl_gen hand, > return libxl__yajl_gen_asciiz(hand, libxl_defbool_to_string(*db)); > } > > +int libxl_defbool_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_defbool *p) > +{ > + const char *s; > + > + if (!libxl__json_object_is_string(o)) > + return ERROR_FAIL; > + > + s = libxl__json_object_get_string(o); > + > + if (!strncmp(s, LIBXL__DEFBOOL_STR_DEFAULT, > + strlen(LIBXL__DEFBOOL_STR_DEFAULT))) > + p->val = LIBXL__DEFBOOL_DEFAULT; > + else if (!strncmp(s, LIBXL__DEFBOOL_STR_TRUE, > + strlen(LIBXL__DEFBOOL_STR_TRUE))) > + p->val = LIBXL__DEFBOOL_TRUE; > + else if (!strncmp(s, LIBXL__DEFBOOL_STR_FALSE, > + strlen(LIBXL__DEFBOOL_STR_FALSE))) > + p->val = LIBXL__DEFBOOL_FALSE; > + else > + return ERROR_FAIL; > + > + return 0; > +} > + > +int libxl__bool_parse_json(libxl__gc *gc, const libxl__json_object *o, > + bool *p) > +{ > + if (!libxl__json_object_is_bool(o)) > + return ERROR_FAIL; > + > + *p = libxl__json_object_get_bool(o); > + > + return 0; > +} > + > yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, > libxl_uuid *uuid) > { > @@ -108,6 +144,15 @@ yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, > return yajl_gen_string(hand, (const unsigned char *)buf, > LIBXL_UUID_FMTLEN); > } > > +int libxl_uuid_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_uuid *p) > +{ > + if (!libxl__json_object_is_string(o)) > + return ERROR_FAIL; > + > + return libxl_uuid_from_string(p, o->u.string); > +} > + > yajl_gen_status libxl_bitmap_gen_json(yajl_gen hand, > libxl_bitmap *bitmap) > { > @@ -128,6 +173,40 @@ out: > return s; > } > > +int libxl_bitmap_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_bitmap *p) > +{ > + int i; > + int size; > + const libxl__json_object *t; > + flexarray_t *array; > + > + if (!libxl__json_object_is_array(o)) > + return ERROR_FAIL; > + > + array = libxl__json_object_get_array(o); > + if (!array->count) { > + libxl_bitmap_init(p); > + return 0; > + } > + > + t = libxl__json_array_get(o, array->count - 1); > + if (!libxl__json_object_is_integer(t)) > + return ERROR_FAIL; > + size = libxl__json_object_get_integer(t) + 1; > + > + libxl_bitmap_alloc(CTX, p, size); > + > + for (i = 0; (t = libxl__json_array_get(o, i)); i++) { > + if (!libxl__json_object_is_integer(t)) > + return ERROR_FAIL; > + > + libxl_bitmap_set(p, libxl__json_object_get_integer(t)); > + } > + > + return 0; > +} > + > yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand, > libxl_key_value_list *pkvl) > { > @@ -155,6 +234,41 @@ out: > return s; > } > > +int libxl_key_value_list_parse_json(libxl__gc *gc, const libxl__json_object > *o, > + libxl_key_value_list *p) > +{ > + libxl__json_map_node *node = NULL; > + flexarray_t *maps = NULL; > + int i, size; > + libxl_key_value_list kvl; > + > + if (!libxl__json_object_is_map(o)) > + return ERROR_FAIL; > + > + maps = libxl__json_object_get_map(o); > + size = maps->count * 2; > + kvl = *p = libxl__calloc(NOGC, size, sizeof(char *)); > + > + for (i = 0; i < maps->count; i++) { > + int idx = i * 2; > + if (flexarray_get(maps, i, (void**)&node) != 0) > + return ERROR_FAIL; > + > + if (!libxl__json_object_is_string(node->obj) && > + !libxl__json_object_is_null(node->obj)) > + return ERROR_FAIL; > + > + kvl[idx] = libxl__strdup(NOGC, node->map_key); > + if (libxl__json_object_is_string(node->obj)) > + kvl[idx+1] = > + libxl__strdup(NOGC, > libxl__json_object_get_string(node->obj)); > + else > + kvl[idx+1] = NULL; > + } > + > + return 0; > +} > + > yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list > *pl) > { > libxl_string_list l = *pl; > @@ -176,6 +290,38 @@ out: > return s; > } > > +int libxl_string_list_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_string_list *p) > +{ > + const libxl__json_object *t; > + libxl_string_list l; > + flexarray_t *array = NULL; > + int i, size; > + > + if (!libxl__json_object_is_array(o)) > + return ERROR_FAIL; > + > + array = libxl__json_object_get_array(o); > + size = array->count; > + > + if (size == 0) { > + *p = NULL; > + return 0; > + } > + > + /* need one extra slot as sentinel */ > + l = *p = libxl__calloc(NOGC, size + 1, sizeof(char *)); > + > + for (i = 0; (t = libxl__json_array_get(o, i)); i++) { > + if (!libxl__json_object_is_string(t)) > + return ERROR_FAIL; > + > + l[i] = libxl__strdup(NOGC, libxl__json_object_get_string(t)); > + } > + > + return 0; > +} > + > yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *mac) > { > char buf[LIBXL_MAC_FMTLEN+1]; > @@ -183,6 +329,15 @@ yajl_gen_status libxl_mac_gen_json(yajl_gen hand, > libxl_mac *mac) > return yajl_gen_string(hand, (const unsigned char *)buf, > LIBXL_MAC_FMTLEN); > } > > +int libxl_mac_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_mac *p) > +{ > + if (!libxl__json_object_is_string(o)) > + return ERROR_FAIL; > + > + return libxl__parse_mac(libxl__json_object_get_string(o), *p); > +} > + > yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand, > libxl_hwcap *p) > { > @@ -201,6 +356,27 @@ out: > return s; > } > > +int libxl_hwcap_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_hwcap *p) > +{ > + int i; > + > + if (!libxl__json_object_is_array(o)) > + return ERROR_FAIL; > + > + for (i = 0; i<4; i++) { > + const libxl__json_object *t; > + > + t = libxl__json_array_get(o, i); > + if (!t || !libxl__json_object_is_integer(t)) > + return ERROR_FAIL; > + > + (*p)[i] = libxl__json_object_get_integer(t); > + } > + > + return 0; > +} > + > yajl_gen_status libxl__string_gen_json(yajl_gen hand, > const char *p) > { > @@ -210,6 +386,20 @@ yajl_gen_status libxl__string_gen_json(yajl_gen hand, > return yajl_gen_null(hand); > } > > +int libxl__string_parse_json(libxl__gc *gc, const libxl__json_object *o, > + char **p) > +{ > + if (!libxl__json_object_is_string(o) && !libxl__json_object_is_null(o)) > + return ERROR_FAIL; > + > + if (libxl__json_object_is_null(o)) > + *p = NULL; > + else > + *p = libxl__strdup(NOGC, libxl__json_object_get_string(o)); > + > + return 0; > +} > + > /* > * libxl__json_object helper functions > */ > @@ -824,6 +1014,55 @@ out: > return rc; > } > > +int libxl__int_parse_json(libxl__gc *gc, const libxl__json_object *o, > + void *p) > +{ > + long long i; > + > + if (!libxl__json_object_is_integer(o)) > + return ERROR_FAIL; > + > + i = libxl__json_object_get_integer(o); > + > + if (i > INT_MAX || i < INT_MIN) > + return ERROR_FAIL; > + > + *((int *)p) = i; > + > + return 0; > +} > + > +/* Macro to generate: > + * libxl__uint8_parse_json > + * libxl__uint16_parse_json > + * libxl__uint32_parse_json > + * libxl__uint64_parse_json > + */ > +#define PARSE_UINT(width) \ > + int libxl__uint ## width ## _parse_json(libxl__gc *gc, \ > + const libxl__json_object *o,\ > + void *p) \ > + { \ > + long long i; \ > + \ > + if (!libxl__json_object_is_integer(o)) \ > + return ERROR_FAIL; \ > + \ > + i = libxl__json_object_get_integer(o); \ > + \ > + if (i > UINT ## width ## _MAX) \ > + return ERROR_FAIL; \ My guest is this will always be false for uint64 and maybe for uint32. The value return by get_interger can only be <= LLONG_MAX which I suppose is still < UINT64_MAX. Also, 'i' might be < 0. If json contain a value > LLONG_MAX, the value will be store as a string with the type number. > + \ > + *((uint ## width ## _t *)p) = i; \ > + \ > + return 0; \ > + } > + > +PARSE_UINT(8); > +PARSE_UINT(16); > +PARSE_UINT(32); > +PARSE_UINT(64); > + > /* > * Local variables: > * mode: C > diff --git a/tools/libxl/libxl_json.h b/tools/libxl/libxl_json.h > index a4dd8fc..924b2aa 100644 > --- a/tools/libxl/libxl_json.h > +++ b/tools/libxl/libxl_json.h > @@ -22,17 +22,51 @@ > # include <yajl/yajl_version.h> > #endif > > +typedef struct libxl__gc libxl__gc; > +typedef struct libxl__json_object libxl__json_object; > + > yajl_gen_status libxl_defbool_gen_json(yajl_gen hand, libxl_defbool *p); > -yajl_gen_status libxl_domid_gen_json(yajl_gen hand, libxl_domid *p); > +int libxl_defbool_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_defbool *p); > +int libxl__bool_parse_json(libxl__gc *gc, const libxl__json_object *o, > + bool *p); > yajl_gen_status libxl_uuid_gen_json(yajl_gen hand, libxl_uuid *p); > +int libxl_uuid_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_uuid *p); > yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *p); > +int libxl_mac_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_mac *p); > yajl_gen_status libxl_bitmap_gen_json(yajl_gen hand, libxl_bitmap *p); > +int libxl_bitmap_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_bitmap *p); > yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand, > libxl_cpuid_policy_list *p); > +int libxl_cpuid_policy_list_parse_json(libxl__gc *gc, > + const libxl__json_object *o, > + libxl_cpuid_policy_list *p); > yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list > *p); > +int libxl_string_list_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_string_list *p); > yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand, > libxl_key_value_list *p); > +int libxl_key_value_list_parse_json(libxl__gc *gc, > + const libxl__json_object *o, > + libxl_key_value_list *p); > yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand, libxl_hwcap *p); > +int libxl_hwcap_parse_json(libxl__gc *gc, const libxl__json_object *o, > + libxl_hwcap *p); > +int libxl__int_parse_json(libxl__gc *gc, const libxl__json_object *o, > + void *p); > +int libxl__uint8_parse_json(libxl__gc *gc, const libxl__json_object *o, > + void *p); > +int libxl__uint16_parse_json(libxl__gc *gc, const libxl__json_object *o, > + void *p); > +int libxl__uint32_parse_json(libxl__gc *gc, const libxl__json_object *o, > + void *p); > +int libxl__uint64_parse_json(libxl__gc *gc, const libxl__json_object *o, > + void *p); > +int libxl__string_parse_json(libxl__gc *gc, const libxl__json_object *o, > + char **p); > > #include <_libxl_types_json.h> > > diff --git a/tools/libxl/libxl_nocpuid.c b/tools/libxl/libxl_nocpuid.c > index 5f7cb6a..eb525fc 100644 > --- a/tools/libxl/libxl_nocpuid.c > +++ b/tools/libxl/libxl_nocpuid.c > @@ -44,6 +44,13 @@ yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen > hand, > return 0; > } > > +int libxl_cpuid_policy_list_parse_json(libxl__gc *gc, > + const libxl__json_object *o, > + libxl_cpuid_policy_list *p) > +{ > + return 0; > +} > + > /* > * Local variables: > * mode: C This new patch looks fine, beyond the comment on PARSE_UINT(). -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |