diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 8bed8dd9..a5ad05e6 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -16,15 +16,12 @@ jobs: distro: ubuntu_latest - arch: s390x distro: ubuntu_latest - - arch: ppc64le - distro: ubuntu_latest + # - arch: ppc64le + # distro: ubuntu_latest steps: - - uses: actions/checkout@v3.0.2 - with: - submodules: true - set-safe-directory: true + - uses: actions/checkout@v4.2.2 - - uses: uraimo/run-on-arch-action@v2.2.0 + - uses: uraimo/run-on-arch-action@v2.8.1 name: Build id: build with: @@ -33,18 +30,16 @@ jobs: githubToken: ${{ github.token }} - setup: | - git submodule update --init --recursive - install: | apt-get update -q -y - apt-get install -q -y python3 automake libtool autotools-dev git make cmake pkg-config gcc wget xz-utils + apt-get install -q -y python3 automake libtool autotools-dev git make cmake pkg-config gcc wget xz-utils libjson-c-dev run: | + # Configure and Run libocispec find $(pwd) -name '.git' -exec bash -c 'git config --global --add safe.directory ${0%/.git}' {} \; - ./autogen.sh --enable-embedded-yajl - ./configure --enable-embedded-yajl CFLAGS='-Wall -Wextra -Werror' - make -j $(nproc) distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-embedded-yajl" + ./autogen.sh + ./configure CFLAGS='-Wall -Wextra -Werror' + make -j $(nproc) distcheck AM_DISTCHECK_DVI_TARGET="" # check that the working dir is clean git describe --broken --dirty --all | grep -qv dirty make clean diff --git a/.gitmodules b/.gitmodules index 0381f810..c69ddcaf 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,3 @@ [submodule "image-spec"] path = image-spec url = https://github.com/opencontainers/image-spec -[submodule "yajl"] - path = yajl - url = https://github.com/containers/yajl.git diff --git a/Containerfile b/Containerfile new file mode 100644 index 00000000..f35a52b2 --- /dev/null +++ b/Containerfile @@ -0,0 +1,20 @@ +FROM ubuntu:24.04 + +RUN apt-get update && \ + apt-get install -y \ + autoconf \ + build-essential \ + git \ + libtool \ + pkg-config \ + python3 \ + libjson-c-dev + + +COPY . libocispec + +RUN cd libocispec && \ + ./autogen.sh && \ + ./configure CFLAGS='-Wall -Wextra -Werror' && \ + make -j $(nproc) distcheck AM_DISTCHECK_DVI_TARGET="" && \ + make clean diff --git a/Makefile.am b/Makefile.am index cb73891b..06a32158 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,12 +1,5 @@ -DIST_SUBDIRS = yajl -SUBDIRS = yajl - AM_CFLAGS = $(WARN_CFLAGS) -I$(top_srcdir)/src -I$(top_builddir)/src -if HAVE_EMBEDDED_YAJL -AM_CFLAGS += -I$(top_srcdir)/yajl/src/headers -endif HAVE_EMBEDDED_YAJL - CLEANFILES = $(man_MANS) src/runtime_spec_stamp src/image_spec_stamp src/image_manifest_stamp src/basic-test_stamp GITIGNOREFILES = build-aux/ gtk-doc.make config.h.in aclocal.m4 @@ -155,12 +148,6 @@ CLEANFILES += $(HEADER_FILES) $(SOURCE_FILES) $(TMP_H_FILES) $(TMP_C_FILES) TESTS_LDADD = libocispec.la $(SELINUX_LIBS) -if HAVE_EMBEDDED_YAJL -TESTS_LDADD += yajl/libyajl.la -else -TESTS_LDADD += $(YAJL_LIBS) -endif - libocispec_a_SOURCES = libocispec.a: libocispec.la $(BUILT_SOURCES) src/runtime_spec_stamp src/image_spec_stamp src/image_manifest_stamp src/basic-test_stamp @@ -256,13 +243,12 @@ EXTRA_DIST = autogen.sh \ runtime-spec \ image-spec \ src/ocispec/json_common.h \ - src/ocispec/json_common.c \ - src/yajl + src/ocispec/json_common.c sync: (cd image-spec; git pull https://github.com/opencontainers/image-spec) (cd runtime-spec; git pull https://github.com/opencontainers/runtime-spec) - (cd yajl; git pull https://github.com/containers/yajl main) + generate: src/runtime_spec_stamp src/image_spec_stamp src/image_manifest_stamp src/basic-test_stamp diff --git a/README.md b/README.md index 17e15a7a..5e572907 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ from C, and generate json string from corresponding struct. The parser is generated directly from the JSON schema in the source repository. ## Installation -Expects [yajl](https://github.com/containers/yajl) to be installed and linkable. +Expects [jansson](https://github.com/akheron/jansson) to be installed and linkable. ```sh $ ./autogen.sh $ ./configure diff --git a/autogen.sh b/autogen.sh index d8bbf0ed..7c25e77a 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,7 +1,5 @@ #!/bin/sh -(cd yajl; ./autogen.sh) - git submodule update --init --recursive test -n "$srcdir" || srcdir=`dirname "$0"` diff --git a/configure.ac b/configure.ac index 6125dcbe..1fedac7f 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.63]) -AC_INIT([libocispec], [0.3], [giuseppe@scrivano.org]) +AC_INIT([libocispec], [0.4], [giuseppe@scrivano.org]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([build-aux]) @@ -12,23 +12,7 @@ AM_INIT_AUTOMAKE([1.11 -Wno-portability foreign tar-ustar no-dist-gzip dist-xz s AM_MAINTAINER_MODE([enable]) AM_SILENT_RULES([yes]) -AM_EXTRA_RECURSIVE_TARGETS([yajl]) -AC_CONFIG_SUBDIRS([yajl]) - -AC_ARG_ENABLE(embedded-yajl, -AS_HELP_STRING([--enable-embedded-yajl], [Statically link a modified yajl version]), -[ -case "${enableval}" in - yes) embedded_yajl=true ;; - no) embedded_yajl=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-embedded-yajl) ;; -esac],[embedded_yajl=false]) - -AM_CONDITIONAL([HAVE_EMBEDDED_YAJL], [test x"$embedded_yajl" = xtrue]) -AM_COND_IF([HAVE_EMBEDDED_YAJL], [], [ -AC_SEARCH_LIBS(yajl_tree_get, [yajl], [AC_DEFINE([HAVE_YAJL], 1, [Define if libyajl is available])], [AC_MSG_ERROR([*** libyajl headers not found])]) -PKG_CHECK_MODULES([YAJL], [yajl >= 2.0.0]) -]) +AC_SEARCH_LIBS(json_c_version, [json-c], [AC_DEFINE([HAVE_JSONC], 1, [Define if json-c is available])], [AC_MSG_ERROR([*** json-c headers not found])]) # Optionally install the library. AC_ARG_ENABLE(libocispec-install, diff --git a/image-spec b/image-spec index c66e8113..5325ec48 160000 --- a/image-spec +++ b/image-spec @@ -1 +1 @@ -Subproject commit c66e8113cbad252a418d85f061bd1a20d0904d08 +Subproject commit 5325ec48851022d6ded604199a3566254e72842a diff --git a/ocispec.pc.in b/ocispec.pc.in index 9255abde..e380ffcf 100644 --- a/ocispec.pc.in +++ b/ocispec.pc.in @@ -5,7 +5,7 @@ includedir=@includedir@ Name: @PACKAGE_NAME@ Description: A library for easily parsing [OCI runtime](https://github.com/opencontainers/runtime-spec) and [OCI image](https://github.com/opencontainers/image-spec) files. -Requires: yajl +Requires: jansson Version: @PACKAGE_VERSION@ Libs: -L${libdir} -locispec Cflags: -I${includedir}/ocispec diff --git a/src/ocispec/headers.py b/src/ocispec/headers.py index 4d1ff88c..7e3b763c 100755 --- a/src/ocispec/headers.py +++ b/src/ocispec/headers.py @@ -60,7 +60,7 @@ def append_header_arr(obj, header, prefix): typename = helpers.get_name_substr(obj.name, prefix) header.append(f"}}\n{typename};\n\n") header.append(f"void free_{typename} ({typename} *ptr);\n\n") - header.append(f"{typename} *make_{typename} (yajl_val tree, const struct parser_context *ctx, parser_error *err);\n\n") + header.append(f"{typename} *make_{typename} (json_object *jtree, const struct parser_context *ctx, parser_error *err);\n\n") def append_header_map_str_obj(obj, header, prefix): @@ -164,7 +164,7 @@ def append_type_c_header(obj, header, prefix): else: append_header_child_others(i, header, prefix) if obj.children is not None: - header.append(" yajl_val _residual;\n") + header.append(" struct json_object *_residual;\n") if len(present_tags) > 0: header.append("\n") for tag in present_tags: @@ -173,8 +173,8 @@ def append_type_c_header(obj, header, prefix): header.append(f"}}\n{typename};\n\n") header.append(f"void free_{typename} ({typename} *ptr);\n\n") header.append(f"{typename} *clone_{typename} ({typename} *src);\n") - header.append(f"{typename} *make_{typename} (yajl_val tree, const struct parser_context *ctx, parser_error *err);\n\n") - header.append(f"yajl_gen_status gen_{typename} (yajl_gen g, const {typename} *ptr, const struct parser_context *ctx, parser_error *err);\n\n") + header.append(f"{typename} *make_{typename} (json_object *jtree, const struct parser_context *ctx, parser_error *err);\n\n") + header.append(f"int gen_{typename} (json_object *root, const {typename} *ptr, parser_error *err);\n\n") def header_reflect_top_array(obj, prefix, header): c_typ = helpers.get_prefixed_pointer(obj.name, obj.subtyp, prefix) or \ @@ -206,7 +206,7 @@ def header_reflect_top_array(obj, prefix, header): header.append(f"{typename} *{typename}_parse_data(const char *jsondata, const struct "\ "parser_context *ctx, parser_error *err);\n\n") header.append(f"char *{typename}_generate_json(const {typename} *ptr, "\ - "const struct parser_context *ctx, parser_error *err);\n\n") + "parser_error *err);\n\n") def header_reflect(structs, schema_info, header): ''' @@ -239,7 +239,7 @@ def header_reflect(structs, schema_info, header): "parser_error *err);\n\n") header.append(f"{prefix} *{prefix}_parse_data (const char *jsondata, const struct parser_context *ctx, "\ "parser_error *err);\n\n") - header.append(f"char *{prefix}_generate_json (const {prefix} *ptr, const struct parser_context *ctx, "\ + header.append(f"char *{prefix}_generate_json (const {prefix} *ptr,"\ "parser_error *err);\n\n") elif toptype == 'array': header_reflect_top_array(structs[length - 1], prefix, header) diff --git a/src/ocispec/json_common.c b/src/ocispec/json_common.c index fb2b8829..8343d418 100644 --- a/src/ocispec/json_common.c +++ b/src/ocispec/json_common.c @@ -5,172 +5,8 @@ #include #include "ocispec/json_common.h" -#define YAJL_GET_OBJECT_NO_CHECK(v) (&(v)->u.object) -#define YAJL_GET_STRING_NO_CHECK(v) ((v)->u.string) - #define MAX_NUM_STR_LEN 21 -static yajl_gen_status gen_yajl_val (yajl_val obj, yajl_gen g, parser_error *err); - -static yajl_gen_status -gen_yajl_val_obj (yajl_val obj, yajl_gen g, parser_error *err) -{ - size_t i; - yajl_gen_status stat = yajl_gen_status_ok; - - stat = yajl_gen_map_open (g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - - for (i = 0; i < obj->u.object.len; i++) - { - stat = yajl_gen_string (g, (const unsigned char *) obj->u.object.keys[i], strlen (obj->u.object.keys[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = gen_yajl_val (obj->u.object.values[i], g, err); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - stat = yajl_gen_map_close (g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - return yajl_gen_status_ok; -} - -static yajl_gen_status -gen_yajl_val_array (yajl_val arr, yajl_gen g, parser_error *err) -{ - size_t i; - yajl_gen_status stat = yajl_gen_status_ok; - - stat = yajl_gen_array_open (g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - - for (i = 0; i < arr->u.array.len; i++) - { - stat = gen_yajl_val (arr->u.array.values[i], g, err); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - stat = yajl_gen_array_close (g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - return yajl_gen_status_ok; -} - -static yajl_gen_status -gen_yajl_val (yajl_val obj, yajl_gen g, parser_error *err) -{ - yajl_gen_status __stat = yajl_gen_status_ok; - char *__tstr; - - switch (obj->type) - { - case yajl_t_string: - __tstr = YAJL_GET_STRING (obj); - if (__tstr == NULL) - { - return __stat; - } - __stat = yajl_gen_string (g, (const unsigned char *) __tstr, strlen (__tstr)); - if (yajl_gen_status_ok != __stat) - GEN_SET_ERROR_AND_RETURN (__stat, err); - return yajl_gen_status_ok; - case yajl_t_number: - __tstr = YAJL_GET_NUMBER (obj); - if (__tstr == NULL) - { - return __stat; - } - __stat = yajl_gen_number (g, __tstr, strlen (__tstr)); - if (yajl_gen_status_ok != __stat) - GEN_SET_ERROR_AND_RETURN (__stat, err); - return yajl_gen_status_ok; - case yajl_t_object: - return gen_yajl_val_obj (obj, g, err); - case yajl_t_array: - return gen_yajl_val_array (obj, g, err); - case yajl_t_true: - return yajl_gen_bool (g, true); - case yajl_t_false: - return yajl_gen_bool (g, false); - case yajl_t_null: - return yajl_gen_null(g); - case yajl_t_any: - return __stat; - } - return __stat; -} - -yajl_gen_status -gen_yajl_object_residual (yajl_val obj, yajl_gen g, parser_error *err) -{ - size_t i; - yajl_gen_status stat = yajl_gen_status_ok; - - for (i = 0; i < obj->u.object.len; i++) - { - if (obj->u.object.keys[i] == NULL) - { - continue; - } - stat = yajl_gen_string (g, (const unsigned char *) obj->u.object.keys[i], strlen (obj->u.object.keys[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = gen_yajl_val (obj->u.object.values[i], g, err); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - return yajl_gen_status_ok; -} - -yajl_gen_status -map_uint (void *ctx, long long unsigned int num) -{ - char numstr[MAX_NUM_STR_LEN]; - int ret; - - ret = snprintf (numstr, sizeof (numstr), "%llu", num); - if (ret < 0 || (size_t) ret >= sizeof (numstr)) - return yajl_gen_in_error_state; - return yajl_gen_number ((yajl_gen) ctx, (const char *) numstr, strlen (numstr)); -} - -yajl_gen_status -map_int (void *ctx, long long int num) -{ - char numstr[MAX_NUM_STR_LEN]; - int ret; - - ret = snprintf (numstr, sizeof (numstr), "%lld", num); - if (ret < 0 || (size_t) ret >= sizeof (numstr)) - return yajl_gen_in_error_state; - return yajl_gen_number ((yajl_gen) ctx, (const char *) numstr, strlen (numstr)); -} - -bool -json_gen_init (yajl_gen *g, const struct parser_context *ctx) -{ - *g = yajl_gen_alloc (NULL); - if (NULL == *g) - return false; - - yajl_gen_config (*g, yajl_gen_beautify, (int) (! (ctx->options & OPT_GEN_SIMPLIFY))); - yajl_gen_config (*g, yajl_gen_validate_utf8, (int) (! (ctx->options & OPT_GEN_NO_VALIDATE_UTF8))); - return true; -} - -yajl_val -get_val (yajl_val tree, const char *name, yajl_type type) -{ - const char *path[] = { name, NULL }; - return yajl_tree_get (tree, path, type); -} - char * safe_strdup (const char *src) { @@ -196,136 +32,99 @@ safe_malloc (size_t size) return ret; } +/* +* This function converts double to int +* Input: double d, int *converted +* Ouput: int +*/ int -common_safe_double (const char *numstr, double *converted) +json_double_to_int (double d, int *converted) { - char *err_str = NULL; - double d; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - d = strtod (numstr, &err_str); - if (errno > 0) - return -errno; + long long int lli; + lli = (long long int) d; - if (err_str == NULL || err_str == numstr || *err_str != '\0') - return -EINVAL; + if (lli > INT_MAX || lli < INT_MIN) + return -ERANGE; - *converted = d; + *converted = (int) lli; return 0; } +/* +* This function converts double to int64 +* Input: double d, int64 *converted +* Ouput: int +*/ int -common_safe_uint8 (const char *numstr, uint8_t *converted) +json_double_to_int64 (double d, int64_t *converted) { - char *err = NULL; - unsigned long int uli; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - uli = strtoul (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; - - if (uli > UINT8_MAX) - return -ERANGE; - - *converted = (uint8_t) uli; + long long int lli; + lli = (long long int) d; + *converted = (int64_t) lli; return 0; } +/* +* This function converts double to int32 +* Input: double d, int32 *converted +* Ouput: int +*/ int -common_safe_uint16 (const char *numstr, uint16_t *converted) +json_double_to_int32 (double d, int32_t *converted) { - char *err = NULL; - unsigned long int uli; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - uli = strtoul (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; + long long int lli; + lli = (long long int) d; - if (uli > UINT16_MAX) + if (lli > INT32_MAX || lli < INT32_MIN) return -ERANGE; - *converted = (uint16_t) uli; + *converted = (int32_t) lli; return 0; } +/* +* This function converts double to int16 +* Input: double d, int16 *converted +* Ouput: int +*/ int -common_safe_uint32 (const char *numstr, uint32_t *converted) +json_double_to_int16 (double d, int16_t *converted) { - char *err = NULL; - unsigned long long int ull; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - ull = strtoull (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; - - if (ull > UINT32_MAX) + long int li; + li = (long int) d; + if (li > INT16_MAX || li < INT16_MIN) return -ERANGE; - *converted = (uint32_t) ull; + *converted = (int16_t) li; return 0; } +/* +* This function converts double to int8 +* Input: double d, int8 *converted +* Ouput: int +*/ int -common_safe_uint64 (const char *numstr, uint64_t *converted) +json_double_to_int8 (double d, int8_t *converted) { - char *err = NULL; - unsigned long long int ull; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - ull = strtoull (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; - - *converted = (uint64_t) ull; + long int li; + li = (long int) d; + if (li > INT8_MAX || li < INT8_MIN) + return -ERANGE; + *converted = (int8_t) li; return 0; } +/* +* This function converts double to uint +* Input: double d, unsigned int *converted +* Ouput: int +*/ int -common_safe_uint (const char *numstr, unsigned int *converted) +json_double_to_uint (double d, unsigned int *converted) { - char *err = NULL; unsigned long long int ull; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - ull = strtoull (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; + ull = (unsigned long long int) d; if (ull > UINT_MAX) return -ERANGE; @@ -334,259 +133,92 @@ common_safe_uint (const char *numstr, unsigned int *converted) return 0; } +/* +* This function converts double to uint64 +* Input: double d, uint64_t *converted +* Ouput: int +*/ int -common_safe_int8 (const char *numstr, int8_t *converted) -{ - char *err = NULL; - long int li; - - if (numstr == NULL) - { - return -EINVAL; - } - - errno = 0; - li = strtol (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; - - if (li > INT8_MAX || li < INT8_MIN) - return -ERANGE; - - *converted = (int8_t) li; - return 0; -} - +json_double_to_uint64 (double d, uint64_t *converted) +{ + // Safely convert double to uint64_t by checking for potential overflows + if (d >= 4294967296.0) { // Check if value is greater than or equal to 2^32 + // TODO: This is not ideal but assumption is number this + // big means unlimited and this works for known test cases + // We need to better way to convert double to uint64 + *converted = 18446744073709551615UL; + } else { + // Handle smaller values (less than 2^32) + *converted = (uint64_t) d; + } + return 0; +} + +/* +* This function converts double to uint32 +* Input: double d, uint32_t *converted +* Ouput: int +*/ int -common_safe_int16 (const char *numstr, int16_t *converted) +json_double_to_uint32 (double d, uint32_t *converted) { - char *err = NULL; - long int li; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - li = strtol (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; + unsigned long long int ull; + ull = (unsigned long long int) d; - if (li > INT16_MAX || li < INT16_MIN) + if (ull > UINT32_MAX) return -ERANGE; - *converted = (int16_t) li; + *converted = (uint32_t) ull; return 0; } +/* +* This function converts double to uint16 +* Input: double d, uint16_t *converted +* Ouput: int +*/ int -common_safe_int32 (const char *numstr, int32_t *converted) +json_double_to_uint16 (double d, uint16_t *converted) { - char *err = NULL; - long long int lli; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - lli = strtol (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; - - if (lli > INT32_MAX || lli < INT32_MIN) - + unsigned long int uli; + uli = (unsigned long int) d; + if (uli > UINT16_MAX) return -ERANGE; - *converted = (int32_t) lli; + *converted = (uint16_t) uli; return 0; } +/* +* This function converts double to uint8 +* Input: double d, uint8_t *converted +* Ouput: int +*/ int -common_safe_int64 (const char *numstr, int64_t *converted) +json_double_to_uint8 (double d, uint8_t *converted) { - char *err = NULL; - long long int lli; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - lli = strtoll (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; + unsigned long int uli; + uli = (unsigned long int) d; + + if (uli > UINT8_MAX) + return -ERANGE; - *converted = (int64_t) lli; + *converted = (uint8_t) uli; return 0; } +/* +* This function converts double to double, kind of silly :) +* Input: double d, double *converted +* Ouput: int +*/ int -common_safe_int (const char *numstr, int *converted) +json_double_to_double (double d, double *converted) { - char *err = NULL; - long long int lli; - - if (numstr == NULL) - return -EINVAL; - - errno = 0; - lli = strtol (numstr, &err, 0); - if (errno > 0) - return -errno; - - if (err == NULL || err == numstr || *err != '\0') - return -EINVAL; - - if (lli > INT_MAX || lli < INT_MIN) - return -ERANGE; - - *converted = (int) lli; + *converted = d; return 0; } -yajl_gen_status -gen_json_map_int_int (void *ctx, const json_map_int_int *map, const struct parser_context *ptx, parser_error *err) -{ - yajl_gen_status stat = yajl_gen_status_ok; - yajl_gen g = (yajl_gen) ctx; - size_t len = 0, i = 0; - if (map != NULL) - len = map->len; - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 0); - stat = yajl_gen_map_open ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - for (i = 0; i < len; i++) - { - char numstr[MAX_NUM_STR_LEN]; - int nret; - nret = snprintf (numstr, sizeof (numstr), "%lld", (long long int) map->keys[i]); - if (nret < 0 || (size_t) nret >= sizeof (numstr)) - { - if (! *err) - *err = strdup ("Error to print string"); - return yajl_gen_in_error_state; - } - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) numstr, strlen (numstr)); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = map_int (g, map->values[i]); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - stat = yajl_gen_map_close ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 1); - return yajl_gen_status_ok; -} - -void -free_json_map_int_int (json_map_int_int *map) -{ - if (map != NULL) - { - free (map->keys); - map->keys = NULL; - free (map->values); - map->values = NULL; - free (map); - } -} - -define_cleaner_function (json_map_int_int *, free_json_map_int_int) - -json_map_int_int * -make_json_map_int_int (yajl_val src, const struct parser_context *ctx, parser_error *err) -{ - __auto_cleanup (free_json_map_int_int) json_map_int_int *ret = NULL; - size_t i; - size_t len; - - (void) ctx; /* Silence compiler warning. */ - - if (src == NULL || YAJL_GET_OBJECT (src) == NULL) - return NULL; - - len = YAJL_GET_OBJECT_NO_CHECK (src)->len; - ret = calloc (1, sizeof (*ret)); - if (ret == NULL) - return NULL; - - ret->len = 0; - ret->keys = calloc (len + 1, sizeof (int)); - if (ret->keys == NULL) - { - return NULL; - } - - ret->values = calloc (len + 1, sizeof (int)); - if (ret->values == NULL) - { - return NULL; - } - - for (i = 0; i < len; i++) - { - const char *srckey = YAJL_GET_OBJECT_NO_CHECK (src)->keys[i]; - yajl_val srcval = YAJL_GET_OBJECT_NO_CHECK (src)->values[i]; - - ret->keys[i] = 0; - ret->values[i] = 0; - ret->len = i + 1; - - if (srckey != NULL) - { - int invalid = common_safe_int (srckey, &(ret->keys[i])); - if (invalid) - { - if (*err == NULL - && asprintf (err, "Invalid key '%s' with type 'int': %s", srckey, strerror (-invalid)) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - } - - if (srcval != NULL) - { - int invalid; - if (! YAJL_IS_NUMBER (srcval)) - { - if (*err == NULL && asprintf (err, "Invalid value with type 'int' for key '%s'", srckey) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - invalid = common_safe_int (YAJL_GET_NUMBER (srcval), &(ret->values[i])); - if (invalid) - { - if (*err == NULL - && asprintf (err, "Invalid value with type 'int' for key '%s': %s", srckey, strerror (-invalid)) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - } - } - return move_ptr (ret); -} int append_json_map_int_int (json_map_int_int *map, int key, int val) @@ -629,135 +261,6 @@ append_json_map_int_int (json_map_int_int *map, int key, int val) return 0; } -yajl_gen_status -gen_json_map_int_bool (void *ctx, const json_map_int_bool *map, const struct parser_context *ptx, parser_error *err) -{ - yajl_gen_status stat = yajl_gen_status_ok; - yajl_gen g = (yajl_gen) ctx; - size_t len = 0, i = 0; - if (map != NULL) - len = map->len; - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 0); - stat = yajl_gen_map_open ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - for (i = 0; i < len; i++) - { - char numstr[MAX_NUM_STR_LEN]; - int nret; - nret = snprintf (numstr, sizeof (numstr), "%lld", (long long int) map->keys[i]); - if (nret < 0 || (size_t) nret >= sizeof (numstr)) - { - if (! *err) - *err = strdup ("Error to print string"); - return yajl_gen_in_error_state; - } - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) numstr, strlen (numstr)); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = yajl_gen_bool ((yajl_gen) g, (int) (map->values[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - stat = yajl_gen_map_close ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 1); - return yajl_gen_status_ok; -} - -void -free_json_map_int_bool (json_map_int_bool *map) -{ - if (map != NULL) - { - size_t i; - for (i = 0; i < map->len; i++) - { - // No need to free key for type int - // No need to free value for type bool - } - free (map->keys); - map->keys = NULL; - free (map->values); - map->values = NULL; - free (map); - } -} - -define_cleaner_function (json_map_int_bool *, free_json_map_int_bool) - -json_map_int_bool * -make_json_map_int_bool (yajl_val src, const struct parser_context *ctx, parser_error *err) -{ - __auto_cleanup (free_json_map_int_bool) json_map_int_bool *ret = NULL; - size_t i; - size_t len; - - (void) ctx; /* Silence compiler warning. */ - - if (src == NULL || YAJL_GET_OBJECT (src) == NULL) - return NULL; - - len = YAJL_GET_OBJECT_NO_CHECK (src)->len; - ret = calloc (1, sizeof (*ret)); - if (ret == NULL) - return NULL; - ret->len = 0; - ret->keys = calloc (len + 1, sizeof (int)); - if (ret->keys == NULL) - { - return NULL; - } - ret->values = calloc (len + 1, sizeof (bool)); - if (ret->values == NULL) - { - return NULL; - } - for (i = 0; i < len; i++) - { - const char *srckey = YAJL_GET_OBJECT_NO_CHECK (src)->keys[i]; - yajl_val srcval = YAJL_GET_OBJECT_NO_CHECK (src)->values[i]; - - ret->keys[i] = 0; - ret->values[i] = false; - ret->len = i + 1; - - if (srckey != NULL) - { - int invalid = common_safe_int (srckey, &(ret->keys[i])); - if (invalid) - { - if (*err == NULL - && asprintf (err, "Invalid key '%s' with type 'int': %s", srckey, strerror (-invalid)) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - } - - if (srcval != NULL) - { - if (YAJL_IS_TRUE (srcval)) - ret->values[i] = true; - else if (YAJL_IS_FALSE (srcval)) - ret->values[i] = false; - else - { - if (*err == NULL && asprintf (err, "Invalid value with type 'bool' for key '%s'", srckey) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - } - } - return move_ptr (ret); -} int append_json_map_int_bool (json_map_int_bool *map, int key, bool val) @@ -775,164 +278,29 @@ append_json_map_int_bool (json_map_int_bool *map, int key, bool val) len = map->len + 1; keys = calloc (len, sizeof (int)); if (keys == NULL) - return -1; - vals = calloc (len, sizeof (bool)); - if (vals == NULL) - { - return -1; - } - - if (map->len) - { - (void) memcpy (keys, map->keys, map->len * sizeof (int)); - (void) memcpy (vals, map->values, map->len * sizeof (bool)); - } - free (map->keys); - map->keys = keys; - keys = NULL; - free (map->values); - map->values = vals; - vals = NULL; - map->keys[map->len] = key; - map->values[map->len] = val; - - map->len++; - return 0; -} - -yajl_gen_status -gen_json_map_int_string (void *ctx, const json_map_int_string *map, const struct parser_context *ptx, parser_error *err) -{ - yajl_gen_status stat = yajl_gen_status_ok; - yajl_gen g = (yajl_gen) ctx; - size_t len = 0, i = 0; - if (map != NULL) - len = map->len; - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 0); - - stat = yajl_gen_map_open ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - for (i = 0; i < len; i++) - { - char numstr[MAX_NUM_STR_LEN]; - int nret; - nret = snprintf (numstr, sizeof (numstr), "%lld", (long long int) map->keys[i]); - if (nret < 0 || (size_t) nret >= sizeof (numstr)) - { - if (! *err) - *err = strdup ("Error to print string"); - return yajl_gen_in_error_state; - } - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) numstr, strlen (numstr)); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) (map->values[i]), strlen (map->values[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - stat = yajl_gen_map_close ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 1); - return yajl_gen_status_ok; -} - -void -free_json_map_int_string (json_map_int_string *map) -{ - if (map != NULL) - { - size_t i; - for (i = 0; i < map->len; i++) - { - // No need to free key for type int - free (map->values[i]); - map->values[i] = NULL; - } - free (map->keys); - map->keys = NULL; - free (map->values); - map->values = NULL; - free (map); - } -} - -define_cleaner_function (json_map_int_string *, free_json_map_int_string) - -json_map_int_string * -make_json_map_int_string (yajl_val src, const struct parser_context *ctx, parser_error *err) -{ - __auto_cleanup (free_json_map_int_string) json_map_int_string *ret = NULL; - size_t i; - size_t len; - - if (src == NULL || YAJL_GET_OBJECT (src) == NULL) - return NULL; - - (void) ctx; /* Silence compiler warning. */ - - len = YAJL_GET_OBJECT_NO_CHECK (src)->len; - - ret = calloc (1, sizeof (*ret)); - if (ret == NULL) - return NULL; - - ret->len = 0; - ret->keys = calloc (len + 1, sizeof (int)); - if (ret->keys == NULL) + return -1; + vals = calloc (len, sizeof (bool)); + if (vals == NULL) { - return NULL; + return -1; } - ret->values = calloc (len + 1, sizeof (char *)); - if (ret->values == NULL) + if (map->len) { - return NULL; + (void) memcpy (keys, map->keys, map->len * sizeof (int)); + (void) memcpy (vals, map->values, map->len * sizeof (bool)); } + free (map->keys); + map->keys = keys; + keys = NULL; + free (map->values); + map->values = vals; + vals = NULL; + map->keys[map->len] = key; + map->values[map->len] = val; - for (i = 0; i < len; i++) - { - const char *srckey = YAJL_GET_OBJECT_NO_CHECK (src)->keys[i]; - yajl_val srcval = YAJL_GET_OBJECT_NO_CHECK (src)->values[i]; - - ret->keys[i] = 0; - ret->values[i] = NULL; - ret->len = i + 1; - - if (srckey != NULL) - { - int invalid; - invalid = common_safe_int (srckey, &(ret->keys[i])); - if (invalid) - { - if (*err == NULL - && asprintf (err, "Invalid key '%s' with type 'int': %s", srckey, strerror (-invalid)) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - } - - if (srcval != NULL) - { - if (! YAJL_IS_STRING (srcval)) - { - if (*err == NULL && asprintf (err, "Invalid value with type 'string' for key '%s'", srckey) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - char *str = YAJL_GET_STRING_NO_CHECK (srcval); - ret->values[i] = strdup (str ? str : ""); - } - } - return move_ptr (ret); + map->len++; + return 0; } int @@ -971,131 +339,6 @@ append_json_map_int_string (json_map_int_string *map, int key, const char *val) return 0; } -yajl_gen_status -gen_json_map_string_int (void *ctx, const json_map_string_int *map, const struct parser_context *ptx, parser_error *err) -{ - yajl_gen_status stat = yajl_gen_status_ok; - yajl_gen g = (yajl_gen) ctx; - size_t len = 0, i = 0; - if (map != NULL) - len = map->len; - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 0); - stat = yajl_gen_map_open ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - for (i = 0; i < len; i++) - { - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) (map->keys[i]), strlen (map->keys[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = map_int (g, map->values[i]); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - stat = yajl_gen_map_close ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 1); - return yajl_gen_status_ok; -} - -void -free_json_map_string_int (json_map_string_int *map) -{ - if (map != NULL) - { - size_t i; - for (i = 0; i < map->len; i++) - { - free (map->keys[i]); - map->keys[i] = NULL; - } - free (map->keys); - map->keys = NULL; - free (map->values); - map->values = NULL; - free (map); - } -} - -define_cleaner_function (json_map_string_int *, free_json_map_string_int) - -json_map_string_int * -make_json_map_string_int (yajl_val src, const struct parser_context *ctx, parser_error *err) -{ - __auto_cleanup (free_json_map_string_int) json_map_string_int *ret = NULL; - size_t i; - size_t len; - - (void) ctx; /* Silence compiler warning. */ - - if (src == NULL || YAJL_GET_OBJECT (src) == NULL) - return NULL; - - len = YAJL_GET_OBJECT_NO_CHECK (src)->len; - ret = calloc (1, sizeof (*ret)); - if (ret == NULL) - { - *(err) = strdup ("error allocating memory"); - return NULL; - } - ret->len = 0; - ret->keys = calloc (len + 1, sizeof (char *)); - if (ret->keys == NULL) - { - *(err) = strdup ("error allocating memory"); - return NULL; - } - ret->values = calloc (len + 1, sizeof (int)); - if (ret->values == NULL) - { - *(err) = strdup ("error allocating memory"); - return NULL; - } - for (i = 0; i < len; i++) - { - const char *srckey = YAJL_GET_OBJECT_NO_CHECK (src)->keys[i]; - yajl_val srcval = YAJL_GET_OBJECT_NO_CHECK (src)->values[i]; - - ret->keys[i] = NULL; - ret->values[i] = 0; - ret->len = i + 1; - - ret->keys[i] = strdup (srckey ? srckey : ""); - if (ret->keys[i] == NULL) - { - *(err) = strdup ("error allocating memory"); - return NULL; - } - - if (srcval != NULL) - { - int invalid; - if (! YAJL_IS_NUMBER (srcval)) - { - if (*err == NULL && asprintf (err, "Invalid value with type 'int' for key '%s'", srckey) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - invalid = common_safe_int (YAJL_GET_NUMBER (srcval), &(ret->values[i])); - if (invalid) - { - if (*err == NULL - && asprintf (err, "Invalid value with type 'int' for key '%s': %s", srckey, strerror (-invalid)) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - } - } - return move_ptr (ret); -} int append_json_map_string_int (json_map_string_int *map, const char *key, int val) @@ -1131,109 +374,7 @@ append_json_map_string_int (json_map_string_int *map, const char *key, int val) return 0; } -yajl_gen_status -gen_json_map_string_int64 (void *ctx, const json_map_string_int64 *map, const struct parser_context *ptx, - parser_error *err) -{ - yajl_gen_status stat = yajl_gen_status_ok; - yajl_gen g = (yajl_gen) ctx; - size_t len = 0, i = 0; - if (map != NULL) - len = map->len; - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 0); - stat = yajl_gen_map_open ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - - for (i = 0; i < len; i++) - { - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) (map->keys[i]), strlen (map->keys[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = map_int (g, map->values[i]); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - stat = yajl_gen_map_close ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 1); - return yajl_gen_status_ok; -} - -void -free_json_map_string_int64 (json_map_string_int64 *map) -{ - if (map != NULL) - { - size_t i; - for (i = 0; i < map->len; i++) - { - free (map->keys[i]); - map->keys[i] = NULL; - } - free (map->keys); - map->keys = NULL; - free (map->values); - map->values = NULL; - free (map); - } -} - -define_cleaner_function (json_map_string_int64 *, free_json_map_string_int64) - -json_map_string_int64 * -make_json_map_string_int64 (yajl_val src, const struct parser_context *ctx, - parser_error *err) -{ - __auto_cleanup (free_json_map_string_int64) json_map_string_int64 *ret = NULL; - - (void) ctx; /* Silence compiler warning. */ - if (src != NULL && YAJL_GET_OBJECT (src) != NULL) - { - size_t i; - size_t len = YAJL_GET_OBJECT (src)->len; - ret = safe_malloc (sizeof (*ret)); - ret->len = len; - ret->keys = safe_malloc ((len + 1) * sizeof (char *)); - ret->values = safe_malloc ((len + 1) * sizeof (int64_t)); - for (i = 0; i < len; i++) - { - const char *srckey = YAJL_GET_OBJECT (src)->keys[i]; - yajl_val srcval = YAJL_GET_OBJECT (src)->values[i]; - ret->keys[i] = safe_strdup (srckey ? srckey : ""); - - if (srcval != NULL) - { - int64_t invalid; - if (! YAJL_IS_NUMBER (srcval)) - { - if (*err == NULL && asprintf (err, "Invalid value with type 'int' for key '%s'", srckey) < 0) - { - *(err) = safe_strdup ("error allocating memory"); - } - return NULL; - } - invalid = common_safe_int64 (YAJL_GET_NUMBER (srcval), &(ret->values[i])); - if (invalid) - { - if (*err == NULL - && asprintf (err, "Invalid value with type 'int' for key '%s': %s", srckey, strerror (-invalid)) - < 0) - { - *(err) = safe_strdup ("error allocating memory"); - } - return NULL; - } - } - } - } - return move_ptr (ret); -} int append_json_map_string_int64 (json_map_string_int64 *map, const char *key, int64_t val) { @@ -1267,123 +408,6 @@ append_json_map_string_int64 (json_map_string_int64 *map, const char *key, int64 return 0; } -yajl_gen_status -gen_json_map_string_bool (void *ctx, const json_map_string_bool *map, const struct parser_context *ptx, - parser_error *err) -{ - yajl_gen_status stat = yajl_gen_status_ok; - yajl_gen g = (yajl_gen) ctx; - size_t len = 0, i = 0; - if (map != NULL) - len = map->len; - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 0); - stat = yajl_gen_map_open ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - for (i = 0; i < len; i++) - { - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) (map->keys[i]), strlen (map->keys[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = yajl_gen_bool ((yajl_gen) g, (int) (map->values[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - } - - stat = yajl_gen_map_close ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 1); - return yajl_gen_status_ok; -} - -void -free_json_map_string_bool (json_map_string_bool *map) -{ - if (map != NULL) - { - size_t i; - for (i = 0; i < map->len; i++) - { - free (map->keys[i]); - map->keys[i] = NULL; - // No need to free value for type bool - } - free (map->keys); - map->keys = NULL; - free (map->values); - map->values = NULL; - free (map); - } -} - -define_cleaner_function (json_map_string_bool *, free_json_map_string_bool) - -json_map_string_bool * -make_json_map_string_bool (yajl_val src, const struct parser_context *ctx, parser_error *err) -{ - __auto_cleanup (free_json_map_string_bool) json_map_string_bool *ret = NULL; - size_t i; - size_t len; - - (void) ctx; /* Silence compiler warning. */ - - len = YAJL_GET_OBJECT_NO_CHECK (src)->len; - - if (src == NULL || YAJL_GET_OBJECT (src) == NULL) - return NULL; - - ret = calloc (1, sizeof (*ret)); - if (ret == NULL) - return NULL; - ret->len = 0; - ret->keys = calloc (len + 1, sizeof (char *)); - if (ret->keys == NULL) - { - return NULL; - } - - ret->values = calloc (len + 1, sizeof (bool)); - if (ret->values == NULL) - { - return NULL; - } - for (i = 0; i < len; i++) - { - const char *srckey = YAJL_GET_OBJECT_NO_CHECK (src)->keys[i]; - yajl_val srcval = YAJL_GET_OBJECT_NO_CHECK (src)->values[i]; - - ret->keys[i] = NULL; - ret->values[i] = NULL; - ret->len = i + 1; - - ret->keys[i] = strdup (srckey ? srckey : ""); - if (ret->keys[i] == NULL) - { - *(err) = strdup ("error allocating memory"); - return NULL; - } - if (srcval != NULL) - { - if (YAJL_IS_TRUE (srcval)) - ret->values[i] = true; - else if (YAJL_IS_FALSE (srcval)) - ret->values[i] = false; - else - { - if (*err == NULL && asprintf (err, "Invalid value with type 'bool' for key '%s'", srckey) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - } - } - return move_ptr (ret); -} - int append_json_map_string_bool (json_map_string_bool *map, const char *key, bool val) { @@ -1433,39 +457,22 @@ append_json_map_string_bool (json_map_string_bool *map, const char *key, bool va return 0; } -yajl_gen_status -gen_json_map_string_string (void *ctx, const json_map_string_string *map, const struct parser_context *ptx, - parser_error *err) +int +gen_json_map_string_string (json_object *root, const json_map_string_string *map, parser_error *err) { - yajl_gen_status stat = yajl_gen_status_ok; - yajl_gen g = (yajl_gen) ctx; + int stat = JSON_GEN_SUCCESS; size_t len = 0, i = 0; if (map != NULL) len = map->len; - - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 0); - - stat = yajl_gen_map_open ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - + for (i = 0; i < len; i++) { - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) (map->keys[i]), strlen (map->keys[i])); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) (map->values[i]), strlen (map->values[i])); - if (yajl_gen_status_ok != stat) + stat = json_object_object_add(root, (const char *)(map->keys[i]), json_object_new_string((const char *)(map->values[i]))); + if (JSON_GEN_SUCCESS != stat) GEN_SET_ERROR_AND_RETURN (stat, err); } - - stat = yajl_gen_map_close ((yajl_gen) g); - if (yajl_gen_status_ok != stat) - GEN_SET_ERROR_AND_RETURN (stat, err); - if (! len && ! (ptx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 1); - return yajl_gen_status_ok; + // printf(">X> \n%s\n", json_object_to_json_string_ext(root, JSON_C_TO_STRING_NOSLASHESCAPE | JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_PRETTY_TAB)); + return JSON_GEN_SUCCESS; } void @@ -1492,18 +499,19 @@ free_json_map_string_string (json_map_string_string *map) define_cleaner_function (json_map_string_string *, free_json_map_string_string) json_map_string_string * -make_json_map_string_string (yajl_val src, const struct parser_context *ctx, +make_json_map_string_string (json_object *src, const struct parser_context *ctx, parser_error *err) { __auto_cleanup (free_json_map_string_string) json_map_string_string *ret = NULL; size_t i; - size_t len; + int len; (void) ctx; /* Silence compiler warning. */ - if (src == NULL || YAJL_GET_OBJECT (src) == NULL) + if (src == NULL) return NULL; - len = YAJL_GET_OBJECT_NO_CHECK (src)->len; + + len = json_object_object_length (src); ret = calloc (1, sizeof (*ret)); if (ret == NULL) @@ -1512,7 +520,7 @@ make_json_map_string_string (yajl_val src, const struct parser_context *ctx, return NULL; } - ret->len = 0; + ret->len = len; ret->keys = calloc (len + 1, sizeof (char *)); if (ret->keys == NULL) @@ -1527,41 +535,42 @@ make_json_map_string_string (yajl_val src, const struct parser_context *ctx, *(err) = strdup ("error allocating memory"); return NULL; } - for (i = 0; i < len; i++) - { - const char *srckey = YAJL_GET_OBJECT_NO_CHECK (src)->keys[i]; - yajl_val srcval = YAJL_GET_OBJECT_NO_CHECK (src)->values[i]; - ret->keys[i] = NULL; - ret->values[i] = NULL; - ret->len = i + 1; + i = 0; + json_object_object_foreach(src, key, value) + { + ret->keys[i] = strdup (key ? key : ""); + if (ret->keys[i] == NULL) + { + return NULL; + } - ret->keys[i] = strdup (srckey ? srckey : ""); - if (ret->keys[i] == NULL) - { - return NULL; - } - if (srcval != NULL) + if (value != NULL) + { + if (! json_object_is_type (value, json_type_string)) + { + if (*err == NULL && asprintf (err, "Invalid value with type 'string' for key '%s'", key) < 0) { - char *str; - if (! YAJL_IS_STRING (srcval)) - { - if (*err == NULL && asprintf (err, "Invalid value with type 'string' for key '%s'", srckey) < 0) - { - *err = strdup ("error allocating memory"); - } - return NULL; - } - - str = YAJL_GET_STRING_NO_CHECK (srcval); - - ret->values[i] = strdup (str ? str : ""); - if (ret->values[i] == NULL) - { - return NULL; - } + *err = strdup ("error allocating memory"); } + return NULL; + } + + const char *str = json_object_get_string(value); + + ret->values[i] = strdup (str ? str : ""); + if (ret->values[i] == NULL) + { + return NULL; + } } + + i++; + } + if (i == 0) { + return NULL; + } + return move_ptr (ret); } @@ -1660,62 +669,80 @@ append_json_map_string_string (json_map_string_string *map, const char *key, con return 0; } -static void -cleanup_yajl_gen (yajl_gen g) -{ - if (! g) - return; - yajl_gen_clear (g); - yajl_gen_free (g); -} -define_cleaner_function (yajl_gen, cleanup_yajl_gen) +/** + * json_object_to_keys_values This function extracts keys and values and stores it in array of keys and values + * Input: json_object + * Output: json_c_object_keys_values * + */ +json_c_object_keys_values *json_object_to_keys_values(json_object *object) { + if (!json_object_is_type(object, json_type_object)) { + // Handle error: Input is not an object + return NULL; + } -char * -json_marshal_string (const char *str, size_t length, const struct parser_context *ctx, parser_error *err) -{ - __auto_cleanup (cleanup_yajl_gen) yajl_gen g = NULL; - struct parser_context tmp_ctx = { 0 }; - const unsigned char *gen_buf = NULL; - char *json_buf = NULL; - size_t gen_len = 0; - yajl_gen_status stat; - - if (str == NULL || err == NULL) - return NULL; + size_t len = json_object_object_length(object); + json_c_object_keys_values *result = malloc(sizeof(json_c_object_keys_values)); + if (!result) { + return NULL; // Handle allocation failure + } - *err = NULL; - if (ctx == NULL) - ctx = (const struct parser_context *) (&tmp_ctx); + result->keys = calloc(len, sizeof(char*)); + result->values = json_object_new_array(); + result->len = len; - if (! json_gen_init (&g, ctx)) - { - *err = strdup ("Json_gen init failed"); - return json_buf; - } - stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *) str, length); - if (yajl_gen_status_ok != stat) - { - if (asprintf (err, "error generating json, errcode: %d", (int) stat) < 0) - *err = strdup ("error allocating memory"); - return json_buf; + if (!result->keys || !result->values) { + free(result->keys); + json_object_put(result->values); + free(result); + return NULL; // Handle allocation failure } - yajl_gen_get_buf (g, &gen_buf, &gen_len); - if (gen_buf == NULL) + + int i = 0; + json_object_object_foreach(object, key, value) { - *err = strdup ("Error to get generated json"); - return json_buf; + result->keys[i] = key; + json_object_array_add(result->values, value); + i++; } - json_buf = calloc (1, gen_len + 1); - if (json_buf == NULL) - { - *err = strdup ("error allocating memory"); - return json_buf; + return result; +} + + +/** + * copy_unmatched_fields We extract all the fields and we match them with the supplied keys if they don't match + * we add it to new json_object + * Input: json_object, const char ** + * Ouput: jsont_t + */ +json_object *copy_unmatched_fields(json_object *src, const char **exclude_keys, int len) { + json_object *dst = json_object_new_object(); + + json_object_object_foreach(src, key, value) { + int match = 0; + for (int i = 0; i < len; i++) { + if (strcmp(key, exclude_keys[i]) == 0) { + match = 1; + break; + } + } + if (match == 0) { + json_object_object_add(dst, key, value); + } } - (void) memcpy (json_buf, gen_buf, gen_len); - json_buf[gen_len] = '\0'; + return dst; +} + +int json_object_update_missing_generic(struct json_object *obj1, struct json_object *obj2) { + + json_object_object_foreach(obj2, key, val) { + struct json_object *p = json_object_object_get(obj1, key); + if (p == NULL) { + json_object_object_add(obj1, key, val); + } + } - return json_buf; + return 0; } diff --git a/src/ocispec/json_common.h b/src/ocispec/json_common.h index 41c73f59..fd253e6c 100644 --- a/src/ocispec/json_common.h +++ b/src/ocispec/json_common.h @@ -6,8 +6,7 @@ #include #include #include -#include -#include +#include #ifdef __cplusplus extern "C" { @@ -35,6 +34,12 @@ extern "C" { // options not to validate utf8 data #define OPT_GEN_NO_VALIDATE_UTF8 0x10 +// Generating json succeded +#define JSON_GEN_SUCCESS 0 + +// Generating json failed +#define JSON_GEN_FAILED -1 + #define define_cleaner_function(type, cleaner) \ static inline void cleaner##_function (type *ptr) \ { \ @@ -79,41 +84,31 @@ struct parser_context FILE *errfile; }; -yajl_gen_status gen_yajl_object_residual (yajl_val obj, yajl_gen g, parser_error *err); - -yajl_gen_status map_uint (void *ctx, long long unsigned int num); - -yajl_gen_status map_int (void *ctx, long long int num); - -bool json_gen_init (yajl_gen *g, const struct parser_context *ctx); - -yajl_val get_val (yajl_val tree, const char *name, yajl_type type); - char *safe_strdup (const char *src); void *safe_malloc (size_t size); -int common_safe_double (const char *numstr, double *converted); +int json_double_to_int (double d, int *converted); -int common_safe_uint8 (const char *numstr, uint8_t *converted); +int json_double_to_int64 (double d, int64_t *converted); -int common_safe_uint16 (const char *numstr, uint16_t *converted); +int json_double_to_int32 (double d, int32_t *converted); -int common_safe_uint32 (const char *numstr, uint32_t *converted); +int json_double_to_int16 (double d, int16_t *converted); -int common_safe_uint64 (const char *numstr, uint64_t *converted); +int json_double_to_int8 (double d, int8_t *converted); -int common_safe_uint (const char *numstr, unsigned int *converted); +int json_double_to_uint (double d, unsigned int *converted); -int common_safe_int8 (const char *numstr, int8_t *converted); +int json_double_to_uint64 (double d, uint64_t *converted); -int common_safe_int16 (const char *numstr, int16_t *converted); +int json_double_to_uint32 (double d, uint32_t *converted); -int common_safe_int32 (const char *numstr, int32_t *converted); +int json_double_to_uint16 (double d, uint16_t *converted); -int common_safe_int64 (const char *numstr, int64_t *converted); +int json_double_to_uint8 (double d, uint8_t *converted); -int common_safe_int (const char *numstr, int *converted); +int json_double_to_double (double d, double *converted); typedef struct { @@ -122,11 +117,7 @@ typedef struct size_t len; } json_map_int_int; -void free_json_map_int_int (json_map_int_int *map); - -json_map_int_int *make_json_map_int_int (yajl_val src, const struct parser_context *ctx, parser_error *err); - -yajl_gen_status gen_json_map_int_int (void *ctx, const json_map_int_int *map, const struct parser_context *ptx, +int gen_json_map_int_int (json_object *root, const json_map_int_int *map, parser_error *err); int append_json_map_int_int (json_map_int_int *map, int key, int val); @@ -138,11 +129,7 @@ typedef struct size_t len; } json_map_int_bool; -void free_json_map_int_bool (json_map_int_bool *map); - -json_map_int_bool *make_json_map_int_bool (yajl_val src, const struct parser_context *ctx, parser_error *err); - -yajl_gen_status gen_json_map_int_bool (void *ctx, const json_map_int_bool *map, const struct parser_context *ptx, +int gen_json_map_int_bool (json_object *root, const json_map_int_bool *map, parser_error *err); int append_json_map_int_bool (json_map_int_bool *map, int key, bool val); @@ -154,11 +141,7 @@ typedef struct size_t len; } json_map_int_string; -void free_json_map_int_string (json_map_int_string *map); - -json_map_int_string *make_json_map_int_string (yajl_val src, const struct parser_context *ctx, parser_error *err); - -yajl_gen_status gen_json_map_int_string (void *ctx, const json_map_int_string *map, const struct parser_context *ptx, +int gen_json_map_int_string (json_object *root, const json_map_int_string *map, parser_error *err); int append_json_map_int_string (json_map_int_string *map, int key, const char *val); @@ -170,11 +153,7 @@ typedef struct size_t len; } json_map_string_int; -void free_json_map_string_int (json_map_string_int *map); - -json_map_string_int *make_json_map_string_int (yajl_val src, const struct parser_context *ctx, parser_error *err); - -yajl_gen_status gen_json_map_string_int (void *ctx, const json_map_string_int *map, const struct parser_context *ptx, +int gen_json_map_string_int (json_object *root, const json_map_string_int *map, parser_error *err); int append_json_map_string_int (json_map_string_int *map, const char *key, int val); @@ -186,10 +165,6 @@ typedef struct size_t len; } json_map_string_bool; -void free_json_map_string_bool (json_map_string_bool *map); - -json_map_string_bool *make_json_map_string_bool (yajl_val src, const struct parser_context *ctx, parser_error *err); - typedef struct { char **keys; @@ -197,16 +172,13 @@ typedef struct size_t len; } json_map_string_int64; -void free_json_map_string_int64 (json_map_string_int64 *map); - -json_map_string_int64 *make_json_map_string_int64 (yajl_val src, const struct parser_context *ctx, parser_error *err); -yajl_gen_status gen_json_map_string_int64 (void *ctx, const json_map_string_int64 *map, - const struct parser_context *ptx, parser_error *err); +int gen_json_map_string_int64 (json_object *root, const json_map_string_int64 *map, + parser_error *err); int append_json_map_string_int64 (json_map_string_int64 *map, const char *key, int64_t val); -yajl_gen_status gen_json_map_string_bool (void *ctx, const json_map_string_bool *map, const struct parser_context *ptx, +int gen_json_map_string_bool (json_object *root, const json_map_string_bool *map, parser_error *err); int append_json_map_string_bool (json_map_string_bool *map, const char *key, bool val); @@ -222,17 +194,35 @@ void free_json_map_string_string (json_map_string_string *map); json_map_string_string *clone_map_string_string (json_map_string_string *src); -json_map_string_string *make_json_map_string_string (yajl_val src, const struct parser_context *ctx, parser_error *err); +json_map_string_string *make_json_map_string_string (json_object *src, const struct parser_context *ctx, parser_error *err); -yajl_gen_status gen_json_map_string_string (void *ctx, const json_map_string_string *map, - const struct parser_context *ptx, parser_error *err); +int gen_json_map_string_string (json_object *root, const json_map_string_string *map, parser_error *err); int append_json_map_string_string (json_map_string_string *map, const char *key, const char *val); char *json_marshal_string (const char *str, size_t length, const struct parser_context *ctx, parser_error *err); +typedef struct +{ + json_object * values; + size_t len; +} jansson_array_values; + +typedef struct +{ + char **keys; + struct json_object *values; + size_t len; +} json_c_object_keys_values; + +json_c_object_keys_values *json_object_to_keys_values(json_object *object); + +struct json_object *copy_unmatched_fields(json_object *src, const char **exclude_keys, int len); + +int json_object_update_missing_generic(struct json_object *obj1, struct json_object *obj2); + #ifdef __cplusplus } #endif -#endif +#endif \ No newline at end of file diff --git a/src/ocispec/sources.py b/src/ocispec/sources.py index d2e7ac15..97052a54 100755 --- a/src/ocispec/sources.py +++ b/src/ocispec/sources.py @@ -36,7 +36,7 @@ def append_c_code(obj, c_file, prefix): Interface: None History: 2019-06-17 """ - parse_json_to_c(obj, c_file, prefix) + parse_json_objecto_c(obj, c_file, prefix) make_c_free(obj, c_file, prefix) get_c_json(obj, c_file, prefix) make_clone(obj, c_file, prefix) @@ -55,12 +55,13 @@ def parse_map_string_obj(obj, c_file, prefix, obj_typename): childname = child.subtypname else: childname = helpers.get_prefixed_name(child.name, prefix) - c_file.append(' if (YAJL_GET_OBJECT (tree) != NULL)\n') + c_file.append(' if (json_object_is_type(tree, json_type_object))\n') c_file.append(' {\n') c_file.append(' size_t i;\n') - c_file.append(' size_t len = YAJL_GET_OBJECT_NO_CHECK (tree)->len;\n') - c_file.append(' const char **keys = YAJL_GET_OBJECT_NO_CHECK (tree)->keys;\n') - c_file.append(' yajl_val *values = YAJL_GET_OBJECT_NO_CHECK (tree)->values;\n') + c_file.append(' int len = json_object_object_length(tree);\n') + c_file.append(' json_c_object_keys_values *kvobj = json_object_to_keys_values(tree);\n') + c_file.append(' const char **keys = (const char **)kvobj->keys;\n') + c_file.append(' json_object *values = kvobj->values;\n') c_file.append(' ret->len = len;\n') c_file.append(' ret->keys = calloc (len + 1, sizeof (*ret->keys));\n') c_file.append(' if (ret->keys == NULL)\n') @@ -70,13 +71,13 @@ def parse_map_string_obj(obj, c_file, prefix, obj_typename): c_file.append(' return NULL;\n') c_file.append(' for (i = 0; i < len; i++)\n') c_file.append(' {\n') - c_file.append(' yajl_val val;\n') + c_file.append(' json_object *jval;\n') c_file.append(' const char *tmpkey = keys[i];\n') c_file.append(' ret->keys[i] = strdup (tmpkey ? tmpkey : "");\n') c_file.append(' if (ret->keys[i] == NULL)\n') c_file.append(" return NULL;\n") - c_file.append(' val = values[i];\n') - c_file.append(f' ret->{child.fixname}[i] = make_{childname} (val, ctx, err);\n') + c_file.append(' jval = json_object_array_get_idx(values, i);\n') + c_file.append(f' ret->{child.fixname}[i] = make_{childname} (jval, ctx, err);\n') c_file.append(f' if (ret->{child.fixname}[i] == NULL)\n') c_file.append(" return NULL;\n") c_file.append(' }\n') @@ -91,81 +92,51 @@ def parse_obj_type_array(obj, c_file, prefix, obj_typename): typename = helpers.get_name_substr(obj.name, prefix) c_file.append(' do\n') c_file.append(' {\n') - c_file.append(f' yajl_val tmp = get_val (tree, "{obj.origname}", yajl_t_array);\n') - c_file.append(' if (tmp != NULL && YAJL_GET_ARRAY (tmp) != NULL)\n') + c_file.append(f' json_object *tmp = json_object_object_get (tree, "{obj.origname}");\n') + c_file.append(' if (tmp != NULL && json_object_is_type(tmp, json_type_array))\n') c_file.append(' {\n') - c_file.append(' size_t i;\n') - c_file.append(' size_t len = YAJL_GET_ARRAY_NO_CHECK (tmp)->len;\n') - c_file.append(' yajl_val *values = YAJL_GET_ARRAY_NO_CHECK (tmp)->values;\n') + c_file.append(' int len = json_object_array_length (tmp);\n') c_file.append(f' ret->{obj.fixname}_len = len;\n') c_file.append(f' ret->{obj.fixname} = calloc (len + 1, sizeof (*ret->{obj.fixname}));\n') c_file.append(f' if (ret->{obj.fixname} == NULL)\n') c_file.append(' return NULL;\n') + c_file.append(' json_object *value;\n') + c_file.append(' size_t i;\n') if obj.doublearray: c_file.append(f' ret->{obj.fixname}_item_lens = calloc ( len + 1, sizeof (size_t));\n') c_file.append(f' if (ret->{obj.fixname}_item_lens == NULL)\n') c_file.append(' return NULL;\n') - c_file.append(' for (i = 0; i < len; i++)\n') + c_file.append(' for(int i = 0; i < len ; i++)\n') c_file.append(' {\n') - c_file.append(' yajl_val val = values[i];\n') + c_file.append(' json_object *value = json_object_array_get_idx(tmp, i);\n') if obj.doublearray: - c_file.append(' size_t j;\n') - c_file.append(f' ret->{obj.fixname}[i] = calloc ( YAJL_GET_ARRAY_NO_CHECK(val)->len + 1, sizeof (**ret->{obj.fixname}));\n') + c_file.append(' size_t rec_len = json_object_array_length(value);\n') + c_file.append(f' ret->{obj.fixname}[i] = calloc ( rec_len + 1, sizeof (**ret->{obj.fixname}));\n') c_file.append(f' if (ret->{obj.fixname}[i] == NULL)\n') c_file.append(' return NULL;\n') - c_file.append(' yajl_val *items = YAJL_GET_ARRAY_NO_CHECK(val)->values;\n') - c_file.append(' for (j = 0; j < YAJL_GET_ARRAY_NO_CHECK(val)->len; j++)\n') + c_file.append(' for(size_t j = 0; j < rec_len ; j++)\n') c_file.append(' {\n') - c_file.append(f' ret->{obj.fixname}[i][j] = make_{typename} (items[j], ctx, err);\n') + c_file.append(' json_object *rec_value = json_object_array_get_idx(value, j);\n') + c_file.append(f' ret->{obj.fixname}[i][j] = make_{typename} (rec_value, ctx, err);\n') c_file.append(f' if (ret->{obj.fixname}[i][j] == NULL)\n') c_file.append(" return NULL;\n") c_file.append(f' ret->{obj.fixname}_item_lens[i] += 1;\n') c_file.append(' };\n') else: - c_file.append(f' ret->{obj.fixname}[i] = make_{typename} (val, ctx, err);\n') + c_file.append(f' ret->{obj.fixname}[i] = make_{typename} (value, ctx, err);\n') c_file.append(f' if (ret->{obj.fixname}[i] == NULL)\n') c_file.append(" return NULL;\n") c_file.append(' }\n') c_file.append(' }\n') c_file.append(' }\n') c_file.append(' while (0);\n') - elif obj.subtyp == 'byte': - c_file.append(' do\n') - c_file.append(' {\n') - c_file.append(f' yajl_val tmp = get_val (tree, "{obj.origname}", yajl_t_string);\n') - c_file.append(' if (tmp != NULL)\n') - c_file.append(' {\n') - if obj.doublearray: - c_file.append(' yajl_val *items = YAJL_GET_ARRAY_NO_CHECK(tmp)->values;\n') - c_file.append(f' ret->{obj.fixname} = calloc ( YAJL_GET_ARRAY_NO_CHECK(tmp)->len + 1, sizeof (*ret->{obj.fixname}));\n') - c_file.append(f' if (ret->{obj.fixname}[i] == NULL)\n') - c_file.append(' return NULL;\n') - c_file.append(' size_t j;\n') - c_file.append(' for (j = 0; j < YAJL_GET_ARRAY_NO_CHECK(tmp)->len; j++)\n') - c_file.append(' {\n') - c_file.append(' char *str = YAJL_GET_STRING (itmes[j]);\n') - c_file.append(f' ret->{obj.fixname}[j] = (uint8_t *)strdup (str ? str : "");\n') - c_file.append(f' if (ret->{obj.fixname}[j] == NULL)\n') - c_file.append(" return NULL;\n") - c_file.append(' };\n') - else: - c_file.append(' char *str = YAJL_GET_STRING (tmp);\n') - c_file.append(f' ret->{obj.fixname} = (uint8_t *)strdup (str ? str : "");\n') - c_file.append(f' if (ret->{obj.fixname} == NULL)\n') - c_file.append(' return NULL;\n') - c_file.append(f' ret->{obj.fixname}_len = str != NULL ? strlen (str) : 0;\n') - c_file.append(' }\n') - c_file.append(' }\n') - c_file.append(' while (0);\n') else: c_file.append(' do\n') c_file.append(' {\n') - c_file.append(f' yajl_val tmp = get_val (tree, "{obj.origname}", yajl_t_array);\n') - c_file.append(' if (tmp != NULL && YAJL_GET_ARRAY (tmp) != NULL)\n') + c_file.append(f' json_object *tmp = json_object_object_get (tree, "{obj.origname}");\n') + c_file.append(' if (tmp != NULL && !json_object_is_type(tmp, json_type_null))\n') c_file.append(' {\n') - c_file.append(' size_t i;\n') - c_file.append(' size_t len = YAJL_GET_ARRAY_NO_CHECK (tmp)->len;\n') - c_file.append(' yajl_val *values = YAJL_GET_ARRAY_NO_CHECK (tmp)->values;\n') + c_file.append(' int len = json_object_array_length(tmp);\n') c_file.append(f' ret->{obj.fixname}_len = len;\n') c_file.append(f' ret->{obj.fixname} = calloc (len + 1, sizeof (*ret->{obj.fixname}));\n') c_file.append(f' if (ret->{obj.fixname} == NULL)\n') @@ -174,22 +145,23 @@ def parse_obj_type_array(obj, c_file, prefix, obj_typename): c_file.append(f' ret->{obj.fixname}_item_lens = calloc ( len + 1, sizeof (size_t));\n') c_file.append(f' if (ret->{obj.fixname}_item_lens == NULL)\n') c_file.append(' return NULL;\n') - c_file.append(' for (i = 0; i < len; i++)\n') + c_file.append(' for(size_t i = 0; i < len; i++)\n') c_file.append(' {\n') + c_file.append(' json_object *value = json_object_array_get_idx(tmp, i);\n') if obj.doublearray: - c_file.append(' yajl_val *items = YAJL_GET_ARRAY_NO_CHECK(values[i])->values;\n') - c_file.append(f' ret->{obj.fixname}[i] = calloc ( YAJL_GET_ARRAY_NO_CHECK(values[i])->len + 1, sizeof (**ret->{obj.fixname}));\n') + c_file.append(' int rec_len = json_object_array_length(value);\n') + c_file.append(f' ret->{obj.fixname}[i] = calloc ( json_object_array_length(value) + 1, sizeof (**ret->{obj.fixname}));\n') c_file.append(f' if (ret->{obj.fixname}[i] == NULL)\n') c_file.append(' return NULL;\n') - c_file.append(' size_t j;\n') - c_file.append(' for (j = 0; j < YAJL_GET_ARRAY_NO_CHECK(values[i])->len; j++)\n') + c_file.append(' for(size_t j = 0; j < rec_len; j++)\n') c_file.append(' {\n') - read_val_generator(c_file, 5, 'items[j]', \ + c_file.append(' json_object *rec_value = json_object_array_get_idx(value, j);\n\n') + read_val_generator(c_file, 5, 'rec_value', \ f"ret->{obj.fixname}[i][j]", obj.subtyp, obj.origname, obj_typename) c_file.append(f' ret->{obj.fixname}_item_lens[i] += 1;\n') c_file.append(' };\n') else: - read_val_generator(c_file, 4, 'values[i]', \ + read_val_generator(c_file, 4, 'value', \ f"ret->{obj.fixname}[i]", obj.subtyp, obj.origname, obj_typename) c_file.append(' }\n') c_file.append(' }\n') @@ -205,35 +177,35 @@ def parse_obj_type(obj, c_file, prefix, obj_typename): if obj.typ == 'string': c_file.append(' do\n') c_file.append(' {\n') - read_val_generator(c_file, 2, f'get_val (tree, "{obj.origname}", yajl_t_string)', \ + read_val_generator(c_file, 2, f'json_object_object_get (tree, "{obj.origname}")', \ f"ret->{obj.fixname}", obj.typ, obj.origname, obj_typename) c_file.append(' }\n') c_file.append(' while (0);\n') elif helpers.judge_data_type(obj.typ): c_file.append(' do\n') c_file.append(' {\n') - read_val_generator(c_file, 2, f'get_val (tree, "{obj.origname}", yajl_t_number)', \ + read_val_generator(c_file, 2, f'json_object_object_get (tree, "{obj.origname}")', \ f"ret->{obj.fixname}", obj.typ, obj.origname, obj_typename) c_file.append(' }\n') c_file.append(' while (0);\n') elif helpers.judge_data_pointer_type(obj.typ): c_file.append(' do\n') c_file.append(' {\n') - read_val_generator(c_file, 2, f'get_val (tree, "{obj.origname}", yajl_t_number)', \ + read_val_generator(c_file, 2, f'json_object_object_get (tree, "{obj.origname}")', \ f"ret->{obj.fixname}", obj.typ, obj.origname, obj_typename) c_file.append(' }\n') c_file.append(' while (0);\n') if obj.typ == 'boolean': c_file.append(' do\n') c_file.append(' {\n') - read_val_generator(c_file, 2, f'get_val (tree, "{obj.origname}", yajl_t_true)', \ + read_val_generator(c_file, 2, f'json_object_object_get (tree, "{obj.origname}")', \ f"ret->{obj.fixname}", obj.typ, obj.origname, obj_typename) c_file.append(' }\n') c_file.append(' while (0);\n') if obj.typ == 'booleanPointer': c_file.append(' do\n') c_file.append(' {\n') - read_val_generator(c_file, 2, f'get_val (tree, "{obj.origname}", yajl_t_true)', \ + read_val_generator(c_file, 2, f'json_object_object_get (tree, "{obj.origname}")', \ f"ret->{obj.fixname}", obj.typ, obj.origname, obj_typename) c_file.append(' }\n') c_file.append(' while (0);\n') @@ -243,7 +215,7 @@ def parse_obj_type(obj, c_file, prefix, obj_typename): else: typename = helpers.get_prefixed_name(obj.name, prefix) c_file.append( - f' ret->{obj.fixname} = make_{typename} (get_val (tree, "{obj.origname}", yajl_t_object), ctx, err);\n') + f' ret->{obj.fixname} = make_{typename} (json_object_object_get (tree, "{obj.origname}"), ctx, err);\n') c_file.append(f" if (ret->{obj.fixname} == NULL && *err != 0)\n") c_file.append(" return NULL;\n") elif obj.typ == 'array': @@ -251,7 +223,7 @@ def parse_obj_type(obj, c_file, prefix, obj_typename): elif helpers.valid_basic_map_name(obj.typ): c_file.append(' do\n') c_file.append(' {\n') - c_file.append(f' yajl_val tmp = get_val (tree, "{obj.origname}", yajl_t_object);\n') + c_file.append(f' json_object *tmp = json_object_object_get (tree, "{obj.origname}");\n') c_file.append(' if (tmp != NULL)\n') c_file.append(' {\n') c_file.append(f' ret->{obj.fixname} = make_{helpers.make_basic_map_name(obj.typ)} (tmp, ctx, err);\n') @@ -293,63 +265,31 @@ def parse_obj_arr_obj(obj, c_file, prefix, obj_typename): if obj.typ == 'object' and obj.children is not None: # O(n^2) complexity, but the objects should not really be big... - condition = "\n && ".join( \ - [f'strcmp (tree->u.object.keys[i], "{i.origname}")' for i in obj.children]) + + condition = ", ".join([f'"{i.origname}"' for i in obj.children]) c_file.append(""" - if (tree->type == yajl_t_object) + if (json_object_is_type(tree, json_type_object)) { - size_t i; - size_t j = 0; - size_t cnt = tree->u.object.len; - yajl_val resi = NULL; - if (ctx->options & OPT_PARSE_FULLKEY) { - resi = calloc (1, sizeof(*tree)); - if (resi == NULL) - return NULL; - - resi->type = yajl_t_object; - resi->u.object.keys = calloc (cnt, sizeof (const char *)); - if (resi->u.object.keys == NULL) - { - yajl_tree_free (resi); - return NULL; - } - resi->u.object.values = calloc (cnt, sizeof (yajl_val)); - if (resi->u.object.values == NULL) - { - yajl_tree_free (resi); + if (tree == NULL) return NULL; - } } + """ + f"int len = {len(obj.children)};\n" + f"const char *excluded[] = {'{'}{condition}{'}'};" + """ + json_object *resi = copy_unmatched_fields(tree, excluded, len); - for (i = 0; i < tree->u.object.len; i++) - {\n""" \ - f" if ({condition})" \ - """{ - if (ctx->options & OPT_PARSE_FULLKEY) - { - resi->u.object.keys[j] = tree->u.object.keys[i]; - tree->u.object.keys[i] = NULL; - resi->u.object.values[j] = tree->u.object.values[i]; - tree->u.object.values[i] = NULL; - resi->u.object.len++; - } - j++; - } - } - - if ((ctx->options & OPT_PARSE_STRICT) && j > 0 && ctx->errfile != NULL) - (void) fprintf (ctx->errfile, "WARNING: unknown key found\\n"); + int resilen = json_object_object_length(resi); - if (ctx->options & OPT_PARSE_FULLKEY) + if (ctx->options & OPT_PARSE_FULLKEY && resi != NULL && resilen > 0) ret->_residual = resi; } """) -def parse_json_to_c(obj, c_file, prefix): +def parse_json_objecto_c(obj, c_file, prefix): """ Description: generate c language for parse json file Interface: None @@ -367,13 +307,15 @@ def parse_json_to_c(obj, c_file, prefix): if objs is None or obj.subtypname: return c_file.append(f"define_cleaner_function ({typename} *, free_{typename})\n") - c_file.append(f"{typename} *\nmake_{typename} (yajl_val tree, const struct parser_context *ctx, parser_error *err)\n") + c_file.append(f"{typename} *\nmake_{typename} (json_object *tree, const struct parser_context *ctx, parser_error *err)\n") c_file.append("{\n") c_file.append(f" __auto_cleanup(free_{typename}) {typename} *ret = NULL;\n") c_file.append(" *err = NULL;\n") c_file.append(" (void) ctx; /* Silence compiler warning. */\n") c_file.append(" if (tree == NULL)\n") c_file.append(" return NULL;\n") + c_file.append(" if (json_object_is_type(tree, json_type_null))\n") + c_file.append(" return NULL;\n") c_file.append(" ret = calloc (1, sizeof (*ret));\n") c_file.append(" if (ret == NULL)\n") c_file.append(" return NULL;\n") @@ -403,30 +345,20 @@ def get_map_string_obj(obj, c_file, prefix): c_file.append(' size_t len = 0, i;\n') c_file.append(" if (ptr != NULL)\n") c_file.append(" len = ptr->len;\n") - c_file.append(" if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") - c_file.append(' yajl_gen_config (g, yajl_gen_beautify, 0);\n') - c_file.append(" stat = yajl_gen_map_open ((yajl_gen) g);\n") - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(f' if (len || (ptr != NULL && ptr->keys != NULL && ptr->{child.fixname} != NULL))\n') c_file.append(' {\n') c_file.append(' for (i = 0; i < len; i++)\n') c_file.append(' {\n') - c_file.append(' char *str = ptr->keys[i] ? ptr->keys[i] : "";\n') - c_file.append(' stat = yajl_gen_string ((yajl_gen) g, \ -(const unsigned char *)str, strlen (str));\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(' json_object *subroot = json_object_new_object();\n') + c_file.append(f' stat = gen_{childname} (subroot, ptr->{child.fixname}[i], err);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(f' stat = gen_{childname} (g, ptr->{child.fixname}[i], ctx, err);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(' char *str = ptr->keys[i] ? ptr->keys[i] : "";\n') + c_file.append(' stat = json_object_object_add (root, (const char *)str, subroot);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(' }\n') c_file.append(' }\n') - c_file.append(" stat = yajl_gen_map_close ((yajl_gen) g);\n") - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(" if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") - c_file.append(' yajl_gen_config (g, yajl_gen_beautify, 1);\n') def get_obj_arr_obj_array(obj, c_file, prefix): if obj.subtypobj or obj.subtyp == 'object': @@ -435,57 +367,47 @@ def get_obj_arr_obj_array(obj, c_file, prefix): typename = obj.subtypname else: typename = helpers.get_name_substr(obj.name, prefix) - c_file.append(f' if ((ctx->options & OPT_GEN_KEY_VALUE) || (ptr != NULL && ptr->{obj.fixname} != NULL))\n') + c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL)\n') c_file.append(' {\n') c_file.append(' size_t len = 0, i;\n') - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *)("{obj.origname}"), {int(l)} /* strlen ("{obj.origname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(f" if (ptr != NULL && ptr->{obj.fixname} != NULL)\n") - c_file.append(f" len = ptr->{obj.fixname}_len;\n") - c_file.append(" if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") - c_file.append(' yajl_gen_config (g, yajl_gen_beautify, 0);\n') - c_file.append(' stat = yajl_gen_array_open ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(f" len = ptr->{obj.fixname}_len;//{obj.subtypobj}\n") + c_file.append(f' json_object *subroot = json_object_new_array();\n') c_file.append(' for (i = 0; i < len; i++)\n') c_file.append(' {\n') if obj.doublearray: - c_file.append(' stat = yajl_gen_array_open ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(' json_object *subsubroot = json_object_new_array();\n') c_file.append(" size_t j;\n") c_file.append(f' for (j = 0; j < ptr->{obj.fixname}_item_lens[i]; j++)\n') c_file.append(' {\n') - c_file.append(f' stat = gen_{typename} (g, ptr->{obj.fixname}[i][j], ctx, err);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(' json_object *subobj = json_object_new_object();\n') + c_file.append(f' stat = gen_{typename} (subobj, ptr->{obj.fixname}[i][j], err);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(" stat = json_object_array_add (subsubroot, subobj);\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(' }\n') - c_file.append(' stat = yajl_gen_array_close ((yajl_gen) g);\n') + c_file.append(' stat = json_object_array_add (subroot, subsubroot);\n') else: - c_file.append(f' stat = gen_{typename} (g, ptr->{obj.fixname}[i], ctx, err);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(f' json_object *obj = json_object_new_object();\n') + c_file.append(f' stat = gen_{typename} (obj, ptr->{obj.fixname}[i], err);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(" stat = json_object_array_add (subroot, obj);\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(' }\n') - c_file.append(' stat = yajl_gen_array_close ((yajl_gen) g);\n') - c_file.append(" if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") - c_file.append(' yajl_gen_config (g, yajl_gen_beautify, 1);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(f' stat = json_object_object_add(root, (const char *)("{obj.origname}"), subroot);\n') c_file.append(' }\n') elif obj.subtyp == 'byte': l = len(obj.origname) - c_file.append(f' if ((ctx->options & OPT_GEN_KEY_VALUE) || (ptr != NULL && ptr->{obj.fixname} != NULL && ptr->{obj.fixname}_len))\n') + c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL && ptr->{obj.fixname}_len)\n') c_file.append(' {\n') c_file.append(' const char *str = "";\n') c_file.append(' size_t len = 0;\n') - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *)("{obj.origname}"), {l} /* strlen ("{obj.origname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") if obj.doublearray: - c_file.append(' stat = yajl_gen_array_open ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(' json_object *subroot = json_object_new_array();\n') c_file.append(" {\n") c_file.append(" size_t i;\n") c_file.append(f" for (i = 0; i < ptr->{obj.fixname}_len; i++)\n") @@ -494,61 +416,46 @@ def get_obj_arr_obj_array(obj, c_file, prefix): c_file.append(f" str = (const char *)ptr->{obj.fixname}[i];\n") c_file.append(" else ()\n") c_file.append(" str = "";\n") - c_file.append(' stat = yajl_gen_string ((yajl_gen) g, \ - (const unsigned char *)str, strlen(str));\n') + c_file.append(' stat = json_object_array_add (subroot, json_object_new_string((const char *)str));\n') c_file.append(" }\n") c_file.append(" }\n") - c_file.append(' stat = yajl_gen_array_close ((yajl_gen) g);\n') + c_file.append(f' stat = json_object_object_add (root, (const char *)("{obj.origname}"), subroot);\n') else: c_file.append(f" if (ptr != NULL && ptr->{obj.fixname} != NULL)\n") c_file.append(" {\n") c_file.append(f" str = (const char *)ptr->{obj.fixname};\n") c_file.append(f" len = ptr->{obj.fixname}_len;\n") c_file.append(" }\n") - c_file.append(' stat = yajl_gen_string ((yajl_gen) g, \ - (const unsigned char *)str, len);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(f' stat = json_object_object_add (root, (const char *)("{obj.origname}"), json_object_new_string((const char *)str));\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(" }\n") else: - l = len(obj.origname) - c_file.append(f' if ((ctx->options & OPT_GEN_KEY_VALUE) || (ptr != NULL && ptr->{obj.fixname} != NULL))\n') + c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL)\n') c_file.append(' {\n') c_file.append(' size_t len = 0, i;\n') - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *)("{obj.origname}"), {l} /* strlen ("{obj.origname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(' json_object *subroot = json_object_new_array();\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(f" if (ptr != NULL && ptr->{obj.fixname} != NULL)\n") c_file.append(f" len = ptr->{obj.fixname}_len;\n") - c_file.append(" if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") - c_file.append(' yajl_gen_config (g, yajl_gen_beautify, 0);\n') - c_file.append(' stat = yajl_gen_array_open ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(' for (i = 0; i < len; i++)\n') c_file.append(' {\n') if obj.doublearray: typename = helpers.get_map_c_types(obj.subtyp) - c_file.append(' stat = yajl_gen_array_open ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(' json_object *subsubroot = json_object_new_array();\n') c_file.append(" size_t j;\n") c_file.append(f' for (j = 0; j < ptr->{obj.fixname}_item_lens[i]; j++)\n') c_file.append(' {\n') - json_value_generator(c_file, 4, f"ptr->{obj.fixname}[i][j]", 'g', 'ctx', obj.subtyp) + json_value_generator(c_file, 4, f"ptr->{obj.fixname}[i][j]", 'subsubroot', obj.subtyp) c_file.append(' }\n') - c_file.append(' stat = yajl_gen_array_close ((yajl_gen) g);\n') + c_file.append(' stat = json_object_array_add (subroot, subsubroot);\n') else: - json_value_generator(c_file, 3, f"ptr->{obj.fixname}[i]", 'g', 'ctx', obj.subtyp) - + json_value_generator(c_file, 3, f"ptr->{obj.fixname}[i]", 'subroot', obj.subtyp) c_file.append(' }\n') - c_file.append(' stat = yajl_gen_array_close ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(" if (!len && !(ctx->options & OPT_GEN_SIMPLIFY))\n") - c_file.append(' yajl_gen_config (g, yajl_gen_beautify, 1);\n') - c_file.append(' }\n') + c_file.append(f' stat = json_object_object_add(root, (const char *)("{obj.origname}"), subroot);\n') + c_file.append(' }\n') def get_obj_arr_obj(obj, c_file, prefix): """ @@ -558,64 +465,42 @@ def get_obj_arr_obj(obj, c_file, prefix): """ if obj.typ == 'string': l = len(obj.origname) - c_file.append(f' if ((ctx->options & OPT_GEN_KEY_VALUE) || (ptr != NULL && ptr->{obj.fixname} != NULL))\n' ) + c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL)\n' ) c_file.append(' {\n') - c_file.append(' char *str = "";\n') - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *)("{obj.origname}"), {l} /* strlen ("{obj.origname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(f' stat = json_object_object_add(root, (const char *)("{obj.origname}"), json_object_new_string(ptr->{obj.fixname}));\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(f" if (ptr != NULL && ptr->{obj.fixname} != NULL)\n") - c_file.append(f" str = ptr->{obj.fixname};\n") - json_value_generator(c_file, 2, "str", 'g', 'ctx', obj.typ) c_file.append(" }\n") elif helpers.judge_data_type(obj.typ): - c_file.append(f' if ((ctx->options & OPT_GEN_KEY_VALUE) || (ptr != NULL && ptr->{obj.fixname}_present))\n') + c_file.append(f' if (ptr != NULL && ptr->{obj.fixname}_present)\n') c_file.append(' {\n') + json_conv = 'json_real' if obj.typ == 'double': numtyp = 'double' - elif obj.typ.startswith("uint") or obj.typ == 'GID' or obj.typ == 'UID': - numtyp = 'long long unsigned int' + elif obj.typ.startswith("int") : + numtyp = 'int64_t' + json_conv = 'json_object_new_int64' else: - numtyp = 'long long int' + numtyp = 'uint64_t' + json_conv = 'json_object_new_uint64' l = len(obj.origname) - c_file.append(f' {numtyp} num = 0;\n') - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *)("{obj.origname}"), {l} /* strlen ("{obj.origname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(f" if (ptr != NULL && ptr->{obj.fixname})\n") + c_file.append(f' {numtyp} num = 0;\n') + c_file.append(f" if (ptr != NULL && ptr->{obj.fixname})\n") c_file.append(f" num = ({numtyp})ptr->{obj.fixname};\n") - json_value_generator(c_file, 2, "num", 'g', 'ctx', obj.typ) - c_file.append(" }\n") - elif helpers.judge_data_pointer_type(obj.typ): - c_file.append(f' if ((ptr != NULL && ptr->{obj.fixname} != NULL))\n') - c_file.append(' {\n') - numtyp = helpers.obtain_data_pointer_type(obj.typ) - if numtyp == "": - return - l = len(obj.origname) - c_file.append(f' {helpers.get_map_c_types(numtyp)} num = 0;\n') - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, \ -(const unsigned char *)("{obj.origname}"), {l} /* strlen ("{obj.origname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(f' stat = json_object_object_add(root, (const char *)("{obj.origname}"), {json_conv}(num));\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(f" if (ptr != NULL && ptr->{obj.fixname} != NULL)\n") - c_file.append(" {\n") - c_file.append(f" num = ({helpers.get_map_c_types(numtyp)})*(ptr->{obj.fixname});\n") - c_file.append(" }\n") - json_value_generator(c_file, 2, "num", 'g', 'ctx', numtyp) c_file.append(" }\n") elif obj.typ == 'boolean': - c_file.append(f' if ((ctx->options & OPT_GEN_KEY_VALUE) || (ptr != NULL && ptr->{obj.fixname}_present))\n') + c_file.append(f' if (ptr != NULL && ptr->{obj.fixname}_present)\n') c_file.append(' {\n') c_file.append(' bool b = false;\n') - l = len(obj.origname) - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *)("{obj.origname}"), {l} /* strlen ("{obj.origname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(f" if (ptr != NULL && ptr->{obj.fixname})\n") + c_file.append(f" b = ptr->{obj.fixname};\n") + c_file.append(f' stat = json_object_object_add(root, (const char *)("{obj.origname}"), json_object_new_boolean(b));\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(f" if (ptr != NULL && ptr->{obj.fixname})\n") - c_file.append(f" b = ptr->{obj.fixname};\n") c_file.append(" \n") - json_value_generator(c_file, 2, "b", 'g', 'ctx', obj.typ) c_file.append(" }\n") elif obj.typ == 'object' or obj.typ == 'mapStringObject': l = len(obj.origname) @@ -623,26 +508,28 @@ def get_obj_arr_obj(obj, c_file, prefix): typename = obj.subtypname else: typename = helpers.get_prefixed_name(obj.name, prefix) - c_file.append(f' if ((ctx->options & OPT_GEN_KEY_VALUE) || (ptr != NULL && ptr->{obj.fixname} != NULL))\n') + c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL)\n') c_file.append(" {\n") - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *)("{obj.origname}"), {l} /* strlen ("{obj.origname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(' json_object *subroot = json_object_new_object();\n') + c_file.append(f' stat = gen_{typename} (subroot, ptr != NULL ? ptr->{obj.fixname} : NULL, err);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(f' stat = gen_{typename} (g, ptr != NULL ? ptr->{obj.fixname} : NULL, ctx, err);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(f' stat = json_object_object_add(root, (const char *)("{obj.origname}"), subroot);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(" }\n") elif obj.typ == 'array': get_obj_arr_obj_array(obj, c_file, prefix) elif helpers.valid_basic_map_name(obj.typ): l = len(obj.origname) - c_file.append(f' if ((ctx->options & OPT_GEN_KEY_VALUE) || (ptr != NULL && ptr->{obj.fixname} != NULL))\n') + c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL)\n') c_file.append(' {\n') - c_file.append(f' stat = yajl_gen_string ((yajl_gen) g, (const unsigned char *)("{obj.fixname}"), {l} /* strlen ("{obj.fixname}") */);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(' json_object *subroot = json_object_new_object();\n') + c_file.append(f' stat = gen_{helpers.make_basic_map_name(obj.typ)} (subroot, ptr ? ptr->{obj.fixname} : NULL, err);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - c_file.append(f' stat = gen_{helpers.make_basic_map_name(obj.typ)} (g, ptr ? ptr->{obj.fixname} : NULL, ctx, err);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(f' stat = json_object_object_add(root, (const char *)("{obj.fixname}"), subroot);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(" }\n") @@ -663,40 +550,30 @@ def get_c_json(obj, c_file, prefix): if objs is None: return c_file.append( - f"yajl_gen_status\ngen_{typename} (yajl_gen g, const {typename} *ptr, const struct parser_context " \ - "*ctx, parser_error *err)\n") + f"int\ngen_{typename} (json_object *root, const {typename} *ptr, " \ + "parser_error *err)\n") c_file.append("{\n") - c_file.append(" yajl_gen_status stat = yajl_gen_status_ok;\n") + c_file.append(" int stat = JSON_GEN_SUCCESS;\n") + c_file.append(" /* Handle cases where root is not used within body of function */\n") + c_file.append(" if (json_object_is_type(root, json_type_null))\n") + c_file.append(" return stat;\n") c_file.append(" *err = NULL;\n") c_file.append(" (void) ptr; /* Silence compiler warning. */\n") if obj.typ == 'mapStringObject': get_map_string_obj(obj, c_file, prefix) elif obj.typ == 'object' or (obj.typ == 'array' and obj.subtypobj): nodes = obj.children if obj.typ == 'object' else obj.subtypobj - if nodes is None: - c_file.append(' if (!(ctx->options & OPT_GEN_SIMPLIFY))\n') - c_file.append(' yajl_gen_config (g, yajl_gen_beautify, 0);\n') - - c_file.append(" stat = yajl_gen_map_open ((yajl_gen) g);\n") - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") for i in nodes or []: get_obj_arr_obj(i, c_file, prefix) if obj.typ == 'object': if obj.children is not None: c_file.append(" if (ptr != NULL && ptr->_residual != NULL)\n") c_file.append(" {\n") - c_file.append(" stat = gen_yajl_object_residual (ptr->_residual, g, err);\n") - c_file.append(" if (yajl_gen_status_ok != stat)\n") + c_file.append(" stat = json_object_update_missing_generic(root, ptr->_residual);\n") + c_file.append(" if (JSON_GEN_SUCCESS != stat)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(" }\n") - c_file.append(" stat = yajl_gen_map_close ((yajl_gen) g);\n") - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") - if nodes is None: - c_file.append(' if (!(ctx->options & OPT_GEN_SIMPLIFY))\n') - c_file.append(' yajl_gen_config (g, yajl_gen_beautify, 1);\n') - c_file.append(' return yajl_gen_status_ok;\n') + c_file.append(' return JSON_GEN_SUCCESS;\n') c_file.append("}\n\n") @@ -707,7 +584,7 @@ def read_val_generator(c_file, level, src, dest, typ, keyname, obj_typename): History: 2019-06-17 """ if helpers.valid_basic_map_name(typ): - c_file.append(f"{' ' * level}yajl_val val = {src};\n") + c_file.append(f"{' ' * level}json_object *val = {src};\n") c_file.append(f"{' ' * level}if (val != NULL)\n") c_file.append(f'{" " * level} {{\n') c_file.append(f'{" " * (level + 1)}{dest} = make_{helpers.make_basic_map_name(typ)} (val, ctx, err);\n') @@ -722,49 +599,40 @@ def read_val_generator(c_file, level, src, dest, typ, keyname, obj_typename): c_file.append(f'{" " * (level + 1)} }}\n') c_file.append(f'{" " * (level)}}}\n') elif typ == 'string': - c_file.append(f"{' ' * level}yajl_val val = {src};\n") + c_file.append(f"{' ' * level}json_object *val = {src};\n") c_file.append(f"{' ' * level}if (val != NULL)\n") c_file.append(f"{' ' * (level)} {{\n") - c_file.append(f"{' ' * (level + 1)}char *str = YAJL_GET_STRING (val);\n") + c_file.append(f"{' ' * (level + 1)}const char *str = json_object_get_string (val);\n") c_file.append(f"{' ' * (level + 1)}{dest} = strdup (str ? str : \"\");\n") c_file.append(f"{' ' * (level + 1)}if ({dest} == NULL)\n") c_file.append(f"{' ' * (level + 1)} return NULL;\n") c_file.append(f'{" " * level} }}\n') elif helpers.judge_data_type(typ): - c_file.append(f"{' ' * level}yajl_val val = {src};\n") + c_file.append(f"{' ' * level}json_object *val = {src};\n") c_file.append(f"{' ' * level}if (val != NULL)\n") c_file.append(f'{" " * (level)} {{\n') - if typ.startswith("uint") or \ - (typ.startswith("int") and typ != "integer") or typ == "double": - c_file.append(f"{' ' * (level + 1)}int invalid;\n") - c_file.append(f"{' ' * (level + 1)}if (! YAJL_IS_NUMBER (val))\n") + if typ == "double": + c_file.append(f"{' ' * (level + 1)}if (!json_object_is_type (val, json_type_double))\n") c_file.append(f'{" " * (level + 1)} {{\n') - c_file.append(f"{' ' * (level + 1)} *err = strdup (\"invalid type\");\n") + c_file.append(f"{' ' * (level + 1)} *err = strdup (\"invalid type\");//{typ}\n") c_file.append(f"{' ' * (level + 1)} return NULL;\n") c_file.append(f'{" " * (level + 1)} }}\n') - c_file.append(f'{" " * (level + 1)}invalid = common_safe_{typ} (YAJL_GET_NUMBER (val), &{dest});\n') - elif typ == "integer": - c_file.append(f"{' ' * (level + 1)}int invalid;\n") - c_file.append(f"{' ' * (level + 1)}if (! YAJL_IS_NUMBER (val))\n") + c_file.append(f'{" " * (level + 1)}{dest} = json_object_get_double(val);\n') + elif typ.startswith("int") or typ == "integer": + c_file.append(f"{' ' * (level + 1)}if (!json_object_is_type (val, json_type_int))\n") c_file.append(f'{" " * (level + 1)} {{\n') - c_file.append(f"{' ' * (level + 1)} *err = strdup (\"invalid type\");\n") + c_file.append(f"{' ' * (level + 1)} *err = strdup (\"invalid type\");//{typ}\n") c_file.append(f"{' ' * (level + 1)} return NULL;\n") c_file.append(f'{" " * (level + 1)} }}\n') - c_file.append(f'{" " * (level + 1)}invalid = common_safe_int (YAJL_GET_NUMBER (val), (int *)&{dest});\n') - elif typ == "UID" or typ == "GID": - c_file.append(f"{' ' * (level + 1)}int invalid;\n") - c_file.append(f"{' ' * (level + 1)}if (! YAJL_IS_NUMBER (val))\n") + c_file.append(f'{" " * (level + 1)}{dest} = json_object_get_int64(val);\n') + elif typ == "UID" or typ == "GID" or typ.startswith("uint"): + c_file.append(f"{' ' * (level + 1)}if (!json_object_is_type (val, json_type_int))\n") c_file.append(f'{" " * (level + 1)} {{\n') - c_file.append(f"{' ' * (level + 1)} *err = strdup (\"invalid type\");\n") + c_file.append(f"{' ' * (level + 1)} *err = strdup (\"invalid type\");//{typ}\n") c_file.append(f"{' ' * (level + 1)} return NULL;\n") c_file.append(f'{" " * (level + 1)} }}\n') - c_file.append(f'{" " * (level + 1)}invalid = common_safe_uint (YAJL_GET_NUMBER (val), (unsigned int *)&{dest});\n') - c_file.append(f"{' ' * (level + 1)}if (invalid)\n") - c_file.append(f'{" " * (level + 1)} {{\n') - c_file.append(f'{" " * (level + 1)} if (asprintf (err, "Invalid value \'%s\' with type \'{typ}\' for key \'{keyname}\': %s", YAJL_GET_NUMBER (val), strerror (-invalid)) < 0)\n') - c_file.append(f'{" " * (level + 1)} *err = strdup ("error allocating memory");\n') - c_file.append(f"{' ' * (level + 1)} return NULL;\n") - c_file.append(f'{" " * (level + 1)}}}\n') + c_file.append(f'{" " * (level + 1)}{dest} = json_object_get_uint64(val);\n') + # c_file.append(f'{" " * (level + 1)}}}\n') if '[' not in dest: c_file.append(f"{' ' * (level + 1)}{dest}_present = 1;\n") c_file.append(f'{" " * (level)}}}\n') @@ -772,38 +640,36 @@ def read_val_generator(c_file, level, src, dest, typ, keyname, obj_typename): num_type = helpers.obtain_data_pointer_type(typ) if num_type == "": return - c_file.append(f"{' ' * level}yajl_val val = {src};\n") + c_file.append(f"{' ' * level}const json_object *val = {src};\n") c_file.append(f"{' ' * level}if (val != NULL)\n") c_file.append(f'{" " * (level)} {{\n') c_file.append(f'{" " * (level + 1)}{dest} = calloc (1, sizeof ({helpers.get_map_c_types(num_type)}));\n') c_file.append(f"{' ' * (level + 1)}if ({dest} == NULL)\n") c_file.append(f"{' ' * (level + 1)} return NULL;\n") c_file.append(f"{' ' * (level + 1)}int invalid;\n") - c_file.append(f"{' ' * (level + 1)}if (! YAJL_IS_NUMBER (val))\n") + c_file.append(f"{' ' * (level + 1)}if (! json_is_number (val))\n") c_file.append(f'{" " * (level + 1)} {{\n') c_file.append(f"{' ' * (level + 1)} *err = strdup (\"invalid type\");\n") c_file.append(f"{' ' * (level + 1)} return NULL;\n") c_file.append(f'{" " * (level + 1)}}}\n') - c_file.append(f'{" " * (level + 1)}sinvalid = common_safe_{num_type} (YAJL_GET_NUMBER (val), {dest});\n') + c_file.append(f'{" " * (level + 1)}sinvalid = json_double_to_{num_type} (json_number_value(val), {dest});\n') c_file.append(f"{' ' * (level + 1)}if (invalid)\n") c_file.append(f'{" " * (level + 1)} {{\n') - c_file.append(f'{" " * (level + 1)} if (asprintf (err, "Invalid value \'%s\' with type \'{typ}\' ' \ - f'for key \'{keyname}\': %s", YAJL_GET_NUMBER (val), strerror (-invalid)) < 0)\n') c_file.append(f'{" " * (level + 1)} *err = strdup ("error allocating memory");\n') c_file.append(f"{' ' * (level + 1)} return NULL;\n") c_file.append(f'{" " * (level + 1)}}}\n') c_file.append(f'{" " * (level)}}}\n') elif typ == 'boolean': - c_file.append(f"{' ' * level}yajl_val val = {src};\n") + c_file.append(f"{' ' * level}json_object *val = {src};\n") c_file.append(f"{' ' * level}if (val != NULL)\n") c_file.append(f'{" " * (level)} {{\n') - c_file.append(f"{' ' * (level + 1)}{dest} = YAJL_IS_TRUE(val);\n") + c_file.append(f"{' ' * (level + 1)}{dest} = json_object_get_boolean(val);\n") if '[' not in dest: c_file.append(f"{' ' * (level + 1)}{dest}_present = 1;\n") c_file.append(f'{" " * (level)} }}\n') c_file.append(f"{' ' * level}else\n") c_file.append(f'{" " * (level)} {{\n') - c_file.append(f"{' ' * (level + 1)}val = {src.replace('yajl_t_true', 'yajl_t_false')};\n") + c_file.append(f"{' ' * (level + 1)}val = {src};\n") c_file.append(f"{' ' * (level + 1)}if (val != NULL)\n") c_file.append(f'{" " * (level+1)} {{\n') c_file.append(f"{' ' * (level + 2)}{dest} = 0;\n") @@ -811,23 +677,23 @@ def read_val_generator(c_file, level, src, dest, typ, keyname, obj_typename): c_file.append(f'{" " * (level+1)} }}\n') c_file.append(f'{" " * (level)} }}\n') elif typ == 'booleanPointer': - c_file.append(f"{' ' * level}yajl_val val = {src};\n") + c_file.append(f"{' ' * level}json_object *val = {src};\n") c_file.append(f"{' ' * level}if (val != NULL)\n") c_file.append(f'{" " * (level)} {{\n') c_file.append(f"{' ' * (level + 1)}{dest} = calloc (1, sizeof (bool));\n") c_file.append(f"{' ' * (level + 1)}if ({dest} == NULL)\n") c_file.append(f"{' ' * (level + 1)} return NULL;\n") - c_file.append(f"{' ' * (level + 1)}*({dest}) = YAJL_IS_TRUE(val);\n") + c_file.append(f"{' ' * (level + 1)}*({dest}) = json_object_get_boolean(val);\n") c_file.append(f'{" " * (level)} }}\n') c_file.append(f"{' ' * level}else\n") c_file.append(f'{" " * (level)} {{\n') - c_file.append(f'{" " * (level + 1)}val = get_val (tree, "{keyname}", yajl_t_false);\n') + c_file.append(f'{" " * (level + 1)}val = json_object_object_get (tree, "{keyname}");\n') c_file.append(f"{' ' * (level + 1)}if (val != NULL)\n") c_file.append(f'{" " * (level + 1)} {{\n') c_file.append(f"{' ' * (level + 2)}{dest} = calloc (1, sizeof (bool));\n") c_file.append(f"{' ' * (level + 2)}if ({dest} == NULL)\n") c_file.append(f"{' ' * (level + 2)} return NULL;\n") - c_file.append(f"{' ' * (level + 2)}*({dest}) = YAJL_IS_TRUE(val);\n") + c_file.append(f"{' ' * (level + 2)}*({dest}) = json_object_get_boolean(val);\n") c_file.append(f'{" " * (level + 1)}}}\n') c_file.append(f'{" " * (level)}}}\n') @@ -976,32 +842,32 @@ def make_clone(obj, c_file, prefix): c_file.append("}\n\n") -def json_value_generator(c_file, level, src, dst, ptx, typ): +def json_value_generator(c_file, level, src, dst, typ): """ Description: json value generateor Interface: None History: 2019-06-17 """ if helpers.valid_basic_map_name(typ): - c_file.append(f'{" " * (level)}stat = gen_{helpers.make_basic_map_name(typ)} ({dst}, {src}, {ptx}, err);\n') - c_file.append(f"{' ' * level}if (stat != yajl_gen_status_ok)\n") + c_file.append(f'{" " * (level)}stat = gen_{helpers.make_basic_map_name(typ)} ({dst}, {src}, err);\n') + c_file.append(f"{' ' * level}if (stat != JSON_GEN_SUCCESS)\n") c_file.append(f"{' ' * (level + 1)}GEN_SET_ERROR_AND_RETURN (stat, err);\n") elif typ == 'string': - c_file.append(f'{" " * (level)}stat = yajl_gen_string ((yajl_gen){dst}, (const unsigned char *)({src}), strlen ({src}));\n') - c_file.append(f"{' ' * level}if (stat != yajl_gen_status_ok)\n") + c_file.append(f'{" " * (level)}stat = json_object_array_add ({dst}, json_object_new_string({src}));\n') + c_file.append(f"{' ' * level}if (stat != JSON_GEN_SUCCESS)\n") c_file.append(f"{' ' * (level + 1)}GEN_SET_ERROR_AND_RETURN (stat, err);\n") elif helpers.judge_data_type(typ): if typ == 'double': - c_file.append(f'{" " * (level)}stat = yajl_gen_double ((yajl_gen){dst}, {src});\n') + c_file.append(f'{" " * (level)}stat = json_object_array_add ({dst}, json_object_new_double({src}));\n') elif typ.startswith("uint") or typ == 'GID' or typ == 'UID': - c_file.append(f"{' ' * level}stat = map_uint ({dst}, {src});\n") + c_file.append(f"{' ' * level}stat = json_object_array_add ({dst}, json_object_new_uint64({src}));\n") else: - c_file.append(f"{' ' * level}stat = map_int ({dst}, {src});\n") - c_file.append(f"{' ' * level}if (stat != yajl_gen_status_ok)\n") + c_file.append(f"{' ' * level}stat = json_object_array_add ({dst}, json_object_new_int64({src}));\n") + c_file.append(f"{' ' * level}if (stat != JSON_GEN_SUCCESS)\n") c_file.append(f"{' ' * (level + 1)}GEN_SET_ERROR_AND_RETURN (stat, err);\n") elif typ == 'boolean': - c_file.append(f'{" " * (level)}stat = yajl_gen_bool ((yajl_gen){dst}, (int)({src}));\n') - c_file.append(f"{' ' * level}if (stat != yajl_gen_status_ok)\n") + c_file.append(f'{" " * (level)}stat = json_object_array_add ({dst}, json_object_new_boolean({src}));\n') + c_file.append(f"{' ' * level}if (stat != JSON_GEN_SUCCESS)\n") c_file.append(f"{' ' * (level + 1)}GEN_SET_ERROR_AND_RETURN (stat, err);\n") def make_c_array_free (i, c_file, prefix): @@ -1142,7 +1008,7 @@ def make_c_free (obj, c_file, prefix): c_file.append(" }\n") if obj.typ == 'object': if obj.children is not None: - c_file.append(" yajl_tree_free (ptr->_residual);\n") + c_file.append(" json_object_put (ptr->_residual);\n") c_file.append(" ptr->_residual = NULL;\n") c_file.append(" free (ptr);\n") c_file.append("}\n\n") @@ -1215,8 +1081,6 @@ def src_reflect(structs, schema_info, c_file, root_typ): c_file.append('#include \n') c_file.append('#include \n') c_file.append(f'#include "ocispec/{schema_info.header.basename}"\n\n') - c_file.append('#define YAJL_GET_ARRAY_NO_CHECK(v) (&(v)->u.array)\n') - c_file.append('#define YAJL_GET_OBJECT_NO_CHECK(v) (&(v)->u.object)\n') for i in structs: append_c_code(i, c_file, schema_info.prefix) @@ -1234,17 +1098,17 @@ def get_c_epilog_for_array_make_parse(c_file, prefix, typ, obj): c_file.append(f"\ndefine_cleaner_function ({typename} *, free_{typename})\n" + f"{typename}\n" + - f"*make_{typename} (yajl_val tree, const struct parser_context *ctx, parser_error *err)\n" + + f"*make_{typename} (json_object *tree, const struct parser_context *ctx, parser_error *err)\n" + "{\n" + f" __auto_cleanup(free_{typename}) {typename} *ptr = NULL;\n" + - f" size_t i, alen;\n" + + f" size_t alen;\n" + f" "+ f" (void) ctx;\n" + f" "+ - f" if (tree == NULL || err == NULL || YAJL_GET_ARRAY (tree) == NULL)\n" + + f" if (tree == NULL || err == NULL || !json_object_is_type (tree, json_type_array))\n" + f" return NULL;\n" + f" *err = NULL;\n" + - f" alen = YAJL_GET_ARRAY_NO_CHECK (tree)->len;\n" + + f" alen = json_object_array_length (tree);\n" + f" if (alen == 0)\n" + f" return NULL;\n" + f" ptr = calloc (1, sizeof ({typename}));\n" + @@ -1254,6 +1118,7 @@ def get_c_epilog_for_array_make_parse(c_file, prefix, typ, obj): f" if (ptr->items == NULL)\n" + f" return NULL;\n" + f" ptr->len = alen;\n" + f" json_object *work;" ) if obj.doublearray: @@ -1262,10 +1127,10 @@ def get_c_epilog_for_array_make_parse(c_file, prefix, typ, obj): c_file.append(' return NULL;') c_file.append("""\n - for (i = 0; i < alen; i++) + for(size_t i = 0; i < alen; i++) { - yajl_val work = YAJL_GET_ARRAY_NO_CHECK (tree)->values[i]; -"""); + json_object *work = json_object_array_get_idx(tree, i); +""") if obj.subtypobj or obj.subtyp == 'object': if obj.subtypname: @@ -1275,13 +1140,14 @@ def get_c_epilog_for_array_make_parse(c_file, prefix, typ, obj): if obj.doublearray: c_file.append(' size_t j;\n') - c_file.append(' ptr->items[i] = calloc ( YAJL_GET_ARRAY_NO_CHECK(work)->len + 1, sizeof (**ptr->items));\n') + c_file.append(' size_t sublen = json_object_array_length(work);\n') + c_file.append(' ptr->items[i] = calloc ( sublen + 1, sizeof (**ptr->items));\n') c_file.append(' if (ptr->items[i] == NULL)\n') c_file.append(' return NULL;\n') - c_file.append(' yajl_val *tmps = YAJL_GET_ARRAY_NO_CHECK(work)->values;\n') - c_file.append(' for (j = 0; j < YAJL_GET_ARRAY_NO_CHECK(work)->len; j++)\n') + c_file.append(' for(size_t j = 0; j < sublen; j++)\n') c_file.append(' {\n') - c_file.append(f' ptr->items[i][j] = make_{subtypename} (tmps[j], ctx, err);\n') + c_file.append(' json_object *nested_item = json_object_array_get_idx(work, j);\n') + c_file.append(f' ptr->items[i][j] = make_{subtypename} (nested_item, ctx, err);\n') c_file.append(' if (ptr->items[i][j] == NULL)\n') c_file.append(" return NULL;\n") c_file.append(' ptr->subitem_lens[i] += 1;\n') @@ -1292,24 +1158,24 @@ def get_c_epilog_for_array_make_parse(c_file, prefix, typ, obj): c_file.append(" return NULL;\n") elif obj.subtyp == 'byte': if obj.doublearray: - c_file.append(' char *str = YAJL_GET_STRING (work);\n') + c_file.append(' const char *str = json_object_get_string (work);\n') c_file.append(' ptr->items[j] = (uint8_t *)strdup (str ? str : "");\n') c_file.append(' if (ptr->items[j] == NULL)\n') c_file.append(" return NULL;\n") else: - c_file.append(' char *str = YAJL_GET_STRING (tree);\n') + c_file.append(' const char *str = json_object_get_string (tree);\n') c_file.append(' memcpy(ptr->items, str ? str : "", strlen(str ? str : ""));\n') c_file.append(' break;\n') else: if obj.doublearray: - c_file.append(' ptr->items[i] = calloc ( YAJL_GET_ARRAY_NO_CHECK(work)->len + 1, sizeof (**ptr->items));\n') + c_file.append(' size_t sublen = json_object_array_length(work);\n') + c_file.append(' ptr->items[i] = calloc ( json_object_array_length(work) + 1, sizeof (**ptr->items));\n') c_file.append(' if (ptr->items[i] == NULL)\n') c_file.append(' return NULL;\n') - c_file.append(' size_t j;\n') - c_file.append(' yajl_val *tmps = YAJL_GET_ARRAY_NO_CHECK(work)->values;\n') - c_file.append(' for (j = 0; j < YAJL_GET_ARRAY_NO_CHECK(work)->len; j++)\n') + c_file.append(' for(size_t j = 0; j < sublen; j++)\n') c_file.append(' {\n') - read_val_generator(c_file, 3, 'tmps[j]', \ + c_file.append(' json_object *nested_item = json_object_array_get_idx(work, j);\n') + read_val_generator(c_file, 3, 'nested_item', \ "ptr->items[i][j]", obj.subtyp, obj.origname, c_typ) c_file.append(' ptr->subitem_lens[i] += 1;\n') c_file.append(' }\n') @@ -1420,24 +1286,18 @@ def get_c_epilog_for_array_make_gen(c_file, prefix, typ, obj): return typename = helpers.get_top_array_type_name(obj.name, prefix) - c_file.append(f"yajl_gen_status gen_{typename} (yajl_gen g, const {typename} *ptr, const struct parser_context *ctx," + """ + c_file.append(f"int gen_{typename} (json_object *root, const {typename} *ptr, " + """ parser_error *err) { - yajl_gen_status stat; size_t i; - + int stat; if (ptr == NULL) - return yajl_gen_status_ok; - *err = NULL; + return JSON_GEN_SUCCESS; """) if obj.subtypobj or obj.subtyp == 'object': c_file.append("""\n - stat = yajl_gen_array_open ((yajl_gen) g); - if (stat != yajl_gen_status_ok) - GEN_SET_ERROR_AND_RETURN (stat, err); for (i = 0; i < ptr->len; i++) - { """) if obj.subtypname: @@ -1446,89 +1306,93 @@ def get_c_epilog_for_array_make_gen(c_file, prefix, typ, obj): subtypename = helpers.get_name_substr(obj.name, prefix) c_file.append(' {\n') if obj.doublearray: - c_file.append(' stat = yajl_gen_array_open ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(" json_object *subroot = json_object_new_array();\n") c_file.append(" size_t j;\n") c_file.append(' for (j = 0; j < ptr->subitem_lens[i]; j++)\n') c_file.append(' {\n') - c_file.append(f' stat = gen_{subtypename} (g, ptr->items[i][j], ctx, err);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(' json_object *subobj = json_object_new_object();\n') + c_file.append(f' stat = gen_{subtypename} (subobj, ptr->items[i][j], err);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(" stat = json_object_array_add (subroot, subobj);\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(' }\n') - c_file.append(' stat = yajl_gen_array_close ((yajl_gen) g);\n') + c_file.append(" int stat = json_object_array_add (root, subroot);\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") else: - c_file.append(f' stat = gen_{subtypename} (g, ptr->items[i], ctx, err);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") + c_file.append(" json_object *obj = json_object_new_object();\n") + c_file.append(f' stat = gen_{subtypename} (obj, ptr->items[i], err);\n') + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") + c_file.append(" stat = json_object_array_add (root, obj);\n\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append("""\n } - } - stat = yajl_gen_array_close ((yajl_gen) g); """) elif obj.subtyp == 'byte': c_file.append(' {\n') c_file.append(' const char *str = NULL;\n') if obj.doublearray: - c_file.append(' stat = yajl_gen_array_open ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(" {\n") c_file.append(" size_t i;\n") + c_file.append(" json_object *subroot = json_object_new_array();\n") c_file.append(" for (i = 0; i < ptr->len; i++)\n") c_file.append(" {\n") c_file.append(" if (ptr->items[i] != NULL)\n") c_file.append(" str = (const char *)ptr->items[i];\n") c_file.append(" else ()\n") c_file.append(" str = "";\n") - c_file.append(' stat = yajl_gen_string ((yajl_gen) g, \ - (const unsigned char *)str, strlen(str));\n') + c_file.append(" json_object *jstr = json_object_new_string(str);\n") + c_file.append(" int stat = json_object_array_add (subroot, jstr);\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(" }\n") + c_file.append(" int stat = json_object_array_add (root, subroot);\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(" }\n") - c_file.append(' stat = yajl_gen_array_close ((yajl_gen) g);\n') else: c_file.append(" if (ptr != NULL && ptr->items != NULL)\n") c_file.append(" {\n") c_file.append(" str = (const char *)ptr->items;\n") c_file.append(" }\n") - c_file.append(' stat = yajl_gen_string ((yajl_gen) g, \ - (const unsigned char *)str, ptr->len);\n') + c_file.append(" json_object *jstr = json_object_new_string(str);\n") + c_file.append(" int stat = json_object_array_add (root, jstr);\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(' }\n') else: c_file.append("""\n - stat = yajl_gen_array_open ((yajl_gen) g); - if (stat != yajl_gen_status_ok) - GEN_SET_ERROR_AND_RETURN (stat, err); for (i = 0; i < ptr->len; i++) { """) c_file.append(' {\n') if obj.doublearray: - c_file.append(' stat = yajl_gen_array_open ((yajl_gen) g);\n') - c_file.append(" if (stat != yajl_gen_status_ok)\n") - c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") c_file.append(" size_t j;\n") + c_file.append(" json_object *subroot = json_object_new_array();\n") c_file.append(' for (j = 0; j < ptr->subitem_lens[i]; j++)\n') c_file.append(' {\n') - json_value_generator(c_file, 4, "ptr->items[i][j]", 'g', 'ctx', obj.subtyp) + json_value_generator(c_file, 4, "ptr->items[i][j]", 'subroot', obj.subtyp) c_file.append(' }\n') - c_file.append(' stat = yajl_gen_array_close ((yajl_gen) g);\n') + c_file.append(" int stat = json_object_array_add (root, subroot);\n") + c_file.append(" if (stat != JSON_GEN_SUCCESS)\n") + c_file.append(" GEN_SET_ERROR_AND_RETURN (stat, err);\n") else: - json_value_generator(c_file, 3, "ptr->items[i]", 'g', 'ctx', obj.subtyp) + json_value_generator(c_file, 3, "ptr->items[i]", 'root', obj.subtyp) c_file.append("""\n } } - stat = yajl_gen_array_close ((yajl_gen) g); """) c_file.append("""\n - if (ptr->len > 0 && !(ctx->options & OPT_GEN_SIMPLIFY)) - yajl_gen_config (g, yajl_gen_beautify, 1); - if (stat != yajl_gen_status_ok) + if (stat != JSON_GEN_SUCCESS) GEN_SET_ERROR_AND_RETURN (stat, err); - return yajl_gen_status_ok; + return JSON_GEN_SUCCESS; } """) @@ -1570,7 +1434,7 @@ def get_c_epilog(c_file, prefix, typ, obj): *err = strdup ("error allocating memory"); return NULL; }""" + - f"ptr = {typename}_parse_data (content, ctx, err);" + + f"\n\t\t\tptr = {typename}_parse_data (content, ctx, err);\n\t\t\t" + """return ptr; } """) @@ -1598,13 +1462,14 @@ def get_c_epilog(c_file, prefix, typ, obj): """) c_file.append(""" -define_cleaner_function (yajl_val, yajl_tree_free) +define_cleaner_function (json_object *, json_object_put) """ + f"\n {typename} * " + f"{typename}_parse_data (const char *jsondata, const struct parser_context *ctx, parser_error *err)\n {{ \n" + - f" {typename} *ptr = NULL;" + - """__auto_cleanup(yajl_tree_free) yajl_val tree = NULL; - char errbuf[1024]; + f" {typename} *ptr = NULL;\n" + + """\t//__auto_cleanup(json_object_put)\n\tjson_object *tree = NULL; + enum json_tokener_error *error; + struct json_tokener *tok = json_tokener_new(); struct parser_context tmp_ctx = { 0 }; if (jsondata == NULL || err == NULL) @@ -1614,74 +1479,39 @@ def get_c_epilog(c_file, prefix, typ, obj): if (ctx == NULL) ctx = (const struct parser_context *)(&tmp_ctx); - tree = yajl_tree_parse (jsondata, errbuf, sizeof (errbuf)); + tree = json_tokener_parse_ex (tok, jsondata, strlen(jsondata)); if (tree == NULL) { - if (asprintf (err, "cannot parse the data: %s", errbuf) < 0) + enum json_tokener_error e = json_tokener_get_error(tok); + if (asprintf (err, "cannot parse the data: %s", json_tokener_error_desc(e)) < 0) *err = strdup ("error allocating memory"); return NULL; }\n""" + - f"ptr = make_{typename} (tree, ctx, err);" + - "return ptr; \n}\n" + f"\tptr = make_{typename} (tree, ctx, err);\n" + + "\treturn ptr; \n}\n" ) - c_file.append("""\nstatic void\ncleanup_yajl_gen (yajl_gen g) -{ - if (!g) - return; - yajl_gen_clear (g); - yajl_gen_free (g); -} - -define_cleaner_function (yajl_gen, cleanup_yajl_gen) - -""") - c_file.append("\n char * \n" + -f"{typename}_generate_json (const {typename} *ptr, const struct parser_context *ctx, parser_error *err)" + +f"{typename}_generate_json (const {typename} *ptr, parser_error *err)" + """{ - __auto_cleanup(cleanup_yajl_gen) yajl_gen g = NULL; - struct parser_context tmp_ctx = { 0 }; - const unsigned char *gen_buf = NULL; - char *json_buf = NULL; - size_t gen_len = 0; +""" + +f" //__auto_cleanup(json_object_put)\n\tjson_object *root = json_object_new_{typ}();" + +""" if (ptr == NULL || err == NULL) return NULL; *err = NULL; - if (ctx == NULL) - ctx = (const struct parser_context *)(&tmp_ctx); - - if (!json_gen_init(&g, ctx)) - { - *err = strdup ("Json_gen init failed"); - return json_buf; - } \n """ + - f"if (yajl_gen_status_ok != gen_{typename} (g, ptr, ctx, err))" + + f"\tif (JSON_GEN_FAILED == gen_{typename} (root, ptr, err))" + """ { if (*err == NULL) *err = strdup ("Failed to generate json"); - return json_buf; - } - - yajl_gen_get_buf (g, &gen_buf, &gen_len); - if (gen_buf == NULL) - { - *err = strdup ("Error to get generated json"); - return json_buf; + return NULL; } - json_buf = calloc (1, gen_len + 1); - if (json_buf == NULL) - { - *err = strdup ("Cannot allocate memory"); - return json_buf; - } - (void) memcpy (json_buf, gen_buf, gen_len); - json_buf[gen_len] = '\\0'; + char *json_str = (char *)json_object_to_json_string_ext(root, JSON_C_TO_STRING_NOSLASHESCAPE | JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED); - return json_buf; + return json_str; } """) diff --git a/tests/data/config.json b/tests/data/config.json index 99b4ec4d..3be40dda 100644 --- a/tests/data/config.json +++ b/tests/data/config.json @@ -50,10 +50,20 @@ ] }, "rlimits": [ + { + "type": "RLIMIT_CORE", + "hard": 18446744073709551615, + "soft": 18446744073709551615 + }, { "type": "RLIMIT_NOFILE", "hard": 1024, "soft": 1024 + }, + { + "type": "RLIMIT_NPROC", + "hard": 1048576, + "soft": 1048576 } ], "noNewPrivileges": true diff --git a/tests/test-1.c b/tests/test-1.c index 6e35b424..551112ee 100644 --- a/tests/test-1.c +++ b/tests/test-1.c @@ -34,17 +34,19 @@ main () printf ("error %s\n", err); exit (1); } - json_buf = runtime_spec_schema_config_schema_generate_json(container, 0, &err); + json_buf = runtime_spec_schema_config_schema_generate_json(container, &err); if (json_buf == NULL) { printf("gen error %s\n", err); exit (1); } container_gen = runtime_spec_schema_config_schema_parse_data(json_buf, 0, &err); - if (container == NULL) { + if (container_gen == NULL) { printf ("parse error %s\n", err); exit (1); } + uint64_t hard_limit = 18446744073709551615UL; + if (strcmp (container->hostname, "runc") && strcmp(container->hostname, container_gen->hostname)) exit (5); if (strcmp (container->process->cwd, "/cwd") && strcmp (container->process->cwd, container_gen->process->cwd)) @@ -54,9 +56,11 @@ main () if (!container->process->terminal_present) exit (53); if (!container->process->user->uid_present || container_gen->process->user->gid_present) - exit (6); + exit (65); if (strcmp (container->process->args[0], "ARGS1") && strcmp (container->process->args[0], container_gen->process->args[0])) exit (61); + if (container->process->rlimits[0]->hard != hard_limit) + exit (63); if (strcmp (container->mounts[0]->destination, "/proc") && strcmp (container->mounts[0]->destination, container_gen->mounts[0]->destination)) exit (62); if (container->linux->resources->block_io->weight_device[0]->major != 8 || container_gen->linux->resources->block_io->weight_device[0]->major != 8) diff --git a/tests/test-10.c b/tests/test-10.c index 4cb884ff..38c052d7 100644 --- a/tests/test-10.c +++ b/tests/test-10.c @@ -239,7 +239,7 @@ do_test_object_double_array() free(test_data->refobjarrays[0][0]->item1); test_data->refobjarrays[0][0]->item1 = strdup("objectrefstr"); - json_buf = basic_test_double_array_generate_json(test_data, &ctx, &err); + json_buf = basic_test_double_array_generate_json(test_data, &err); if (json_buf == NULL) { printf("gen error %s\n", err); ret = 1; @@ -312,7 +312,7 @@ int do_test_top_array_of_int() } } test_data->items[0] = 111; - json_buf = basic_test_top_array_int_container_generate_json(test_data, &ctx, &err); + json_buf = basic_test_top_array_int_container_generate_json(test_data, &err); if (json_buf == NULL) { printf("gen error %s\n", err); @@ -369,7 +369,7 @@ int do_test_top_array_of_string() } free(test_data->items[0]); test_data->items[0] = strdup("hello"); - json_buf = basic_test_top_array_string_container_generate_json(test_data, &ctx, &err); + json_buf = basic_test_top_array_string_container_generate_json(test_data, &err); if (json_buf == NULL) { printf("gen error %s\n", err); @@ -437,7 +437,7 @@ int do_test_top_double_array_of_string() } free(test_data->items[0][0]); test_data->items[0][0] = strdup("hello"); - json_buf = basic_test_top_double_array_string_container_generate_json(test_data, &ctx, &err); + json_buf = basic_test_top_double_array_string_container_generate_json(test_data, &err); if (json_buf == NULL) { printf("gen error %s\n", err); @@ -504,7 +504,7 @@ int do_test_top_double_array_of_int() } } test_data->items[0][0] = 888; - json_buf = basic_test_top_double_array_int_container_generate_json(test_data, &ctx, &err); + json_buf = basic_test_top_double_array_int_container_generate_json(test_data, &err); if (json_buf == NULL) { printf("gen error %s\n", err); @@ -587,7 +587,7 @@ int do_test_top_double_array_of_obj() test_data->items[0][0]->second = 999; free(test_data->items[0][1]->third); test_data->items[0][1]->third = strdup("hello"); - json_buf = basic_test_top_double_array_obj_container_generate_json(test_data, &ctx, &err); + json_buf = basic_test_top_double_array_obj_container_generate_json(test_data, &err); if (json_buf == NULL) { printf("gen error %s\n", err); @@ -676,7 +676,7 @@ int do_test_top_double_array_of_refobj() test_data->items[0][0]->item2 = 999; free(test_data->items[0][1]->item1); test_data->items[0][1]->item1 = strdup("hello"); - json_buf = basic_test_top_double_array_refobj_container_generate_json(test_data, &ctx, &err); + json_buf = basic_test_top_double_array_refobj_container_generate_json(test_data, &err); if (json_buf == NULL) { printf("gen error %s\n", err); diff --git a/tests/test-11.c b/tests/test-11.c index 20c5f492..488aff70 100644 --- a/tests/test-11.c +++ b/tests/test-11.c @@ -41,7 +41,7 @@ main () printf ("error %s\n", err); exit (1); } - json_buf = image_spec_schema_image_layout_schema_generate_json(image_layout, &ctx, &err); + json_buf = image_spec_schema_image_layout_schema_generate_json(image_layout, &err); if (json_buf == NULL) { printf("gen error %s\n", err); free(err); diff --git a/tests/test-3.c b/tests/test-3.c index 26f267aa..5f51295a 100644 --- a/tests/test-3.c +++ b/tests/test-3.c @@ -34,7 +34,7 @@ main () printf ("error %s\n", err); exit (1); } - json_buf = image_spec_schema_config_schema_generate_json(image, 0, &err); + json_buf = image_spec_schema_config_schema_generate_json(image, &err); if (json_buf == NULL) { printf("gen error %s\n", err); exit (1); diff --git a/tests/test-4.c b/tests/test-4.c index f1055416..33bb99d8 100644 --- a/tests/test-4.c +++ b/tests/test-4.c @@ -34,7 +34,7 @@ main () printf ("error %s\n", err); exit (1); } - json_buf = image_spec_schema_image_index_schema_generate_json(image_index, 0, &err); + json_buf = image_spec_schema_image_index_schema_generate_json(image_index, &err); if (json_buf == NULL) { printf("gen error %s\n", err); exit (1); diff --git a/tests/test-5.c b/tests/test-5.c index e96cab12..31d48fbc 100644 --- a/tests/test-5.c +++ b/tests/test-5.c @@ -34,7 +34,7 @@ main () printf ("error %s\n", err); exit (1); } - json_buf = image_spec_schema_image_layout_schema_generate_json(image_layout, 0, &err); + json_buf = image_spec_schema_image_layout_schema_generate_json(image_layout, &err); if (json_buf == NULL) { printf("gen error %s\n", err); exit (1); diff --git a/tests/test-6.c b/tests/test-6.c index a5ad7f4e..76826dc4 100644 --- a/tests/test-6.c +++ b/tests/test-6.c @@ -34,7 +34,7 @@ main () printf ("error %s\n", err); exit (1); } - json_buf = image_spec_schema_image_manifest_schema_generate_json(manifest, 0, &err); + json_buf = image_spec_schema_image_manifest_schema_generate_json(manifest, &err); if (json_buf == NULL) { printf("gen error %s\n", err); exit (1); diff --git a/tests/test-7.c b/tests/test-7.c index 226d466e..c0dd8ae7 100644 --- a/tests/test-7.c +++ b/tests/test-7.c @@ -34,7 +34,7 @@ main () printf ("error %s\n", err); exit (1); } - json_buf = image_spec_schema_config_schema_generate_json(image, 0, &err); + json_buf = image_spec_schema_config_schema_generate_json(image, &err); if (json_buf == NULL) { printf("gen error %s\n", err); exit (1); diff --git a/tests/test-8.c b/tests/test-8.c index f066660a..c8eca592 100644 --- a/tests/test-8.c +++ b/tests/test-8.c @@ -36,7 +36,7 @@ main () exit (1); } json_buf = image_manifest_items_image_manifest_items_schema_container_generate_json ( - (const image_manifest_items_image_manifest_items_schema_container*)image_items, 0, &err); + (const image_manifest_items_image_manifest_items_schema_container*)image_items, &err); if (json_buf == NULL) { printf ("gen error %s\n", err); exit (1); diff --git a/tests/test-9.c b/tests/test-9.c index e7a358d6..595d82c1 100644 --- a/tests/test-9.c +++ b/tests/test-9.c @@ -41,7 +41,7 @@ main () printf ("error %s\n", err); exit (1); } - json_buf = image_spec_schema_image_layout_schema_generate_json(image_layout, &ctx, &err); + json_buf = image_spec_schema_image_layout_schema_generate_json(image_layout, &err); if (json_buf == NULL) { printf("gen error %s\n", err); free(err); diff --git a/yajl b/yajl deleted file mode 160000 index 6bc52193..00000000 --- a/yajl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6bc5219389fd2752631682b0a8368e6d8218a8c5