[libvirt PATCHv2 14/15] meson: drop yajl detection

Ján Tomko posted 15 patches 1 year, 5 months ago
[libvirt PATCHv2 14/15] meson: drop yajl detection
Posted by Ján Tomko 1 year, 5 months ago
After this commit, WITH_YAJL can no longer be set.

Signed-off-by: Ján Tomko <jtomko@redhat.com>
---
 meson.build        |  43 -----
 src/util/virjson.c | 416 ---------------------------------------------
 2 files changed, 459 deletions(-)

diff --git a/meson.build b/meson.build
index 9605d58537..a7c62d8bcc 100644
--- a/meson.build
+++ b/meson.build
@@ -1378,48 +1378,6 @@ if wireshark_dep.found()
   endif
 endif
 
-yajl_version = '2.0.3'
-yajl_dep = dependency('yajl', version: '>=' + yajl_version, required: false)
-if yajl_dep.found()
-  # Kludge for yajl include path on non-Linux
-  #
-  # As of 2.1.0, upstream yajl.pc has -I${includedir}/yajl among
-  # its Cflags, which is clearly wrong. This does not affect Linux
-  # because ${includedir} is already part of the default include path,
-  # but on other platforms that's not the case and the result is that
-  # <yajl/yajl.h> can't be located, causing the build to fail.
-  #
-  # Since upstream development for yajl has stopped years ago, there's
-  # little hope of this issue getting fixed by a new upstream release.
-  # Some non-Linux operating systems such as FreeBSD have elected to
-  # carry a small downstream patch, but in the case of Homebrew on
-  # macOS this approach has been rejected[1] and so we're left with no
-  # choice but to work around the issue ourselves.
-  #
-  # [1] https://github.com/Homebrew/homebrew-core/pull/74516
-  if host_machine.system() != 'linux'
-    yajl_includedir = yajl_dep.get_variable(pkgconfig : 'includedir')
-    if yajl_includedir.contains('include/yajl')
-      rc = run_command(
-        'python3', '-c',
-        'print("@0@".replace("@1@", "@2@"))'.format(
-          yajl_includedir, 'include/yajl', 'include',
-        ),
-        check: true,
-      )
-      yajl_includedir = rc.stdout().strip()
-      yajl_dep = declare_dependency(
-        compile_args: [ '-I' + yajl_includedir ],
-        dependencies: [ yajl_dep ],
-      )
-    endif
-  endif
-
-  conf.set('WITH_YAJL', 1)
-  conf.set('WITH_JSON', 1)
-endif
-
-
 # generic build dependencies checks
 
 if bash_completion_dep.found() and not readline_dep.found()
@@ -2374,7 +2332,6 @@ libs_summary = {
   'selinux': selinux_dep.found(),
   'udev': udev_dep.found(),
   'xdr': xdr_dep.found(),
-  'yajl': yajl_dep.found(),
 }
 summary(libs_summary, section: 'Libraries', bool_yn: true)
 
diff --git a/src/util/virjson.c b/src/util/virjson.c
index 8e0ba47fc9..0378adf00e 100644
--- a/src/util/virjson.c
+++ b/src/util/virjson.c
@@ -34,10 +34,6 @@
 
 #if WITH_JSON_C
 # include <json.h>
-#elif WITH_YAJL
-# include <yajl/yajl_gen.h>
-# include <yajl/yajl_parse.h>
-
 #endif
 
 /* XXX fixme */
@@ -1553,418 +1549,6 @@ virJSONValueToBuffer(virJSONValue *object,
 }
 
 
-#elif WITH_YAJL
-static int
-virJSONParserInsertValue(virJSONParser *parser,
-                         virJSONValue **value)
-{
-    if (!parser->head) {
-        parser->head = g_steal_pointer(value);
-    } else {
-        virJSONParserState *state;
-        if (!parser->nstate) {
-            VIR_DEBUG("got a value to insert without a container");
-            return -1;
-        }
-
-        state = &parser->state[parser->nstate-1];
-
-        switch (state->value->type) {
-        case VIR_JSON_TYPE_OBJECT: {
-            if (!state->key) {
-                VIR_DEBUG("missing key when inserting object value");
-                return -1;
-            }
-
-            if (virJSONValueObjectAppend(state->value,
-                                         state->key,
-                                         value) < 0)
-                return -1;
-
-            VIR_FREE(state->key);
-        }   break;
-
-        case VIR_JSON_TYPE_ARRAY: {
-            if (state->key) {
-                VIR_DEBUG("unexpected key when inserting array value");
-                return -1;
-            }
-
-            if (virJSONValueArrayAppend(state->value,
-                                        value) < 0)
-                return -1;
-        }   break;
-
-        default:
-            VIR_DEBUG("unexpected value type, not a container");
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-
-static int
-virJSONParserHandleNull(void *ctx)
-{
-    virJSONParser *parser = ctx;
-    g_autoptr(virJSONValue) value = virJSONValueNewNull();
-
-    VIR_DEBUG("parser=%p", parser);
-
-    if (virJSONParserInsertValue(parser, &value) < 0)
-        return 0;
-
-    return 1;
-}
-
-
-static int
-virJSONParserHandleBoolean(void *ctx,
-                           int boolean_)
-{
-    virJSONParser *parser = ctx;
-    g_autoptr(virJSONValue) value = virJSONValueNewBoolean(boolean_);
-
-    VIR_DEBUG("parser=%p boolean=%d", parser, boolean_);
-
-    if (virJSONParserInsertValue(parser, &value) < 0)
-        return 0;
-
-    return 1;
-}
-
-
-static int
-virJSONParserHandleNumber(void *ctx,
-                          const char *s,
-                          size_t l)
-{
-    virJSONParser *parser = ctx;
-    g_autoptr(virJSONValue) value = virJSONValueNewNumber(g_strndup(s, l));
-
-    VIR_DEBUG("parser=%p str=%s", parser, value->data.number);
-
-    if (virJSONParserInsertValue(parser, &value) < 0)
-        return 0;
-
-    return 1;
-}
-
-
-static int
-virJSONParserHandleString(void *ctx,
-                          const unsigned char *stringVal,
-                          size_t stringLen)
-{
-    virJSONParser *parser = ctx;
-    g_autoptr(virJSONValue) value = virJSONValueNewString(g_strndup((const char *)stringVal, stringLen));
-
-    VIR_DEBUG("parser=%p str=%p", parser, (const char *)stringVal);
-
-    if (virJSONParserInsertValue(parser, &value) < 0)
-        return 0;
-
-    return 1;
-}
-
-
-static int
-virJSONParserHandleMapKey(void *ctx,
-                          const unsigned char *stringVal,
-                          size_t stringLen)
-{
-    virJSONParser *parser = ctx;
-    virJSONParserState *state;
-
-    VIR_DEBUG("parser=%p key=%p", parser, (const char *)stringVal);
-
-    if (!parser->nstate)
-        return 0;
-
-    state = &parser->state[parser->nstate-1];
-    if (state->key)
-        return 0;
-    state->key = g_strndup((const char *)stringVal, stringLen);
-    return 1;
-}
-
-
-static int
-virJSONParserHandleStartMap(void *ctx)
-{
-    virJSONParser *parser = ctx;
-    g_autoptr(virJSONValue) value = virJSONValueNewObject();
-    virJSONValue *tmp = value;
-
-    VIR_DEBUG("parser=%p", parser);
-
-    if (virJSONParserInsertValue(parser, &value) < 0)
-        return 0;
-
-    VIR_REALLOC_N(parser->state, parser->nstate + 1);
-
-    parser->state[parser->nstate].value = tmp;
-    parser->state[parser->nstate].key = NULL;
-    parser->nstate++;
-
-    return 1;
-}
-
-
-static int
-virJSONParserHandleEndMap(void *ctx)
-{
-    virJSONParser *parser = ctx;
-    virJSONParserState *state;
-
-    VIR_DEBUG("parser=%p", parser);
-
-    if (!parser->nstate)
-        return 0;
-
-    state = &(parser->state[parser->nstate-1]);
-    if (state->key) {
-        VIR_FREE(state->key);
-        return 0;
-    }
-
-    VIR_DELETE_ELEMENT(parser->state, parser->nstate - 1, parser->nstate);
-
-    return 1;
-}
-
-
-static int
-virJSONParserHandleStartArray(void *ctx)
-{
-    virJSONParser *parser = ctx;
-    g_autoptr(virJSONValue) value = virJSONValueNewArray();
-    virJSONValue *tmp = value;
-
-    VIR_DEBUG("parser=%p", parser);
-
-    if (virJSONParserInsertValue(parser, &value) < 0)
-        return 0;
-
-    VIR_REALLOC_N(parser->state, parser->nstate + 1);
-
-    parser->state[parser->nstate].value = tmp;
-    parser->state[parser->nstate].key = NULL;
-    parser->nstate++;
-
-    return 1;
-}
-
-
-static int
-virJSONParserHandleEndArray(void *ctx)
-{
-    virJSONParser *parser = ctx;
-    virJSONParserState *state;
-
-    VIR_DEBUG("parser=%p", parser);
-
-    if (!(parser->nstate - parser->wrap))
-        return 0;
-
-    state = &(parser->state[parser->nstate-1]);
-    if (state->key) {
-        VIR_FREE(state->key);
-        return 0;
-    }
-
-    VIR_DELETE_ELEMENT(parser->state, parser->nstate - 1, parser->nstate);
-
-    return 1;
-}
-
-
-static const yajl_callbacks parserCallbacks = {
-    virJSONParserHandleNull,
-    virJSONParserHandleBoolean,
-    NULL,
-    NULL,
-    virJSONParserHandleNumber,
-    virJSONParserHandleString,
-    virJSONParserHandleStartMap,
-    virJSONParserHandleMapKey,
-    virJSONParserHandleEndMap,
-    virJSONParserHandleStartArray,
-    virJSONParserHandleEndArray
-};
-
-
-/* XXX add an incremental streaming parser - yajl trivially supports it */
-virJSONValue *
-virJSONValueFromString(const char *jsonstring)
-{
-    yajl_handle hand;
-    virJSONParser parser = { NULL, NULL, 0, 0 };
-    virJSONValue *ret = NULL;
-    int rc;
-    size_t len = strlen(jsonstring);
-
-    VIR_DEBUG("string=%s", jsonstring);
-
-    hand = yajl_alloc(&parserCallbacks, NULL, &parser);
-    if (!hand) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("Unable to create JSON parser"));
-        return NULL;
-    }
-
-    /* Yajl 2 is nice enough to default to rejecting trailing garbage. */
-    rc = yajl_parse(hand, (const unsigned char *)jsonstring, len);
-    if (rc != yajl_status_ok ||
-        yajl_complete_parse(hand) != yajl_status_ok) {
-        unsigned char *errstr = yajl_get_error(hand, 1,
-                                               (const unsigned char*)jsonstring,
-                                               strlen(jsonstring));
-
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("cannot parse json %1$s: %2$s"),
-                       jsonstring, (const char*) errstr);
-        yajl_free_error(hand, errstr);
-        virJSONValueFree(parser.head);
-        goto cleanup;
-    }
-
-    if (parser.nstate != 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("cannot parse json %1$s: unterminated string/map/array"),
-                       jsonstring);
-        virJSONValueFree(parser.head);
-    } else {
-        ret = parser.head;
-    }
-
- cleanup:
-    yajl_free(hand);
-
-    if (parser.nstate) {
-        size_t i;
-        for (i = 0; i < parser.nstate; i++)
-            VIR_FREE(parser.state[i].key);
-        VIR_FREE(parser.state);
-    }
-
-    VIR_DEBUG("result=%p", ret);
-
-    return ret;
-}
-
-
-static int
-virJSONValueToStringOne(virJSONValue *object,
-                        yajl_gen g)
-{
-    size_t i;
-
-    VIR_DEBUG("object=%p type=%d gen=%p", object, object->type, g);
-
-    switch (object->type) {
-    case VIR_JSON_TYPE_OBJECT:
-        if (yajl_gen_map_open(g) != yajl_gen_status_ok)
-            return -1;
-        for (i = 0; i < object->data.object.npairs; i++) {
-            if (yajl_gen_string(g,
-                                (unsigned char *)object->data.object.pairs[i].key,
-                                strlen(object->data.object.pairs[i].key))
-                != yajl_gen_status_ok)
-                return -1;
-            if (virJSONValueToStringOne(object->data.object.pairs[i].value, g) < 0)
-                return -1;
-        }
-        if (yajl_gen_map_close(g) != yajl_gen_status_ok)
-            return -1;
-        break;
-    case VIR_JSON_TYPE_ARRAY:
-        if (yajl_gen_array_open(g) != yajl_gen_status_ok)
-            return -1;
-        for (i = 0; i < object->data.array.nvalues; i++) {
-            if (virJSONValueToStringOne(object->data.array.values[i], g) < 0)
-                return -1;
-        }
-        if (yajl_gen_array_close(g) != yajl_gen_status_ok)
-            return -1;
-        break;
-
-    case VIR_JSON_TYPE_STRING:
-        if (yajl_gen_string(g, (unsigned char *)object->data.string,
-                            strlen(object->data.string)) != yajl_gen_status_ok)
-            return -1;
-        break;
-
-    case VIR_JSON_TYPE_NUMBER:
-        if (yajl_gen_number(g, object->data.number,
-                            strlen(object->data.number)) != yajl_gen_status_ok)
-            return -1;
-        break;
-
-    case VIR_JSON_TYPE_BOOLEAN:
-        if (yajl_gen_bool(g, object->data.boolean) != yajl_gen_status_ok)
-            return -1;
-        break;
-
-    case VIR_JSON_TYPE_NULL:
-        if (yajl_gen_null(g) != yajl_gen_status_ok)
-            return -1;
-        break;
-
-    default:
-        return -1;
-    }
-
-    return 0;
-}
-
-
-int
-virJSONValueToBuffer(virJSONValue *object,
-                     virBuffer *buf,
-                     bool pretty)
-{
-    yajl_gen g;
-    const unsigned char *str;
-    size_t len;
-    int ret = -1;
-
-    VIR_DEBUG("object=%p", object);
-
-    g = yajl_gen_alloc(NULL);
-    if (!g) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("Unable to create JSON formatter"));
-        goto cleanup;
-    }
-    yajl_gen_config(g, yajl_gen_beautify, pretty ? 1 : 0);
-    yajl_gen_config(g, yajl_gen_indent_string, pretty ? "  " : " ");
-    yajl_gen_config(g, yajl_gen_validate_utf8, 1);
-
-    if (virJSONValueToStringOne(object, g) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("failed to convert virJSONValue to yajl data"));
-        goto cleanup;
-    }
-
-    if (yajl_gen_get_buf(g, &str, &len) != yajl_gen_status_ok) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                      _("failed to format JSON"));
-        goto cleanup;
-    }
-
-    virBufferAdd(buf, (const char *) str, len);
-    ret = 0;
-
- cleanup:
-    yajl_gen_free(g);
-
-    return ret;
-}
-
-
 #else
 virJSONValue *
 virJSONValueFromString(const char *jsonstring G_GNUC_UNUSED)
-- 
2.46.0
Re: [libvirt PATCHv2 14/15] meson: drop yajl detection
Posted by Peter Krempa 1 year, 5 months ago
On Thu, Sep 05, 2024 at 15:49:41 +0200, Ján Tomko wrote:
> After this commit, WITH_YAJL can no longer be set.
> 
> Signed-off-by: Ján Tomko <jtomko@redhat.com>
> ---
>  meson.build        |  43 -----
>  src/util/virjson.c | 416 ---------------------------------------------
>  2 files changed, 459 deletions(-)
> 
> diff --git a/meson.build b/meson.build
> index 9605d58537..a7c62d8bcc 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -1378,48 +1378,6 @@ if wireshark_dep.found()
>    endif
>  endif
>  
> -yajl_version = '2.0.3'
> -yajl_dep = dependency('yajl', version: '>=' + yajl_version, required: false)
> -if yajl_dep.found()
> -  # Kludge for yajl include path on non-Linux
> -  #
> -  # As of 2.1.0, upstream yajl.pc has -I${includedir}/yajl among
> -  # its Cflags, which is clearly wrong. This does not affect Linux
> -  # because ${includedir} is already part of the default include path,
> -  # but on other platforms that's not the case and the result is that
> -  # <yajl/yajl.h> can't be located, causing the build to fail.
> -  #
> -  # Since upstream development for yajl has stopped years ago, there's
> -  # little hope of this issue getting fixed by a new upstream release.
> -  # Some non-Linux operating systems such as FreeBSD have elected to
> -  # carry a small downstream patch, but in the case of Homebrew on
> -  # macOS this approach has been rejected[1] and so we're left with no
> -  # choice but to work around the issue ourselves.
> -  #
> -  # [1] https://github.com/Homebrew/homebrew-core/pull/74516
> -  if host_machine.system() != 'linux'
> -    yajl_includedir = yajl_dep.get_variable(pkgconfig : 'includedir')
> -    if yajl_includedir.contains('include/yajl')
> -      rc = run_command(
> -        'python3', '-c',
> -        'print("@0@".replace("@1@", "@2@"))'.format(
> -          yajl_includedir, 'include/yajl', 'include',
> -        ),
> -        check: true,
> -      )
> -      yajl_includedir = rc.stdout().strip()
> -      yajl_dep = declare_dependency(
> -        compile_args: [ '-I' + yajl_includedir ],
> -        dependencies: [ yajl_dep ],
> -      )
> -    endif
> -  endif
> -
> -  conf.set('WITH_YAJL', 1)
> -  conf.set('WITH_JSON', 1)
> -endif
> -
> -
>  # generic build dependencies checks
>  
>  if bash_completion_dep.found() and not readline_dep.found()
> @@ -2374,7 +2332,6 @@ libs_summary = {
>    'selinux': selinux_dep.found(),
>    'udev': udev_dep.found(),
>    'xdr': xdr_dep.found(),
> -  'yajl': yajl_dep.found(),
>  }
>  summary(libs_summary, section: 'Libraries', bool_yn: true)

