From add7b13a9ae633cc41ebf6a42f717df126393c8a Mon Sep 17 00:00:00 2001 From: David McCann Date: Wed, 13 May 2020 15:57:54 +0100 Subject: Improved support for IBM operating systems Fix compiler errors and warnings when building on IBM operating systems such as AIX and IBM i. --- json_c_version.h | 8 ++++++++ json_object.c | 9 ++++++++- json_tokener.c | 3 +++ json_visit.h | 8 ++++++++ strerror_override.c | 2 ++ tests/test_json_pointer.c | 10 +++++----- tests/test_parse.c | 6 +++--- tests/test_util_file.c | 4 ++-- 8 files changed, 39 insertions(+), 11 deletions(-) diff --git a/json_c_version.h b/json_c_version.h index c0385c4..84b6b3e 100644 --- a/json_c_version.h +++ b/json_c_version.h @@ -12,6 +12,10 @@ #ifndef _json_c_version_h_ #define _json_c_version_h_ +#ifdef __cplusplus +extern "C" { +#endif + #define JSON_C_MAJOR_VERSION 0 #define JSON_C_MINOR_VERSION 14 #define JSON_C_MICRO_VERSION 99 @@ -44,4 +48,8 @@ JSON_EXPORT const char *json_c_version(void); /* Returns JSON_C_VERSION */ */ JSON_EXPORT int json_c_version_num(void); /* Returns JSON_C_VERSION_NUM */ +#ifdef __cplusplus +} +#endif + #endif diff --git a/json_object.c b/json_object.c index d5ac465..527cd31 100644 --- a/json_object.c +++ b/json_object.c @@ -58,6 +58,8 @@ static json_object_to_json_string_fn _json_object_userdata_to_json_string; #ifndef JSON_NORETURN #if defined(_MSC_VER) #define JSON_NORETURN __declspec(noreturn) +#elif defined(__OS400__) +#define JSON_NORETURN #else /* 'cold' attribute is for optimization, telling the computer this code * path is unlikely. @@ -901,11 +903,15 @@ static int json_object_double_to_json_string_format(struct json_object *jso, str * ECMA 262 section 9.8.1 defines * how to handle these cases as strings */ +#ifdef HAVE_DECL_ISNAN if (isnan(jso->o.c_double)) { size = snprintf(buf, sizeof(buf), "NaN"); } - else if (isinf(jso->o.c_double)) + else +#endif +#ifdef HAVE_DECL_ISINF + if (isinf(jso->o.c_double)) { if (jso->o.c_double > 0) size = snprintf(buf, sizeof(buf), "Infinity"); @@ -913,6 +919,7 @@ static int json_object_double_to_json_string_format(struct json_object *jso, str size = snprintf(buf, sizeof(buf), "-Infinity"); } else +#endif { const char *std_format = "%.17g"; int format_drops_decimals = 0; diff --git a/json_tokener.c b/json_tokener.c index 40933ff..0373d6f 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -40,6 +40,9 @@ #ifdef HAVE_XLOCALE_H #include #endif +#ifdef HAVE_STRINGS_H +#include +#endif /* HAVE_STRINGS_H */ #define jt_hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x)&7) + 9) diff --git a/json_visit.h b/json_visit.h index de6582a..35c46f5 100644 --- a/json_visit.h +++ b/json_visit.h @@ -8,6 +8,10 @@ */ #include "json_object.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef int(json_c_visit_userfunc)(json_object *jso, int flags, json_object *parent_jso, const char *jso_key, size_t *jso_index, void *userarg); @@ -90,4 +94,8 @@ JSON_EXPORT int json_c_visit(json_object *jso, int future_flags, json_c_visit_us */ #define JSON_C_VISIT_RETURN_ERROR -1 +#ifdef __cplusplus +} +#endif + #endif /* _json_c_json_visit_h_ */ diff --git a/strerror_override.c b/strerror_override.c index 041bd92..a93be38 100644 --- a/strerror_override.c +++ b/strerror_override.c @@ -20,7 +20,9 @@ static struct ENTRY(EIO), ENTRY(ENXIO), ENTRY(E2BIG), +#ifdef ENOEXEC ENTRY(ENOEXEC), +#endif ENTRY(EBADF), ENTRY(ECHILD), ENTRY(EDEADLK), diff --git a/tests/test_json_pointer.c b/tests/test_json_pointer.c index 7ad9905..34fa202 100644 --- a/tests/test_json_pointer.c +++ b/tests/test_json_pointer.c @@ -60,7 +60,7 @@ static const char *rec_input_json_str = /* clang-format on */ /* Example from RFC */ -static void test_example_get() +static void test_example_get(void) { int i; struct json_object *jo1, *jo2, *jo3; @@ -126,7 +126,7 @@ static void test_example_get() } /* I'm not too happy with the RFC example to test the recusion of the json_pointer_get() function */ -static void test_recursion_get() +static void test_recursion_get(void) { struct json_object *jo2, *jo1 = json_tokener_parse(rec_input_json_str); @@ -161,7 +161,7 @@ static void test_recursion_get() json_object_put(jo1); } -static void test_wrong_inputs_get() +static void test_wrong_inputs_get(void) { struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str); @@ -231,7 +231,7 @@ static void test_wrong_inputs_get() json_object_put(jo1); } -static void test_example_set() +static void test_example_set(void) { struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str); @@ -272,7 +272,7 @@ static void test_example_set() json_object_put(jo1); } -static void test_wrong_inputs_set() +static void test_wrong_inputs_set(void) { struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str); diff --git a/tests/test_parse.c b/tests/test_parse.c index 895f971..6014ac1 100644 --- a/tests/test_parse.c +++ b/tests/test_parse.c @@ -149,8 +149,8 @@ static void test_utf8_parse() // json_tokener_parse doesn't support checking for byte order marks. // It's the responsibility of the caller to detect and skip a BOM. // Both of these checks return null. - char utf8_bom[] = {0xEF, 0xBB, 0xBF, 0x00}; - char utf8_bom_and_chars[] = {0xEF, 0xBB, 0xBF, '{', '}', 0x00}; + char* utf8_bom = "\xEF\xBB\xBF"; + char* utf8_bom_and_chars = "\xEF\xBB\xBF{}"; single_basic_parse(utf8_bom, 0); single_basic_parse(utf8_bom_and_chars, 0); } @@ -446,7 +446,7 @@ static void test_incremental_parse() json_tokener_set_flags(tok, step->tok_flags); if (length == -1) - length = strlen(step->string_to_parse); + length = (int)strlen(step->string_to_parse); if (step->char_offset == -1) expected_char_offset = length; else diff --git a/tests/test_util_file.c b/tests/test_util_file.c index 2f8f8b5..9d50663 100644 --- a/tests/test_util_file.c +++ b/tests/test_util_file.c @@ -24,10 +24,10 @@ static void test_read_valid_with_fd(const char *testdir); static void test_read_valid_nested_with_fd(const char *testdir); -static void test_read_nonexistant(); +static void test_read_nonexistant(void); static void test_read_closed(void); -static void test_write_to_file(); +static void test_write_to_file(void); static void stat_and_cat(const char *file); static void test_read_fd_equal(const char *testdir); -- cgit v1.2.1