Skip to content

Commit

Permalink
Merge pull request #141 from xw19/switch-to-jansson-SM
Browse files Browse the repository at this point in the history
Moving From YAJL to Jansson
  • Loading branch information
giuseppe authored Nov 6, 2024
2 parents 388c91b + 8588c67 commit 216f6f7
Show file tree
Hide file tree
Showing 5 changed files with 289 additions and 26 deletions.
21 changes: 16 additions & 5 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ jobs:
- arch: ppc64le
distro: ubuntu_latest
steps:
- uses: actions/checkout@v3.0.2
- uses: actions/checkout@v4.2.2
with:
submodules: true
set-safe-directory: true

- uses: uraimo/run-on-arch-action@v2.2.0
- uses: uraimo/run-on-arch-action@v2.8.1
name: Build
id: build
with:
Expand All @@ -41,10 +41,21 @@ jobs:
apt-get install -q -y python3 automake libtool autotools-dev git make cmake pkg-config gcc wget xz-utils
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 --enable-embedded-yajl --enable-embedded-jansson
./configure --enable-embedded-yajl --enable-embedded-jansson CFLAGS='-Wall -Wextra -Werror'
make -j $(nproc) distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-embedded-yajl --enable-embedded-jansson" AM_DISTCHECK_DVI_TARGET="" TESTS=""
./autogen.sh --enable-embedded-yajl
./configure --enable-embedded-yajl CFLAGS='-Wall -Wextra -Werror'
make -j $(nproc) distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-embedded-yajl" AM_DISTCHECK_DVI_TARGET="" TESTS=""
# check that the working dir is clean
git describe --broken --dirty --all | grep -qv dirty
make clean
Expand Down
2 changes: 2 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,8 @@ 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)
(cd jansson; git pull https://github.com/akheron/jansson master)


generate: src/runtime_spec_stamp src/image_spec_stamp src/image_manifest_stamp src/basic-test_stamp

Expand Down
218 changes: 218 additions & 0 deletions src/ocispec/json_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,187 @@ common_safe_int (const char *numstr, int *converted)
return 0;
}

/*
* This function converts double to int
* Input: double d, int *converted
* Ouput: int
*/
int
json_double_to_int (double d, int *converted)
{
long long int lli;
lli = (long long int) d;

if (lli > INT_MAX || lli < INT_MIN)
return -ERANGE;

*converted = (int) lli;
return 0;
}

