[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] libxl: add support for yajl 2.x
# HG changeset patch # User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> # Date 1324374796 -3600 # Node ID f4ff3ce53fd2286def61e22222154e3c0a408667 # Parent f72b99fccfca694674259cc1c03c526a827b67ec libxl: add support for yajl 2.x This patch adds support for yajl versions 2.x, while retaining 1.x compatibility. This patch adds quite a lot of #ifdefs all over the json code, so I'm open to suggestions if there's a better way to handle this. Tested with yajl 2.0.3 and 1.0.12. Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> diff -r f72b99fccfca -r f4ff3ce53fd2 tools/check/check_yajl_devel --- a/tools/check/check_yajl_devel Tue Dec 20 08:31:40 2011 +0100 +++ b/tools/check/check_yajl_devel Tue Dec 20 10:53:16 2011 +0100 @@ -5,4 +5,5 @@ has_header yajl/yajl_parse.h || fail "can't find yajl/yajl_parse.h" has_header yajl/yajl_gen.h || fail "can't find yajl/yajl_gen.h" +has_header yajl/yajl_version.h || fail "can't find yajl/yajl_version.h" has_lib libyajl.so || fail "can't find libyajl.so" diff -r f72b99fccfca -r f4ff3ce53fd2 tools/check/check_yajl_lib --- a/tools/check/check_yajl_lib Tue Dec 20 08:31:40 2011 +0100 +++ b/tools/check/check_yajl_lib Tue Dec 20 10:53:16 2011 +0100 @@ -3,4 +3,4 @@ . ./funcs.sh -has_lib libyajl.so.1 || fail "can't find libyajl.so.1 version 1" +has_lib libyajl.so.1 || has_lib libyajl.so.2 || fail "can't find libyajl.so.1 version 1 or libyajl.so.2 version 2" diff -r f72b99fccfca -r f4ff3ce53fd2 tools/libxl/libxl_json.c --- a/tools/libxl/libxl_json.c Tue Dec 20 08:31:40 2011 +0100 +++ b/tools/libxl/libxl_json.c Tue Dec 20 10:53:16 2011 +0100 @@ -519,7 +519,11 @@ static bool is_decimal(const char *s, un return false; } +#ifdef HAVE_YAJL_V2 +static int json_callback_number(void *opaque, const char *s, size_t len) +#else static int json_callback_number(void *opaque, const char *s, unsigned int len) +#endif { libxl__yajl_ctx *ctx = opaque; libxl__json_object *obj = NULL; @@ -575,8 +579,13 @@ out: return 1; } +#ifdef HAVE_YAJL_V2 +static int json_callback_string(void *opaque, const unsigned char *str, + size_t len) +#else static int json_callback_string(void *opaque, const unsigned char *str, unsigned int len) +#endif { libxl__yajl_ctx *ctx = opaque; char *t = NULL; @@ -608,8 +617,13 @@ static int json_callback_string(void *op return 1; } +#ifdef HAVE_YAJL_V2 +static int json_callback_map_key(void *opaque, const unsigned char *str, + size_t len) +#else static int json_callback_map_key(void *opaque, const unsigned char *str, unsigned int len) +#endif { libxl__yajl_ctx *ctx = opaque; char *t = NULL; @@ -772,17 +786,26 @@ libxl__json_object *libxl__json_parse(li DEBUG_GEN_ALLOC(&yajl_ctx); if (yajl_ctx.hand == NULL) { +#ifdef HAVE_YAJL_V2 + yajl_ctx.hand = yajl_alloc(&callbacks, NULL, &yajl_ctx); +#else yajl_parser_config cfg = { .allowComments = 1, .checkUTF8 = 1, }; yajl_ctx.hand = yajl_alloc(&callbacks, &cfg, NULL, &yajl_ctx); +#endif } status = yajl_parse(yajl_ctx.hand, (const unsigned char *)s, strlen(s)); if (status != yajl_status_ok) goto out; + +#ifdef HAVE_YAJL_V2 + status = yajl_complete_parse(yajl_ctx.hand); +#else + status = yajl_parse_complete(yajl_ctx.hand); +#endif - status = yajl_parse_complete(yajl_ctx.hand); if (status != yajl_status_ok) goto out; @@ -834,14 +857,25 @@ static const char *yajl_gen_status_to_st char *libxl__object_to_json(libxl_ctx *ctx, const char *type, libxl__gen_json_callback gen, void *p) { +#ifndef HAVE_YAJL_V2 yajl_gen_config conf = { 1, " " }; +#endif const unsigned char *buf; char *ret = NULL; +#ifdef HAVE_YAJL_V2 + size_t len = 0; +#else unsigned int len = 0; +#endif yajl_gen_status s; yajl_gen hand; +#ifdef HAVE_YAJL_V2 + hand = yajl_gen_alloc(NULL); +#else hand = yajl_gen_alloc(&conf, NULL); +#endif + if (!hand) return NULL; diff -r f72b99fccfca -r f4ff3ce53fd2 tools/libxl/libxl_json.h --- a/tools/libxl/libxl_json.h Tue Dec 20 08:31:40 2011 +0100 +++ b/tools/libxl/libxl_json.h Tue Dec 20 10:53:16 2011 +0100 @@ -16,8 +16,14 @@ #define LIBXL_JSON_H #include <yajl/yajl_gen.h> +#include <yajl/yajl_version.h> #include <_libxl_types_json.h> #include <_libxl_types_internal_json.h> +/* YAJL version check */ +#if defined(YAJL_MAJOR) && (YAJL_MAJOR > 1) +# define HAVE_YAJL_V2 1 +#endif + #endif /* LIBXL_JSON_H */ diff -r f72b99fccfca -r f4ff3ce53fd2 tools/libxl/libxl_qmp.c --- a/tools/libxl/libxl_qmp.c Tue Dec 20 08:31:40 2011 +0100 +++ b/tools/libxl/libxl_qmp.c Tue Dec 20 10:53:16 2011 +0100 @@ -453,15 +453,26 @@ static char *qmp_send_prepare(libxl__gc qmp_callback_t callback, void *opaque, qmp_request_context *context) { +#ifndef HAVE_YAJL_V2 yajl_gen_config conf = { 0, NULL }; +#endif const unsigned char *buf = NULL; char *ret = NULL; +#ifdef HAVE_YAJL_V2 + size_t len = 0; +#else unsigned int len = 0; +#endif yajl_gen_status s; yajl_gen hand; callback_id_pair *elm = NULL; +#ifdef HAVE_YAJL_V2 + hand = yajl_gen_alloc(NULL); +#else hand = yajl_gen_alloc(&conf, NULL); +#endif + if (!hand) { return NULL; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |