All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] libxl: add support for yajl 2.x
@ 2011-12-20  9:53 Roger Pau Monne
  2011-12-22 14:19 ` Ian Campbell
  2012-01-03 17:57 ` Ian Jackson
  0 siblings, 2 replies; 5+ messages in thread
From: Roger Pau Monne @ 2011-12-20  9:53 UTC (permalink / raw)
  To: xen-devel

# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# 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@entel.upc.edu>

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;
     }

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] libxl: add support for yajl 2.x
  2011-12-20  9:53 [PATCH] libxl: add support for yajl 2.x Roger Pau Monne
@ 2011-12-22 14:19 ` Ian Campbell
  2011-12-22 14:24   ` Roger Pau Monné
  2012-01-03 17:57 ` Ian Jackson
  1 sibling, 1 reply; 5+ messages in thread
From: Ian Campbell @ 2011-12-22 14:19 UTC (permalink / raw)
  To: Roger Pau Monne; +Cc: xen-devel

On Tue, 2011-12-20 at 09:53 +0000, Roger Pau Monne wrote:
> iff -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" 

The purpose of specifically checking for .so.1 was to avoid trying to
use v2. Since you've fixed this you can just make it check for
libyajl.so.


> 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>

Sadly this isn't in the version of libyajl in Debian Stable which is
1.0.8-1. :-(

Ian.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] libxl: add support for yajl 2.x
  2011-12-22 14:19 ` Ian Campbell
@ 2011-12-22 14:24   ` Roger Pau Monné
  0 siblings, 0 replies; 5+ messages in thread
From: Roger Pau Monné @ 2011-12-22 14:24 UTC (permalink / raw)
  To: Ian Campbell; +Cc: xen-devel

2011/12/22 Ian Campbell <Ian.Campbell@citrix.com>:
> On Tue, 2011-12-20 at 09:53 +0000, Roger Pau Monne wrote:
>> iff -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"
>
> The purpose of specifically checking for .so.1 was to avoid trying to
> use v2. Since you've fixed this you can just make it check for
> libyajl.so.
>
>
>> 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>
>
> Sadly this isn't in the version of libyajl in Debian Stable which is
> 1.0.8-1. :-(

This is what I was afraid of, older versions of yajl doesn't have
yajl_version.h. So now I will have to check if yajl_version.h is
present to include it. Will try to put an updated patch today.

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

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] libxl: add support for yajl 2.x
  2011-12-20  9:53 [PATCH] libxl: add support for yajl 2.x Roger Pau Monne
  2011-12-22 14:19 ` Ian Campbell
@ 2012-01-03 17:57 ` Ian Jackson
  2012-01-03 18:09   ` Roger Pau Monné
  1 sibling, 1 reply; 5+ messages in thread
From: Ian Jackson @ 2012-01-03 17:57 UTC (permalink / raw)
  To: Roger Pau Monne; +Cc: xen-devel

Roger Pau Monne writes ("[Xen-devel] [PATCH] 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.

I have some suggestions.  The basic idea would be to try to put all of
the ifdefs in one place in libxl_json.h.

> +#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

So how about:

  /* libxl_json.h */

  #ifdef HAVE_YAJL_V2
  typedef size_t libxl_yajl_length;
  ...
  #else
  typedef unsigned int libxl_yajl_length;
  ...
  #endif


  /* libxl_json.c */

  static int json_callback_number(void *opaque, const char *s,
                                  libxl_yajl_length len) {
     ...

> +#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;
> +    

  /* libxl_json.h */

  #ifdef HAVE_YAJL_V2
  ...
  static inline int libxl_yajl_alloc(...) { return yajl_alloc .... }
  ...
  #else
  ...
  static inline int libxl_yajl_alloc(...) { [version with cfg] }
  #define yajl_complete_parse yajl_parse_complete
  ...
  #endif

etc.

Ian.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] libxl: add support for yajl 2.x
  2012-01-03 17:57 ` Ian Jackson
@ 2012-01-03 18:09   ` Roger Pau Monné
  0 siblings, 0 replies; 5+ messages in thread
From: Roger Pau Monné @ 2012-01-03 18:09 UTC (permalink / raw)
  To: Ian Jackson; +Cc: xen-devel

2012/1/3 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> Roger Pau Monne writes ("[Xen-devel] [PATCH] 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.
>
> I have some suggestions.  The basic idea would be to try to put all of
> the ifdefs in one place in libxl_json.h.
>
>> +#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
>
> So how about:
>
>  /* libxl_json.h */
>
>  #ifdef HAVE_YAJL_V2
>  typedef size_t libxl_yajl_length;
>  ...
>  #else
>  typedef unsigned int libxl_yajl_length;
>  ...
>  #endif
>
>
>  /* libxl_json.c */
>
>  static int json_callback_number(void *opaque, const char *s,
>                                  libxl_yajl_length len) {
>     ...
>
>> +#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;
>> +
>
>  /* libxl_json.h */
>
>  #ifdef HAVE_YAJL_V2
>  ...
>  static inline int libxl_yajl_alloc(...) { return yajl_alloc .... }
>  ...
>  #else
>  ...
>  static inline int libxl_yajl_alloc(...) { [version with cfg] }
>  #define yajl_complete_parse yajl_parse_complete
>  ...
>  #endif
>
> etc.

I haven't really though of this anymore, but this seems much more
appropriate and less intrusive.

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

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-01-03 18:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-20  9:53 [PATCH] libxl: add support for yajl 2.x Roger Pau Monne
2011-12-22 14:19 ` Ian Campbell
2011-12-22 14:24   ` Roger Pau Monné
2012-01-03 17:57 ` Ian Jackson
2012-01-03 18:09   ` Roger Pau Monné

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.