Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Moving From YAJL to Jansson #141

Merged
merged 2 commits into from
Nov 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 ..
xw19 marked this conversation as resolved.
Show resolved Hide resolved

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