diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ef6f2a15..17778d31 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -20,9 +20,6 @@ jobs: distro: ubuntu_latest steps: - uses: actions/checkout@v4.2.2 - with: - submodules: true - set-safe-directory: true - uses: uraimo/run-on-arch-action@v2.8.1 name: Build @@ -33,29 +30,16 @@ jobs: githubToken: ${{ github.token }} - setup: | - git submodule update --init --recursive - git clone https://github.com/akheron/jansson - 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: | - # Install jansson - cd jansson; - autoreconf -fi; - ./configure; - make; - make install; - cd .. # Configure and Run libocispec - export JANSSON_CFLAGS=-I/usr/local/include; - export JANSSON_LIBS=/usr/local/lib/libjansson.so find $(pwd) -name '.git' -exec bash -c 'git config --global --add safe.directory ${0%/.git}' {} \; ./autogen.sh ./configure CFLAGS='-Wall -Wextra -Werror' - make -j $(nproc) distcheck AM_DISTCHECK_DVI_TARGET="" TESTS="" + 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/Containerfile b/Containerfile index c09fd3e6..56f30980 100644 --- a/Containerfile +++ b/Containerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:24.04 RUN apt-get update && \ apt-get install -y \ @@ -7,19 +7,14 @@ RUN apt-get update && \ git \ libtool \ pkg-config \ - python3 + python3 \ + libjson-c-dev COPY . libocispec -RUN git clone https://github.com/akheron/jansson - -RUN cd jansson && autoreconf -fi && ./configure && make && make install - RUN cd libocispec && \ - export JANSSON_CFLAGS=-I/usr/local/include && \ - export JANSSON_LIBS=/usr/local/lib/libjansson.so && \ ./autogen.sh && \ ./configure CFLAGS='-Wall -Wextra -Werror' && \ - make -j $(nproc) distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-embedded-yajl" AM_DISTCHECK_DVI_TARGET="" TESTS="" && \ - make clean \ No newline at end of file + make -j $(nproc) distcheck AM_DISTCHECK_DVI_TARGET="" TESTS="" && \ + make clean diff --git a/configure.ac b/configure.ac index 999893ab..1fedac7f 100644 --- a/configure.ac +++ b/configure.ac @@ -12,11 +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_CONDITIONAL([HAVE_EMBEDDED_JANSSON], [test x"$embedded_jansson" = xtrue]) -AM_COND_IF([HAVE_EMBEDDED_JANSSON], [], [ -AC_SEARCH_LIBS(json_object, [jansson], [AC_DEFINE([HAVE_JANSSON], 1, [Define if libjansson is available])], [AC_MSG_ERROR([*** libjansson headers not found])]) -PKG_CHECK_MODULES([JANSSON], [jansson >= 2.14]) -]) +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 32673036..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 jansson +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 8252a7ab..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} (json_t *jtree, 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(" json_t *_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} (json_t *jtree, const struct parser_context *ctx, parser_error *err);\n\n") - header.append(f"int gen_{typename} (json_t *root, const {typename} *ptr, 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 \ diff --git a/src/ocispec/json_common.c b/src/ocispec/json_common.c index 6d56b4ff..8343d418 100644 --- a/src/ocispec/json_common.c +++ b/src/ocispec/json_common.c @@ -5,9 +5,6 @@ #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 char * @@ -144,10 +141,17 @@ json_double_to_uint (double d, unsigned int *converted) int json_double_to_uint64 (double d, uint64_t *converted) { - unsigned long long int ull; - ull = (unsigned long long int) d; - *converted = (uint64_t) ull; - return 0; + // 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; } /* @@ -215,20 +219,6 @@ json_double_to_double (double d, double *converted) return 0; } -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) int append_json_map_int_int (json_map_int_int *map, int key, int val) @@ -271,27 +261,6 @@ append_json_map_int_int (json_map_int_int *map, int key, int val) return 0; } -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) - int append_json_map_int_bool (json_map_int_bool *map, int key, bool val) @@ -334,28 +303,6 @@ append_json_map_int_bool (json_map_int_bool *map, int key, bool val) return 0; } -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) - int append_json_map_int_string (json_map_int_string *map, int key, const char *val) { @@ -393,28 +340,6 @@ append_json_map_int_string (json_map_int_string *map, int key, const char *val) } -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) - - int append_json_map_string_int (json_map_string_int *map, const char *key, int val) { @@ -450,27 +375,6 @@ append_json_map_string_int (json_map_string_int *map, const char *key, int val) } -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) - int append_json_map_string_int64 (json_map_string_int64 *map, const char *key, int64_t val) { @@ -504,28 +408,6 @@ append_json_map_string_int64 (json_map_string_int64 *map, const char *key, int64 return 0; } -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) - int append_json_map_string_bool (json_map_string_bool *map, const char *key, bool val) { @@ -576,7 +458,7 @@ append_json_map_string_bool (json_map_string_bool *map, const char *key, bool va } int -gen_json_map_string_string (json_t *root, const json_map_string_string *map, parser_error *err) +gen_json_map_string_string (json_object *root, const json_map_string_string *map, parser_error *err) { int stat = JSON_GEN_SUCCESS; size_t len = 0, i = 0; @@ -585,10 +467,11 @@ gen_json_map_string_string (json_t *root, const json_map_string_string *map, par for (i = 0; i < len; i++) { - stat = json_object_set(root, (const char *)(map->keys[i]), json_string((const char *)(map->values[i]))); + 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); } + // 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; } @@ -616,19 +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 (json_t *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) return NULL; - len = json_object_to_keys_values (src)->len; + len = json_object_object_length (src); ret = calloc (1, sizeof (*ret)); if (ret == NULL) @@ -637,7 +520,7 @@ make_json_map_string_string (json_t *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) @@ -652,41 +535,42 @@ make_json_map_string_string (json_t *src, const struct parser_context *ctx, *(err) = strdup ("error allocating memory"); return NULL; } - for (i = 0; i < len; i++) - { - const char *srckey = json_object_to_keys_values (src)->keys[i]; - const json_t *srcval = &json_object_to_keys_values (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 (! json_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 = json_string_value(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); } @@ -786,76 +670,40 @@ append_json_map_string_string (json_map_string_string *map, const char *key, con } -/** - * json_array_to_struct This function extracts keys and values and stores it in struct - * Input: json_t - * Output: jansson_array_values * - */ -jansson_array_values *json_array_to_struct(json_t *array) { - if (!json_is_array(array)) { - // Handle error: Input is not an array - return NULL; - } - - size_t len = json_array_size(array); - jansson_array_values *result = malloc(sizeof(jansson_array_values)); - if (!result) { - return NULL; // Handle allocation failure - } - - result->values = json_array(); - result->len = len; - - if (!result->values) { - free(result); - return NULL; // Handle allocation failure - } - - for (size_t i = 0; i < len; i++) { - json_t *value = json_array_get(array, i); - json_array_append_new(result->values, json_incref(value)); - } - - return result; -} - - /** * json_object_to_keys_values This function extracts keys and values and stores it in array of keys and values - * Input: json_t - * Output: jansson_object_keys_values * + * Input: json_object + * Output: json_c_object_keys_values * */ -jansson_object_keys_values *json_object_to_keys_values(json_t *object) { - if (!json_is_object(object)) { +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; } - size_t len = json_object_size(object); - jansson_object_keys_values *result = malloc(sizeof(jansson_object_keys_values)); + 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 } result->keys = calloc(len, sizeof(char*)); - result->values = json_array(); + result->values = json_object_new_array(); result->len = len; if (!result->keys || !result->values) { free(result->keys); - json_decref(result->values); + json_object_put(result->values); free(result); return NULL; // Handle allocation failure } - json_t *key_iter = json_object_iter(object); - for (size_t i = 0; key_iter; key_iter = json_object_iter_next(object, key_iter)) { - const char *key = json_object_iter_key(key_iter); - json_t *value = json_object_iter_value(key_iter); - - result->keys[i] = strdup(key); - json_array_append_new(result->values, json_incref(value)); - i++; + int i = 0; + json_object_object_foreach(object, key, value) + { + result->keys[i] = key; + json_object_array_add(result->values, value); + i++; } return result; @@ -864,33 +712,37 @@ jansson_object_keys_values *json_object_to_keys_values(json_t *object) { /** * 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_t - * Input: json_t, const char **, size_t + * we add it to new json_object + * Input: json_object, const char ** * Ouput: jsont_t */ -json_t *copy_unmatched_fields(json_t *src, const char **exclude_keys, size_t num_keys) { - json_t *dst = json_object(); - json_t *value; - - json_t *key_iter = json_object_iter(src); - while (key_iter) { - const char *key = json_object_iter_key(key_iter); - value = json_object_iter_value(key_iter); - - bool found = false; - for (size_t i = 0; i < num_keys; i++) { - if (strcmp(key, exclude_keys[i]) == 0) { - found = true; - break; - } +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 (!found) { - json_object_set_new(dst, key, json_incref(value)); + if (match == 0) { + json_object_object_add(dst, key, value); } - - key_iter = json_object_iter_next(src, key_iter); } return dst; -} \ No newline at end of file +} + +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 0; +} diff --git a/src/ocispec/json_common.h b/src/ocispec/json_common.h index 78dc8e92..fd253e6c 100644 --- a/src/ocispec/json_common.h +++ b/src/ocispec/json_common.h @@ -6,7 +6,7 @@ #include #include #include -#include +#include #ifdef __cplusplus extern "C" { @@ -117,9 +117,7 @@ typedef struct size_t len; } json_map_int_int; -void free_json_map_int_int (json_map_int_int *map); - -int gen_json_map_int_int (json_t *root, const json_map_int_int *map, +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); @@ -131,9 +129,7 @@ typedef struct size_t len; } json_map_int_bool; -void free_json_map_int_bool (json_map_int_bool *map); - -int gen_json_map_int_bool (json_t *root, const json_map_int_bool *map, +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); @@ -145,9 +141,7 @@ typedef struct size_t len; } json_map_int_string; -void free_json_map_int_string (json_map_int_string *map); - -int gen_json_map_int_string (json_t *root, const json_map_int_string *map, +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); @@ -159,9 +153,7 @@ typedef struct size_t len; } json_map_string_int; -void free_json_map_string_int (json_map_string_int *map); - -int gen_json_map_string_int (json_t *root, const json_map_string_int *map, +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); @@ -173,8 +165,6 @@ typedef struct size_t len; } json_map_string_bool; -void free_json_map_string_bool (json_map_string_bool *map); - typedef struct { char **keys; @@ -182,14 +172,13 @@ typedef struct size_t len; } json_map_string_int64; -void free_json_map_string_int64 (json_map_string_int64 *map); -int gen_json_map_string_int64 (json_t *root, const json_map_string_int64 *map, +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); -int gen_json_map_string_bool (json_t *root, const json_map_string_bool *map, +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); @@ -205,9 +194,9 @@ 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 (json_t *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); -int gen_json_map_string_string (json_t *root, const json_map_string_string *map, 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); @@ -215,22 +204,22 @@ char *json_marshal_string (const char *str, size_t length, const struct parser_c typedef struct { - json_t * values; + json_object * values; size_t len; } jansson_array_values; -jansson_array_values *json_array_to_struct(json_t *array); - typedef struct { - const char **keys; - json_t * values; + char **keys; + struct json_object *values; size_t len; -} jansson_object_keys_values; +} json_c_object_keys_values; + +json_c_object_keys_values *json_object_to_keys_values(json_object *object); -jansson_object_keys_values *json_object_to_keys_values(json_t *object); +struct json_object *copy_unmatched_fields(json_object *src, const char **exclude_keys, int len); -json_t *copy_unmatched_fields(json_t *src, const char **exclude_keys, size_t num_keys); +int json_object_update_missing_generic(struct json_object *obj1, struct json_object *obj2); #ifdef __cplusplus } diff --git a/src/ocispec/sources.py b/src/ocispec/sources.py index 0d9ae742..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,13 +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 (json_is_object(tree))\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 = json_object_size(tree);\n') - c_file.append(' jansson_object_keys_values *kvobj = json_object_to_keys_values(tree);\n') - c_file.append(' const char **keys = kvobj->keys;\n') - c_file.append(' json_t *values = kvobj->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') @@ -71,12 +71,12 @@ 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(' json_t *jval;\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(' jval = &values[i];\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") @@ -92,82 +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' json_t *tmp = json_object_get (tree, "{obj.origname}");\n') - c_file.append(f' jansson_array_values *jarray = json_array_to_struct(tmp);') - c_file.append(' if (tmp != NULL && jarray != 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 = json_array_size (tmp);\n') - c_file.append(' json_t *values = jarray->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(' json_t *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 ( jarray->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(' json_t *items = jarray->values;\n') - c_file.append(' for (j = 0; j < jarray->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' json_t *tmp = json_object_get (tree, "{obj.origname}");\n') - c_file.append(' if (tmp != NULL && (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 = json_array_to_struct (tmp)->len;\n') - c_file.append(' json_t *values = json_array_to_struct(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') @@ -176,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(' json_t *items = json_array_to_struct(&values[i])->values;\n') - c_file.append(f' ret->{obj.fixname}[i] = calloc ( json_array_to_struct(&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 < json_array_to_struct(&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') @@ -207,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'json_object_get (tree, "{obj.origname}")', \ + 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'json_object_get (tree, "{obj.origname}")', \ + 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'json_object_get (tree, "{obj.origname}")', \ + 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'json_object_get (tree, "{obj.origname}")', \ + 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'json_object_get (tree, "{obj.origname}")', \ + 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') @@ -245,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} (json_object_get (tree, "{obj.origname}"), 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': @@ -253,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' json_t *tmp = json_object_get (tree, "{obj.origname}");\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') @@ -298,7 +268,7 @@ def parse_obj_arr_obj(obj, c_file, prefix, obj_typename): condition = ", ".join([f'"{i.origname}"' for i in obj.children]) c_file.append(""" - if (json_is_object(tree)) + if (json_object_is_type(tree, json_type_object)) { if (ctx->options & OPT_PARSE_FULLKEY) { @@ -306,12 +276,12 @@ def parse_obj_arr_obj(obj, c_file, prefix, obj_typename): return NULL; } """ + f"int len = {len(obj.children)};\n" f"const char *excluded[] = {'{'}{condition}{'}'};" - """ - size_t len = json_object_size(tree); - json_t *resi = copy_unmatched_fields(tree, excluded, len); + """ + json_object *resi = copy_unmatched_fields(tree, excluded, len); - size_t resilen = json_object_size(resi); + int resilen = json_object_object_length(resi); if (ctx->options & OPT_PARSE_FULLKEY && resi != NULL && resilen > 0) ret->_residual = resi; @@ -319,7 +289,7 @@ def parse_obj_arr_obj(obj, c_file, prefix, obj_typename): """) -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 @@ -337,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} (json_t *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") @@ -377,12 +349,12 @@ def get_map_string_obj(obj, c_file, prefix): c_file.append(' {\n') c_file.append(' for (i = 0; i < len; i++)\n') c_file.append(' {\n') - c_file.append(' json_t *subroot = json_object();\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(' char *str = ptr->keys[i] ? ptr->keys[i] : "";\n') - c_file.append(' stat = json_object_set (root, (const char *)str, subroot);\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') @@ -399,26 +371,34 @@ def get_obj_arr_obj_array(obj, c_file, prefix): c_file.append(' {\n') c_file.append(' size_t len = 0, i;\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(' json_t *subroot = json_array();\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(' json_t *subsubroot = json_array();\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} (subsubroot, ptr->{obj.fixname}[i][j], err);\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 = json_array_append(subroot, subsubroot);\n') + c_file.append(' stat = json_object_array_add (subroot, subsubroot);\n') else: - c_file.append(f' stat = gen_{typename} (subroot, ptr->{obj.fixname}[i], err);\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(f' stat = json_object_set(root, (const char *)("{obj.origname}"), subroot);\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) @@ -427,7 +407,7 @@ def get_obj_arr_obj_array(obj, c_file, prefix): c_file.append(' const char *str = "";\n') c_file.append(' size_t len = 0;\n') if obj.doublearray: - c_file.append(' json_t *subroot = json_array();\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") @@ -436,17 +416,17 @@ 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 = json_array_append (subroot, json_string((const char *)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(f' stat = json_object_set (root, (const char *)("{obj.origname}"), subroot);\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(f' stat = json_object_set (root, (const char *)("{obj.origname}"), json_string((const char *)str));\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") @@ -454,7 +434,7 @@ def get_obj_arr_obj_array(obj, c_file, prefix): 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(' json_t *subroot = json_array();\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") @@ -464,17 +444,17 @@ def get_obj_arr_obj_array(obj, c_file, prefix): if obj.doublearray: typename = helpers.get_map_c_types(obj.subtyp) - c_file.append(' json_t *subsubroot = json_array();\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]", 'subsubroot', obj.subtyp) c_file.append(' }\n') - c_file.append(' stat = json_array_append(subroot, subsubroot);\n') + c_file.append(' stat = json_object_array_add (subroot, subsubroot);\n') else: json_value_generator(c_file, 3, f"ptr->{obj.fixname}[i]", 'subroot', obj.subtyp) c_file.append(' }\n') - c_file.append(f' stat = json_object_set(root, (const char *)("{obj.origname}"), subroot);\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): @@ -487,7 +467,7 @@ def get_obj_arr_obj(obj, c_file, prefix): l = len(obj.origname) c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL)\n' ) c_file.append(' {\n') - c_file.append(f' stat = json_object_set(root, (const char *)("{obj.origname}"), json_string(ptr->{obj.fixname}));\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(" }\n") @@ -497,14 +477,17 @@ def get_obj_arr_obj(obj, c_file, prefix): json_conv = 'json_real' if obj.typ == 'double': numtyp = 'double' + elif obj.typ.startswith("int") : + numtyp = 'int64_t' + json_conv = 'json_object_new_int64' else: - numtyp = 'json_int_t' - json_conv = 'json_integer' + 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" if (ptr != NULL && ptr->{obj.fixname})\n") c_file.append(f" num = ({numtyp})ptr->{obj.fixname};\n") - c_file.append(f' stat = json_object_set(root, (const char *)("{obj.origname}"), {json_conv}(num));\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(" }\n") @@ -514,7 +497,7 @@ def get_obj_arr_obj(obj, c_file, prefix): c_file.append(' bool b = false;\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_set(root, (const char *)("{obj.origname}"), json_boolean(b));\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(" \n") @@ -527,11 +510,11 @@ def get_obj_arr_obj(obj, c_file, prefix): typename = helpers.get_prefixed_name(obj.name, prefix) c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL)\n') c_file.append(" {\n") - c_file.append(' json_t *subroot = json_object();\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 = json_object_set(root, (const char *)("{obj.origname}"), subroot);\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") @@ -541,11 +524,11 @@ def get_obj_arr_obj(obj, c_file, prefix): l = len(obj.origname) c_file.append(f' if (ptr != NULL && ptr->{obj.fixname} != NULL)\n') c_file.append(' {\n') - c_file.append(' json_t *subroot = json_object();\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 = json_object_set(root, (const char *)("{obj.fixname}"), subroot);\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") @@ -567,10 +550,13 @@ def get_c_json(obj, c_file, prefix): if objs is None: return c_file.append( - f"int\ngen_{typename} (json_t *root, const {typename} *ptr, " \ + f"int\ngen_{typename} (json_object *root, const {typename} *ptr, " \ "parser_error *err)\n") c_file.append("{\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': @@ -583,7 +569,7 @@ def get_c_json(obj, c_file, prefix): if obj.children is not None: c_file.append(" if (ptr != NULL && ptr->_residual != NULL)\n") c_file.append(" {\n") - c_file.append(" stat = json_object_update_missing(root, ptr->_residual);\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") @@ -598,10 +584,10 @@ 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}const json_t *jval = {src};\n") - c_file.append(f"{' ' * level}if (jval != NULL)\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)} (jval, ctx, err);\n') + c_file.append(f'{" " * (level + 1)}{dest} = make_{helpers.make_basic_map_name(typ)} (val, ctx, err);\n') c_file.append(f"{' ' * (level + 1)}if ({dest} == NULL)\n") c_file.append(f'{" " * (level + 1)} {{\n') c_file.append(f"{' ' * (level + 1)} char *new_error = NULL;\n") @@ -613,53 +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': - if not (src.startswith("json") or src.startswith("work")): - src = '&' + src - c_file.append(f"{' ' * level}const json_t *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)}const char *str = json_string_value (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): - if not (src.startswith("json") or src.startswith("work")): - src = '&' + src - c_file.append(f"{' ' * level}const json_t *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 (!json_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 = json_double_to_{typ} (json_number_value(val), &{dest});\n') - elif typ == "integer": - c_file.append(f"{' ' * (level + 1)}int invalid;\n") - c_file.append(f"{' ' * (level + 1)}if (!json_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 = json_double_to_int (json_number_value(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 (!json_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 = json_double_to_uint (json_number_value(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 \'%f\' with type \'{typ}\' for key \'{keyname}\': %s", json_number_value (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') @@ -667,7 +640,7 @@ 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}const json_t *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') @@ -682,19 +655,15 @@ def read_val_generator(c_file, level, src, dest, typ, keyname, obj_typename): 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': - if src.startswith("items"): - src = '&' + src - c_file.append(f"{' ' * level}json_t *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} = json_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') @@ -708,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}json_t *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}) = json_is_true(jval);\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 = json_object_get (tree, "{keyname}");\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}) = json_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') @@ -884,20 +853,20 @@ def json_value_generator(c_file, level, src, dst, typ): 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 = json_array_append({dst}, json_string({src}));\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 = json_array_append({dst}, json_real({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 = json_array_append ({dst}, json_integer({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 = json_array_append({dst}, json_integer({src}));\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 = json_array_append({dst}, json_boolean({src}));\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") @@ -1039,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(" json_decref (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") @@ -1129,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} (json_t *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 || !json_is_array (tree))\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 = json_array_size (tree);\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" + @@ -1149,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: @@ -1157,9 +1127,9 @@ 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++) { - json_t *work = &json_array_to_struct (tree)->values[i]; + json_object *work = json_object_array_get_idx(tree, i); """) if obj.subtypobj or obj.subtyp == 'object': @@ -1170,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 ( json_array_to_struct(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(' json_t *tmps = json_array_to_struct(work)->values;\n') - c_file.append(' for (j = 0; j < json_array_to_struct(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') @@ -1187,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(' const char *str = json_string_value (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(' const char *str = json_string_value (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 ( json_array_to_struct(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(' json_t *tmps = json_array_to_struct(work)->values;\n') - c_file.append(' for (j = 0; j < json_array_to_struct(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') @@ -1315,7 +1286,7 @@ 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"int gen_{typename} (json_t *root, const {typename} *ptr, " + """ + c_file.append(f"int gen_{typename} (json_object *root, const {typename} *ptr, " + """ parser_error *err) { size_t i; @@ -1335,19 +1306,27 @@ 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(" json_t *subroot = json_array();\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} (subroot, ptr->items[i][j], err);\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(" int stat = json_array_append(root, subroot);\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} (root, ptr->items[i], err);\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 @@ -1359,19 +1338,19 @@ def get_c_epilog_for_array_make_gen(c_file, prefix, typ, obj): if obj.doublearray: c_file.append(" {\n") c_file.append(" size_t i;\n") - c_file.append(" json_t *subroot = json_array();\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(" json_t *jstr = json_string(str);\n") - c_file.append(" int stat = json_array_append(subroot, jstr);\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_array_append(root, subroot);\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") @@ -1380,8 +1359,8 @@ def get_c_epilog_for_array_make_gen(c_file, prefix, typ, obj): c_file.append(" {\n") c_file.append(" str = (const char *)ptr->items;\n") c_file.append(" }\n") - c_file.append(" json_t *jstr = json_string(str);\n") - c_file.append(" int stat = json_array_append(root, jstr);\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') @@ -1393,12 +1372,12 @@ def get_c_epilog_for_array_make_gen(c_file, prefix, typ, obj): c_file.append(' {\n') if obj.doublearray: c_file.append(" size_t j;\n") - c_file.append(" json_t *subroot = json_array();\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]", 'subroot', obj.subtyp) c_file.append(' }\n') - c_file.append(" int stat = json_array_append(root, subroot);\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: @@ -1455,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; } """) @@ -1483,13 +1462,14 @@ def get_c_epilog(c_file, prefix, typ, obj): """) c_file.append(""" -define_cleaner_function (json_t *, json_decref) +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;\n" + - """\t__auto_cleanup(json_decref) json_t *tree = NULL; - json_error_t error; + """\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) @@ -1499,10 +1479,11 @@ def get_c_epilog(c_file, prefix, typ, obj): if (ctx == NULL) ctx = (const struct parser_context *)(&tmp_ctx); - tree = json_loads (jsondata, 0, &error); + tree = json_tokener_parse_ex (tok, jsondata, strlen(jsondata)); if (tree == NULL) { - if (asprintf (err, "cannot parse the data: %s", error.text) < 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""" + @@ -1513,21 +1494,23 @@ def get_c_epilog(c_file, prefix, typ, obj): c_file.append("\n char * \n" + f"{typename}_generate_json (const {typename} *ptr, parser_error *err)" + """{ - __auto_cleanup(json_decref) json_t *root = json_object(); +""" + +f" //__auto_cleanup(json_object_put)\n\tjson_object *root = json_object_new_{typ}();" + +""" if (ptr == NULL || err == NULL) return NULL; *err = NULL; """ + - f"if (JSON_GEN_FAILED == gen_{typename} (root, ptr, err))" + + f"\tif (JSON_GEN_FAILED == gen_{typename} (root, ptr, err))" + """ { if (*err == NULL) *err = strdup ("Failed to generate json"); return NULL; } - char *json_str = json_dumps(root, JSON_INDENT(2)); + 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_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 b87a7d56..551112ee 100644 --- a/tests/test-1.c +++ b/tests/test-1.c @@ -40,11 +40,13 @@ main () 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)