/*
* This function converts double to int64
* Input: double d, int64 *converted
* Ouput: int
*/
int
json_double_to_int64 (double d, int64_t *converted)
{
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
json_double_to_int32 (double d, int32_t *converted)
{
long long int lli;
lli = (long long int) d;

if (lli > INT32_MAX || lli < INT32_MIN)
return -ERANGE;

*converted = (int32_t) lli;
return 0;
}

/*
* This function converts double to int16
* Input: double d, int16 *converted
* Ouput: int
*/
int
json_double_to_int16 (double d, int16_t *converted)
{
long int li;
li = (long int) d;
if (li > INT16_MAX || li < INT16_MIN)
return -ERANGE;

*converted = (int16_t) li;
return 0;
}

/*
* This function converts double to int8
* Input: double d, int8 *converted
* Ouput: int
*/
int
json_double_to_int8 (double d, int8_t *converted)
{
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
json_double_to_uint (double d, unsigned int *converted)
{
unsigned long long int ull;
ull = (unsigned long long int) d;

if (ull > UINT_MAX)
return -ERANGE;

*converted = (unsigned int) ull;
return 0;
}

/*
* This function converts double to uint64
* Input: double d, uint64_t *converted
* Ouput: int
*/
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;
}

/*
* This function converts double to uint32
* Input: double d, uint32_t *converted
* Ouput: int
*/
int
json_double_to_uint32 (double d, uint32_t *converted)
{
unsigned long long int ull;
ull = (unsigned long long int) d;

if (ull > UINT32_MAX)
return -ERANGE;

*converted = (uint32_t) ull;
return 0;
}

/*
* This function converts double to uint16
* Input: double d, uint16_t *converted
* Ouput: int
*/
int
json_double_to_uint16 (double d, uint16_t *converted)
{
unsigned long int uli;
uli = (unsigned long int) d;
if (uli > UINT16_MAX)
return -ERANGE;

*converted = (uint16_t) uli;
return 0;
}

/*
* This function converts double to uint8
* Input: double d, uint8_t *converted
* Ouput: int
*/
int
json_double_to_uint8 (double d, uint8_t *converted)
{
unsigned long int uli;
uli = (unsigned long int) d;

if (uli > UINT8_MAX)
return -ERANGE;

*converted = (uint8_t) uli;
return 0;
}

/*
* This function converts double to double, kind of silly :)
* Input: double d, double *converted
* Ouput: int
*/
int
json_double_to_double (double d, double *converted)
{
*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)
{
Expand Down Expand Up @@ -1719,3 +1900,40 @@ json_marshal_string (const char *str, size_t length, const struct parser_context

return json_buf;
}

/*
This function is temporary function to convert yajl_val. This fuction will
not be required once we completely move to jansson
Input: yajl_val
Output: json_t
*/
json_t *yajl_to_json(yajl_val val) {
if YAJL_IS_NULL(val) {
return json_null();
} else if (YAJL_IS_TRUE(val)) {
return json_true();
} else if (YAJL_IS_FALSE(val)) {
return json_false();
} else if (YAJL_IS_DOUBLE(val)) {
return json_real(YAJL_GET_DOUBLE(val));
} else if (YAJL_IS_INTEGER(val)) {
return json_integer(YAJL_GET_INTEGER(val));
} else if (YAJL_IS_STRING(val)) {
return json_string(YAJL_GET_STRING(val));
} else if (YAJL_IS_ARRAY(val)) {
json_t *jansson_array = json_array();
for (size_t i = 0; i < val->u.array.len; i++) {
json_array_append(jansson_array, yajl_to_json(val->u.array.values[i]));
}
return jansson_array;
} else {
json_t *jansson_object = json_object();
for (size_t i = 0; i < val->u.object.len; i++) {
json_object_set_new(jansson_object, val->u.object.keys[i], yajl_to_json(val->u.object.values[i]));
}
return jansson_object;
}
return NULL;
}
24 changes: 24 additions & 0 deletions src/ocispec/json_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <stdint.h>
#include <yajl/yajl_tree.h>
#include <yajl/yajl_gen.h>
#include <jansson.h>

#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -115,6 +116,28 @@ int common_safe_int64 (const char *numstr, int64_t *converted);

int common_safe_int (const char *numstr, int *converted);

int json_double_to_int (double d, int *converted);

int json_double_to_int64 (double d, int64_t *converted);

int json_double_to_int32 (double d, int32_t *converted);

int json_double_to_int16 (double d, int16_t *converted);

int json_double_to_int8 (double d, int8_t *converted);

int json_double_to_uint (double d, unsigned int *converted);

int json_double_to_uint64 (double d, uint64_t *converted);

int json_double_to_uint32 (double d, uint32_t *converted);

int json_double_to_uint16 (double d, uint16_t *converted);

int json_double_to_uint8 (double d, uint8_t *converted);

int json_double_to_double (double d, double *converted);

typedef struct
{
int *keys;
Expand Down Expand Up @@ -231,6 +254,7 @@ int append_json_map_string_string (json_map_string_string *map, const char *key,

char *json_marshal_string (const char *str, size_t length, const struct parser_context *ctx, parser_error *err);

json_t *yajl_to_json(yajl_val val);
#ifdef __cplusplus
}
#endif
Expand Down
Loading

0 comments on commit 216f6f7

Please sign in to comment.