As noted I think all of the compile time checks and dependency stuff
should go into one patch so all of the above should go to 13/15.


This removal below can be separate.

> diff --git a/src/util/virjson.c b/src/util/virjson.c
> index 8e0ba47fc9..0378adf00e 100644
> --- a/src/util/virjson.c
> +++ b/src/util/virjson.c
> @@ -34,10 +34,6 @@
>  
>  #if WITH_JSON_C
>  # include <json.h>
> -#elif WITH_YAJL
> -# include <yajl/yajl_gen.h>
> -# include <yajl/yajl_parse.h>
> -
>  #endif
>  
>  /* XXX fixme */
> @@ -1553,418 +1549,6 @@ virJSONValueToBuffer(virJSONValue *object,
>  }
>  
>  
> -#elif WITH_YAJL
> -static int
> -virJSONParserInsertValue(virJSONParser *parser,
> -                         virJSONValue **value)
> -{
> -    if (!parser->head) {
> -        parser->head = g_steal_pointer(value);
> -    } else {
> -        virJSONParserState *state;
> -        if (!parser->nstate) {
> -            VIR_DEBUG("got a value to insert without a container");
> -            return -1;
> -        }
> -
> -        state = &parser->state[parser->nstate-1];
> -
> -        switch (state->value->type) {
> -        case VIR_JSON_TYPE_OBJECT: {
> -            if (!state->key) {
> -                VIR_DEBUG("missing key when inserting object value");
> -                return -1;
> -            }
> -
> -            if (virJSONValueObjectAppend(state->value,
> -                                         state->key,
> -                                         value) < 0)
> -                return -1;
> -
> -            VIR_FREE(state->key);
> -        }   break;
> -
> -        case VIR_JSON_TYPE_ARRAY: {
> -            if (state->key) {
> -                VIR_DEBUG("unexpected key when inserting array value");
> -                return -1;
> -            }
> -
> -            if (virJSONValueArrayAppend(state->value,
> -                                        value) < 0)
> -                return -1;
> -        }   break;
> -
> -        default:
> -            VIR_DEBUG("unexpected value type, not a container");
> -            return -1;
> -        }
> -    }
> -
> -    return 0;
> -}
> -
> -
> -static int
> -virJSONParserHandleNull(void *ctx)
> -{
> -    virJSONParser *parser = ctx;
> -    g_autoptr(virJSONValue) value = virJSONValueNewNull();
> -
> -    VIR_DEBUG("parser=%p", parser);
> -
> -    if (virJSONParserInsertValue(parser, &value) < 0)
> -        return 0;
> -
> -    return 1;
> -}
> -
> -
> -static int
> -virJSONParserHandleBoolean(void *ctx,
> -                           int boolean_)
> -{
> -    virJSONParser *parser = ctx;
> -    g_autoptr(virJSONValue) value = virJSONValueNewBoolean(boolean_);
> -
> -    VIR_DEBUG("parser=%p boolean=%d", parser, boolean_);
> -
> -    if (virJSONParserInsertValue(parser, &value) < 0)
> -        return 0;
> -
> -    return 1;
> -}
> -
> -
> -static int
> -virJSONParserHandleNumber(void *ctx,
> -                          const char *s,
> -                          size_t l)
> -{
> -    virJSONParser *parser = ctx;
> -    g_autoptr(virJSONValue) value = virJSONValueNewNumber(g_strndup(s, l));
> -
> -    VIR_DEBUG("parser=%p str=%s", parser, value->data.number);
> -
> -    if (virJSONParserInsertValue(parser, &value) < 0)
> -        return 0;
> -
> -    return 1;
> -}
> -
> -
> -static int
> -virJSONParserHandleString(void *ctx,
> -                          const unsigned char *stringVal,
> -                          size_t stringLen)
> -{
> -    virJSONParser *parser = ctx;
> -    g_autoptr(virJSONValue) value = virJSONValueNewString(g_strndup((const char *)stringVal, stringLen));
> -
> -    VIR_DEBUG("parser=%p str=%p", parser, (const char *)stringVal);
> -
> -    if (virJSONParserInsertValue(parser, &value) < 0)
> -        return 0;
> -
> -    return 1;
> -}
> -
> -
> -static int
> -virJSONParserHandleMapKey(void *ctx,
> -                          const unsigned char *stringVal,
> -                          size_t stringLen)
> -{
> -    virJSONParser *parser = ctx;
> -    virJSONParserState *state;
> -
> -    VIR_DEBUG("parser=%p key=%p", parser, (const char *)stringVal);
> -
> -    if (!parser->nstate)
> -        return 0;
> -
> -    state = &parser->state[parser->nstate-1];
> -    if (state->key)
> -        return 0;
> -    state->key = g_strndup((const char *)stringVal, stringLen);
> -    return 1;
> -}
> -
> -
> -static int
> -virJSONParserHandleStartMap(void *ctx)
> -{
> -    virJSONParser *parser = ctx;
> -    g_autoptr(virJSONValue) value = virJSONValueNewObject();
> -    virJSONValue *tmp = value;
> -
> -    VIR_DEBUG("parser=%p", parser);
> -
> -    if (virJSONParserInsertValue(parser, &value) < 0)
> -        return 0;
> -
> -    VIR_REALLOC_N(parser->state, parser->nstate + 1);
> -
> -    parser->state[parser->nstate].value = tmp;
> -    parser->state[parser->nstate].key = NULL;
> -    parser->nstate++;
> -
> -    return 1;
> -}
> -
> -
> -static int
> -virJSONParserHandleEndMap(void *ctx)
> -{
> -    virJSONParser *parser = ctx;
> -    virJSONParserState *state;
> -
> -    VIR_DEBUG("parser=%p", parser);
> -
> -    if (!parser->nstate)
> -        return 0;
> -
> -    state = &(parser->state[parser->nstate-1]);
> -    if (state->key) {
> -        VIR_FREE(state->key);
> -        return 0;
> -    }
> -
> -    VIR_DELETE_ELEMENT(parser->state, parser->nstate - 1, parser->nstate);
> -
> -    return 1;
> -}
> -
> -
> -static int
> -virJSONParserHandleStartArray(void *ctx)
> -{
> -    virJSONParser *parser = ctx;
> -    g_autoptr(virJSONValue) value = virJSONValueNewArray();
> -    virJSONValue *tmp = value;
> -
> -    VIR_DEBUG("parser=%p", parser);
> -
> -    if (virJSONParserInsertValue(parser, &value) < 0)
> -        return 0;
> -
> -    VIR_REALLOC_N(parser->state, parser->nstate + 1);
> -
> -    parser->state[parser->nstate].value = tmp;
> -    parser->state[parser->nstate].key = NULL;
> -    parser->nstate++;
> -
> -    return 1;
> -}
> -
> -
> -static int
> -virJSONParserHandleEndArray(void *ctx)
> -{
> -    virJSONParser *parser = ctx;
> -    virJSONParserState *state;
> -
> -    VIR_DEBUG("parser=%p", parser);
> -
> -    if (!(parser->nstate - parser->wrap))
> -        return 0;
> -
> -    state = &(parser->state[parser->nstate-1]);
> -    if (state->key) {
> -        VIR_FREE(state->key);
> -        return 0;
> -    }
> -
> -    VIR_DELETE_ELEMENT(parser->state, parser->nstate - 1, parser->nstate);
> -
> -    return 1;
> -}
> -
> -
> -static const yajl_callbacks parserCallbacks = {
> -    virJSONParserHandleNull,
> -    virJSONParserHandleBoolean,
> -    NULL,
> -    NULL,
> -    virJSONParserHandleNumber,
> -    virJSONParserHandleString,
> -    virJSONParserHandleStartMap,
> -    virJSONParserHandleMapKey,
> -    virJSONParserHandleEndMap,
> -    virJSONParserHandleStartArray,
> -    virJSONParserHandleEndArray
> -};
> -
> -
> -/* XXX add an incremental streaming parser - yajl trivially supports it */
> -virJSONValue *
> -virJSONValueFromString(const char *jsonstring)
> -{
> -    yajl_handle hand;
> -    virJSONParser parser = { NULL, NULL, 0, 0 };
> -    virJSONValue *ret = NULL;
> -    int rc;
> -    size_t len = strlen(jsonstring);
> -
> -    VIR_DEBUG("string=%s", jsonstring);
> -
> -    hand = yajl_alloc(&parserCallbacks, NULL, &parser);
> -    if (!hand) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("Unable to create JSON parser"));
> -        return NULL;
> -    }
> -
> -    /* Yajl 2 is nice enough to default to rejecting trailing garbage. */
> -    rc = yajl_parse(hand, (const unsigned char *)jsonstring, len);
> -    if (rc != yajl_status_ok ||
> -        yajl_complete_parse(hand) != yajl_status_ok) {
> -        unsigned char *errstr = yajl_get_error(hand, 1,
> -                                               (const unsigned char*)jsonstring,
> -                                               strlen(jsonstring));
> -
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       _("cannot parse json %1$s: %2$s"),
> -                       jsonstring, (const char*) errstr);
> -        yajl_free_error(hand, errstr);
> -        virJSONValueFree(parser.head);
> -        goto cleanup;
> -    }
> -
> -    if (parser.nstate != 0) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       _("cannot parse json %1$s: unterminated string/map/array"),
> -                       jsonstring);
> -        virJSONValueFree(parser.head);
> -    } else {
> -        ret = parser.head;
> -    }
> -
> - cleanup:
> -    yajl_free(hand);
> -
> -    if (parser.nstate) {
> -        size_t i;
> -        for (i = 0; i < parser.nstate; i++)
> -            VIR_FREE(parser.state[i].key);
> -        VIR_FREE(parser.state);
> -    }
> -
> -    VIR_DEBUG("result=%p", ret);
> -
> -    return ret;
> -}
> -
> -
> -static int
> -virJSONValueToStringOne(virJSONValue *object,
> -                        yajl_gen g)
> -{
> -    size_t i;
> -
> -    VIR_DEBUG("object=%p type=%d gen=%p", object, object->type, g);
> -
> -    switch (object->type) {
> -    case VIR_JSON_TYPE_OBJECT:
> -        if (yajl_gen_map_open(g) != yajl_gen_status_ok)
> -            return -1;
> -        for (i = 0; i < object->data.object.npairs; i++) {
> -            if (yajl_gen_string(g,
> -                                (unsigned char *)object->data.object.pairs[i].key,
> -                                strlen(object->data.object.pairs[i].key))
> -                != yajl_gen_status_ok)
> -                return -1;
> -            if (virJSONValueToStringOne(object->data.object.pairs[i].value, g) < 0)
> -                return -1;
> -        }
> -        if (yajl_gen_map_close(g) != yajl_gen_status_ok)
> -            return -1;
> -        break;
> -    case VIR_JSON_TYPE_ARRAY:
> -        if (yajl_gen_array_open(g) != yajl_gen_status_ok)
> -            return -1;
> -        for (i = 0; i < object->data.array.nvalues; i++) {
> -            if (virJSONValueToStringOne(object->data.array.values[i], g) < 0)
> -                return -1;
> -        }
> -        if (yajl_gen_array_close(g) != yajl_gen_status_ok)
> -            return -1;
> -        break;
> -
> -    case VIR_JSON_TYPE_STRING:
> -        if (yajl_gen_string(g, (unsigned char *)object->data.string,
> -                            strlen(object->data.string)) != yajl_gen_status_ok)
> -            return -1;
> -        break;
> -
> -    case VIR_JSON_TYPE_NUMBER:
> -        if (yajl_gen_number(g, object->data.number,
> -                            strlen(object->data.number)) != yajl_gen_status_ok)
> -            return -1;
> -        break;
> -
> -    case VIR_JSON_TYPE_BOOLEAN:
> -        if (yajl_gen_bool(g, object->data.boolean) != yajl_gen_status_ok)
> -            return -1;
> -        break;
> -
> -    case VIR_JSON_TYPE_NULL:
> -        if (yajl_gen_null(g) != yajl_gen_status_ok)
> -            return -1;
> -        break;
> -
> -    default:
> -        return -1;
> -    }
> -
> -    return 0;
> -}
> -
> -
> -int
> -virJSONValueToBuffer(virJSONValue *object,
> -                     virBuffer *buf,
> -                     bool pretty)
> -{
> -    yajl_gen g;
> -    const unsigned char *str;
> -    size_t len;
> -    int ret = -1;
> -
> -    VIR_DEBUG("object=%p", object);
> -
> -    g = yajl_gen_alloc(NULL);
> -    if (!g) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("Unable to create JSON formatter"));
> -        goto cleanup;
> -    }
> -    yajl_gen_config(g, yajl_gen_beautify, pretty ? 1 : 0);
> -    yajl_gen_config(g, yajl_gen_indent_string, pretty ? "  " : " ");
> -    yajl_gen_config(g, yajl_gen_validate_utf8, 1);
> -
> -    if (virJSONValueToStringOne(object, g) < 0) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("failed to convert virJSONValue to yajl data"));
> -        goto cleanup;
> -    }
> -
> -    if (yajl_gen_get_buf(g, &str, &len) != yajl_gen_status_ok) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                      _("failed to format JSON"));
> -        goto cleanup;
> -    }
> -
> -    virBufferAdd(buf, (const char *) str, len);
> -    ret = 0;
> -
> - cleanup:
> -    yajl_gen_free(g);
> -
> -    return ret;
> -}
> -
> -
>  #else
>  virJSONValue *

Reviewed-by: Peter Krempa <pkrempa@redhat.com>