mirror of
https://github.com/json-c/json-c.git
synced 2026-04-05 13:29:06 +08:00
Merge some old work to include (some of) PR #464 into the current master branch.
This commit is contained in:
@@ -23,6 +23,8 @@ AllowShortFunctionsOnASingleLine: Empty
|
|||||||
BreakBeforeBraces: Custom
|
BreakBeforeBraces: Custom
|
||||||
# Control of individual brace wrapping cases.
|
# Control of individual brace wrapping cases.
|
||||||
BraceWrapping:
|
BraceWrapping:
|
||||||
|
# Wrap brackets inside of a case
|
||||||
|
AfterCaseLabel: true
|
||||||
# Wrap class definition.
|
# Wrap class definition.
|
||||||
AfterClass: true
|
AfterClass: true
|
||||||
# Wrap control statements
|
# Wrap control statements
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -70,6 +70,7 @@
|
|||||||
# It's not good practice to build directly in the source tree
|
# It's not good practice to build directly in the source tree
|
||||||
# but ignore cmake auto-generated files anyway:
|
# but ignore cmake auto-generated files anyway:
|
||||||
/json_config.h
|
/json_config.h
|
||||||
|
/json.h
|
||||||
/config.h
|
/config.h
|
||||||
/json-c.pc
|
/json-c.pc
|
||||||
/Makefile
|
/Makefile
|
||||||
|
|||||||
@@ -79,6 +79,10 @@ include(CMakePackageConfigHelpers)
|
|||||||
option(BUILD_SHARED_LIBS "Default to building shared libraries" ON)
|
option(BUILD_SHARED_LIBS "Default to building shared libraries" ON)
|
||||||
option(BUILD_STATIC_LIBS "Default to building static libraries" ON)
|
option(BUILD_STATIC_LIBS "Default to building static libraries" ON)
|
||||||
|
|
||||||
|
if (BUILD_SHARED_LIBS)
|
||||||
|
add_definitions(-D JSON_C_DLL)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Generate a release merge and test it to verify the correctness of republishing the package.
|
# Generate a release merge and test it to verify the correctness of republishing the package.
|
||||||
ADD_CUSTOM_TARGET(distcheck
|
ADD_CUSTOM_TARGET(distcheck
|
||||||
COMMAND make package_source
|
COMMAND make package_source
|
||||||
@@ -97,6 +101,8 @@ option(DISABLE_WERROR "Avoid treating compiler warnings as fatal
|
|||||||
option(ENABLE_RDRAND "Enable RDRAND Hardware RNG Hash Seed." OFF)
|
option(ENABLE_RDRAND "Enable RDRAND Hardware RNG Hash Seed." OFF)
|
||||||
option(ENABLE_THREADING "Enable partial threading support." OFF)
|
option(ENABLE_THREADING "Enable partial threading support." OFF)
|
||||||
option(OVERRIDE_GET_RANDOM_SEED "Override json_c_get_random_seed() with custom code." OFF)
|
option(OVERRIDE_GET_RANDOM_SEED "Override json_c_get_random_seed() with custom code." OFF)
|
||||||
|
option(DISABLE_EXTRA_LIBS "Avoid linking against extra libraries, such as libbsd." OFF)
|
||||||
|
option(DISABLE_JSON_POINTER "Disable JSON pointer (RFC6901) support." OFF)
|
||||||
|
|
||||||
|
|
||||||
if (UNIX OR MINGW OR CYGWIN)
|
if (UNIX OR MINGW OR CYGWIN)
|
||||||
@@ -148,7 +154,10 @@ check_include_file(sys/random.h HAVE_SYS_RANDOM_H)
|
|||||||
check_include_file(sys/stat.h HAVE_SYS_STAT_H)
|
check_include_file(sys/stat.h HAVE_SYS_STAT_H)
|
||||||
check_include_file(xlocale.h HAVE_XLOCALE_H)
|
check_include_file(xlocale.h HAVE_XLOCALE_H)
|
||||||
|
|
||||||
if (HAVE_INTTYPES_H AND NOT MSVC)
|
if (HAVE_INTTYPES_H)
|
||||||
|
# Set a json-c specific var to stamp into json_config.h
|
||||||
|
# in a way that hopefull ywon't conflict with other
|
||||||
|
# projects that use json-c.
|
||||||
set(JSON_C_HAVE_INTTYPES_H 1)
|
set(JSON_C_HAVE_INTTYPES_H 1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -170,6 +179,17 @@ check_symbol_exists(vasprintf "stdio.h" HAVE_VASPRINTF)
|
|||||||
check_symbol_exists(vsnprintf "stdio.h" HAVE_VSNPRINTF)
|
check_symbol_exists(vsnprintf "stdio.h" HAVE_VSNPRINTF)
|
||||||
check_symbol_exists(vprintf "stdio.h" HAVE_VPRINTF)
|
check_symbol_exists(vprintf "stdio.h" HAVE_VPRINTF)
|
||||||
|
|
||||||
|
check_symbol_exists(arc4random "stdlib.h" HAVE_ARC4RANDOM)
|
||||||
|
if (NOT HAVE_ARC4RANDOM AND DISABLE_EXTRA_LIBS STREQUAL "OFF")
|
||||||
|
check_include_file(bsd/stdlib.h HAVE_BSD_STDLIB_H)
|
||||||
|
if (HAVE_BSD_STDLIB_H)
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "-lbsd")
|
||||||
|
link_libraries(bsd)
|
||||||
|
unset(HAVE_ARC4RANDOM CACHE)
|
||||||
|
check_symbol_exists(arc4random "bsd/stdlib.h" HAVE_ARC4RANDOM)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if (HAVE_FCNTL_H)
|
if (HAVE_FCNTL_H)
|
||||||
check_symbol_exists(open "fcntl.h" HAVE_OPEN)
|
check_symbol_exists(open "fcntl.h" HAVE_OPEN)
|
||||||
endif()
|
endif()
|
||||||
@@ -269,7 +289,7 @@ message(STATUS "Wrote ${PROJECT_BINARY_DIR}/config.h")
|
|||||||
configure_file(${PROJECT_SOURCE_DIR}/cmake/json_config.h.in ${PROJECT_BINARY_DIR}/json_config.h)
|
configure_file(${PROJECT_SOURCE_DIR}/cmake/json_config.h.in ${PROJECT_BINARY_DIR}/json_config.h)
|
||||||
message(STATUS "Wrote ${PROJECT_BINARY_DIR}/json_config.h")
|
message(STATUS "Wrote ${PROJECT_BINARY_DIR}/json_config.h")
|
||||||
|
|
||||||
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
|
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
|
||||||
if ("${DISABLE_WERROR}" STREQUAL "OFF")
|
if ("${DISABLE_WERROR}" STREQUAL "OFF")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
|
||||||
@@ -358,14 +378,13 @@ set(JSON_C_PUBLIC_HEADERS
|
|||||||
# Note: config.h is _not_ included here
|
# Note: config.h is _not_ included here
|
||||||
${PROJECT_BINARY_DIR}/json_config.h
|
${PROJECT_BINARY_DIR}/json_config.h
|
||||||
|
|
||||||
${PROJECT_SOURCE_DIR}/json.h
|
${PROJECT_BINARY_DIR}/json.h
|
||||||
${PROJECT_SOURCE_DIR}/arraylist.h
|
${PROJECT_SOURCE_DIR}/arraylist.h
|
||||||
${PROJECT_SOURCE_DIR}/debug.h
|
${PROJECT_SOURCE_DIR}/debug.h
|
||||||
${PROJECT_SOURCE_DIR}/json_c_version.h
|
${PROJECT_SOURCE_DIR}/json_c_version.h
|
||||||
${PROJECT_SOURCE_DIR}/json_inttypes.h
|
${PROJECT_SOURCE_DIR}/json_inttypes.h
|
||||||
${PROJECT_SOURCE_DIR}/json_object.h
|
${PROJECT_SOURCE_DIR}/json_object.h
|
||||||
${PROJECT_SOURCE_DIR}/json_object_iterator.h
|
${PROJECT_SOURCE_DIR}/json_object_iterator.h
|
||||||
${PROJECT_SOURCE_DIR}/json_pointer.h
|
|
||||||
${PROJECT_SOURCE_DIR}/json_tokener.h
|
${PROJECT_SOURCE_DIR}/json_tokener.h
|
||||||
${PROJECT_SOURCE_DIR}/json_types.h
|
${PROJECT_SOURCE_DIR}/json_types.h
|
||||||
${PROJECT_SOURCE_DIR}/json_util.h
|
${PROJECT_SOURCE_DIR}/json_util.h
|
||||||
@@ -392,7 +411,6 @@ set(JSON_C_SOURCES
|
|||||||
${PROJECT_SOURCE_DIR}/json_c_version.c
|
${PROJECT_SOURCE_DIR}/json_c_version.c
|
||||||
${PROJECT_SOURCE_DIR}/json_object.c
|
${PROJECT_SOURCE_DIR}/json_object.c
|
||||||
${PROJECT_SOURCE_DIR}/json_object_iterator.c
|
${PROJECT_SOURCE_DIR}/json_object_iterator.c
|
||||||
${PROJECT_SOURCE_DIR}/json_pointer.c
|
|
||||||
${PROJECT_SOURCE_DIR}/json_tokener.c
|
${PROJECT_SOURCE_DIR}/json_tokener.c
|
||||||
${PROJECT_SOURCE_DIR}/json_util.c
|
${PROJECT_SOURCE_DIR}/json_util.c
|
||||||
${PROJECT_SOURCE_DIR}/json_visit.c
|
${PROJECT_SOURCE_DIR}/json_visit.c
|
||||||
@@ -402,16 +420,28 @@ set(JSON_C_SOURCES
|
|||||||
${PROJECT_SOURCE_DIR}/strerror_override.c
|
${PROJECT_SOURCE_DIR}/strerror_override.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (NOT DISABLE_JSON_POINTER)
|
||||||
|
set(JSON_C_PUBLIC_HEADERS ${JSON_C_PUBLIC_HEADERS} ${PROJECT_SOURCE_DIR}/json_pointer.h)
|
||||||
|
set(JSON_C_SOURCES ${JSON_C_SOURCES} ${PROJECT_SOURCE_DIR}/json_pointer.c)
|
||||||
|
set(JSON_H_JSON_POINTER "#include \"json_pointer.h\"")
|
||||||
|
else()
|
||||||
|
set(JSON_H_JSON_POINTER "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
configure_file(json.h.cmakein ${PROJECT_BINARY_DIR}/json.h @ONLY)
|
||||||
|
|
||||||
include_directories(${PROJECT_SOURCE_DIR})
|
include_directories(${PROJECT_SOURCE_DIR})
|
||||||
include_directories(${PROJECT_BINARY_DIR})
|
include_directories(${PROJECT_BINARY_DIR})
|
||||||
|
|
||||||
add_subdirectory(doc)
|
add_subdirectory(doc)
|
||||||
|
|
||||||
# uninstall
|
# uninstall
|
||||||
add_custom_target(uninstall
|
if(NOT TARGET uninstall)
|
||||||
COMMAND cat ${PROJECT_BINARY_DIR}/install_manifest.txt | xargs rm
|
add_custom_target(uninstall
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
COMMAND cat ${PROJECT_BINARY_DIR}/install_manifest.txt | xargs rm
|
||||||
)
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
# XXX for a normal full distribution we'll need to figure out
|
# XXX for a normal full distribution we'll need to figure out
|
||||||
# XXX how to build both shared and static libraries.
|
# XXX how to build both shared and static libraries.
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ Create the release tarballs:
|
|||||||
echo .git > excludes
|
echo .git > excludes
|
||||||
tar -czf json-c-${release}.tar.gz -X excludes json-c-${release}
|
tar -czf json-c-${release}.tar.gz -X excludes json-c-${release}
|
||||||
|
|
||||||
echo doc >> excludes
|
echo 'doc/*' >> excludes
|
||||||
tar -czf json-c-${release}-nodoc.tar.gz -X excludes json-c-${release}
|
tar -czf json-c-${release}-nodoc.tar.gz -X excludes json-c-${release}
|
||||||
|
|
||||||
------------
|
------------
|
||||||
|
|||||||
@@ -82,7 +82,8 @@ static int parseit(int fd, int (*callback)(struct json_object *))
|
|||||||
int parse_end = json_tokener_get_parse_end(tok);
|
int parse_end = json_tokener_get_parse_end(tok);
|
||||||
if (obj == NULL && jerr != json_tokener_continue)
|
if (obj == NULL && jerr != json_tokener_continue)
|
||||||
{
|
{
|
||||||
char *aterr = &buf[start_pos + parse_end];
|
char *aterr = (start_pos + parse_end < sizeof(buf)) ?
|
||||||
|
&buf[start_pos + parse_end] : "";
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
int fail_offset = total_read - ret + start_pos + parse_end;
|
int fail_offset = total_read - ret + start_pos + parse_end;
|
||||||
fprintf(stderr, "Failed at offset %d: %s %c\n", fail_offset,
|
fprintf(stderr, "Failed at offset %d: %s %c\n", fail_offset,
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ struct array_list *array_list_new2(array_list_free_fn *free_fn, int initial_size
|
|||||||
{
|
{
|
||||||
struct array_list *arr;
|
struct array_list *arr;
|
||||||
|
|
||||||
|
if (initial_size < 0 || (size_t)initial_size >= SIZE_T_MAX / sizeof(void *))
|
||||||
|
return NULL;
|
||||||
arr = (struct array_list *)malloc(sizeof(struct array_list));
|
arr = (struct array_list *)malloc(sizeof(struct array_list));
|
||||||
if (!arr)
|
if (!arr)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -106,6 +108,8 @@ int array_list_shrink(struct array_list *arr, size_t empty_slots)
|
|||||||
void *t;
|
void *t;
|
||||||
size_t new_size;
|
size_t new_size;
|
||||||
|
|
||||||
|
if (empty_slots >= SIZE_T_MAX / sizeof(void *) - arr->length)
|
||||||
|
return -1;
|
||||||
new_size = arr->length + empty_slots;
|
new_size = arr->length + empty_slots;
|
||||||
if (new_size == arr->size)
|
if (new_size == arr->size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -15,8 +15,8 @@
|
|||||||
* Although this is exposed by the json_object_get_array() method,
|
* Although this is exposed by the json_object_get_array() method,
|
||||||
* it is not recommended for direct use.
|
* it is not recommended for direct use.
|
||||||
*/
|
*/
|
||||||
#ifndef _arraylist_h_
|
#ifndef _json_c_arraylist_h_
|
||||||
#define _arraylist_h_
|
#define _json_c_arraylist_h_
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ $0 [<configure_options>] [-- [<cmake options>]]
|
|||||||
--enable-static build static libraries [default=yes]
|
--enable-static build static libraries [default=yes]
|
||||||
--disable-Bsymbolic Avoid linking with -Bsymbolic-function
|
--disable-Bsymbolic Avoid linking with -Bsymbolic-function
|
||||||
--disable-werror Avoid treating compiler warnings as fatal errors
|
--disable-werror Avoid treating compiler warnings as fatal errors
|
||||||
|
--disable-extra-libs Avoid linking against extra libraries, such as libbsd
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
exit
|
exit
|
||||||
@@ -73,6 +74,9 @@ while [ $# -gt 0 ] ; do
|
|||||||
--disable-werror)
|
--disable-werror)
|
||||||
FLAGS+=(-DDISABLE_WERROR=ON)
|
FLAGS+=(-DDISABLE_WERROR=ON)
|
||||||
;;
|
;;
|
||||||
|
--disable-extra-libs)
|
||||||
|
FLAGS+=(-DDISABLE_EXTRA_LIBS=ON)
|
||||||
|
;;
|
||||||
--)
|
--)
|
||||||
shift
|
shift
|
||||||
break
|
break
|
||||||
|
|||||||
@@ -74,6 +74,12 @@
|
|||||||
/* Define to 1 if you have the <xlocale.h> header file. */
|
/* Define to 1 if you have the <xlocale.h> header file. */
|
||||||
#cmakedefine HAVE_XLOCALE_H
|
#cmakedefine HAVE_XLOCALE_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <bsd/stdlib.h> header file. */
|
||||||
|
#cmakedefine HAVE_BSD_STDLIB_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have `arc4random' */
|
||||||
|
#cmakedefine HAVE_ARC4RANDOM
|
||||||
|
|
||||||
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
|
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
|
||||||
#cmakedefine HAVE_DOPRNT
|
#cmakedefine HAVE_DOPRNT
|
||||||
|
|
||||||
|
|||||||
6
debug.h
6
debug.h
@@ -14,8 +14,8 @@
|
|||||||
* @file
|
* @file
|
||||||
* @brief Do not use, json-c internal, may be changed or removed at any time.
|
* @brief Do not use, json-c internal, may be changed or removed at any time.
|
||||||
*/
|
*/
|
||||||
#ifndef _DEBUG_H_
|
#ifndef _JSON_C_DEBUG_H_
|
||||||
#define _DEBUG_H_
|
#define _JSON_C_DEBUG_H_
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef JSON_EXPORT
|
#ifndef JSON_EXPORT
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && defined(JSON_C_DLL)
|
||||||
#define JSON_EXPORT __declspec(dllexport)
|
#define JSON_EXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define JSON_EXPORT extern
|
#define JSON_EXPORT extern
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ extern "C" {
|
|||||||
#include "json_c_version.h"
|
#include "json_c_version.h"
|
||||||
#include "json_object.h"
|
#include "json_object.h"
|
||||||
#include "json_object_iterator.h"
|
#include "json_object_iterator.h"
|
||||||
#include "json_pointer.h"
|
@JSON_H_JSON_POINTER@
|
||||||
#include "json_tokener.h"
|
#include "json_tokener.h"
|
||||||
#include "json_util.h"
|
#include "json_util.h"
|
||||||
#include "linkhash.h"
|
#include "linkhash.h"
|
||||||
@@ -24,7 +24,7 @@ extern "C" {
|
|||||||
#define JSON_C_VERSION "0.15.99"
|
#define JSON_C_VERSION "0.15.99"
|
||||||
|
|
||||||
#ifndef JSON_EXPORT
|
#ifndef JSON_EXPORT
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && defined(JSON_C_DLL)
|
||||||
#define JSON_EXPORT __declspec(dllexport)
|
#define JSON_EXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define JSON_EXPORT extern
|
#define JSON_EXPORT extern
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ static inline const char *get_string_component(const struct json_object *jso)
|
|||||||
|
|
||||||
static int json_escape_str(struct printbuf *pb, const char *str, size_t len, int flags)
|
static int json_escape_str(struct printbuf *pb, const char *str, size_t len, int flags)
|
||||||
{
|
{
|
||||||
int pos = 0, start_offset = 0;
|
size_t pos = 0, start_offset = 0;
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
while (len--)
|
while (len--)
|
||||||
{
|
{
|
||||||
@@ -237,7 +237,7 @@ static int json_escape_str(struct printbuf *pb, const char *str, size_t len, int
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pos - start_offset > 0)
|
if (pos > start_offset)
|
||||||
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
||||||
|
|
||||||
if (c == '\b')
|
if (c == '\b')
|
||||||
@@ -263,7 +263,7 @@ static int json_escape_str(struct printbuf *pb, const char *str, size_t len, int
|
|||||||
if (c < ' ')
|
if (c < ' ')
|
||||||
{
|
{
|
||||||
char sbuf[7];
|
char sbuf[7];
|
||||||
if (pos - start_offset > 0)
|
if (pos > start_offset)
|
||||||
printbuf_memappend(pb, str + start_offset,
|
printbuf_memappend(pb, str + start_offset,
|
||||||
pos - start_offset);
|
pos - start_offset);
|
||||||
snprintf(sbuf, sizeof(sbuf), "\\u00%c%c", json_hex_chars[c >> 4],
|
snprintf(sbuf, sizeof(sbuf), "\\u00%c%c", json_hex_chars[c >> 4],
|
||||||
@@ -275,7 +275,7 @@ static int json_escape_str(struct printbuf *pb, const char *str, size_t len, int
|
|||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pos - start_offset > 0)
|
if (pos > start_offset)
|
||||||
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1256,17 +1256,17 @@ static struct json_object *_json_object_new_string(const char *s, const size_t l
|
|||||||
struct json_object_string *jso;
|
struct json_object_string *jso;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Structures Actual memory layout
|
* Structures Actual memory layout
|
||||||
* ------------------- --------------------
|
* ------------------- --------------------
|
||||||
* [json_object_string [json_object_string
|
* [json_object_string [json_object_string
|
||||||
* [json_object] [json_object]
|
* [json_object] [json_object]
|
||||||
* ...other fields... ...other fields...
|
* ...other fields... ...other fields...
|
||||||
* c_string] len
|
* c_string] len
|
||||||
* bytes
|
* bytes
|
||||||
* of
|
* of
|
||||||
* string
|
* string
|
||||||
* data
|
* data
|
||||||
* \0]
|
* \0]
|
||||||
*/
|
*/
|
||||||
if (len > (SSIZE_T_MAX - (sizeof(*jso) - sizeof(jso->c_string)) - 1))
|
if (len > (SSIZE_T_MAX - (sizeof(*jso) - sizeof(jso->c_string)) - 1))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1333,9 +1333,10 @@ static int _json_object_set_string_len(json_object *jso, const char *s, size_t l
|
|||||||
if (jso == NULL || jso->o_type != json_type_string)
|
if (jso == NULL || jso->o_type != json_type_string)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (len >= SSIZE_T_MAX - 1)
|
if (len >= INT_MAX - 1)
|
||||||
// jso->len is a signed ssize_t, so it can't hold the
|
// jso->len is a signed ssize_t, so it can't hold the
|
||||||
// full size_t range.
|
// full size_t range. json_object_get_string_len returns
|
||||||
|
// length as int, cap length at INT_MAX.
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
dstbuf = get_string_component_mutable(jso);
|
dstbuf = get_string_component_mutable(jso);
|
||||||
@@ -1732,7 +1733,7 @@ static int json_object_deep_copy_recursive(struct json_object *src, struct json_
|
|||||||
/* This handles the `json_type_null` case */
|
/* This handles the `json_type_null` case */
|
||||||
if (!iter.val)
|
if (!iter.val)
|
||||||
jso = NULL;
|
jso = NULL;
|
||||||
else if (json_object_deep_copy_recursive(iter.val, src, iter.key, -1, &jso,
|
else if (json_object_deep_copy_recursive(iter.val, src, iter.key, UINT_MAX, &jso,
|
||||||
shallow_copy) < 0)
|
shallow_copy) < 0)
|
||||||
{
|
{
|
||||||
json_object_put(jso);
|
json_object_put(jso);
|
||||||
@@ -1797,7 +1798,7 @@ int json_object_deep_copy(struct json_object *src, struct json_object **dst,
|
|||||||
if (shallow_copy == NULL)
|
if (shallow_copy == NULL)
|
||||||
shallow_copy = json_c_shallow_copy_default;
|
shallow_copy = json_c_shallow_copy_default;
|
||||||
|
|
||||||
rc = json_object_deep_copy_recursive(src, NULL, NULL, -1, dst, shallow_copy);
|
rc = json_object_deep_copy_recursive(src, NULL, NULL, UINT_MAX, dst, shallow_copy);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
{
|
{
|
||||||
json_object_put(*dst);
|
json_object_put(*dst);
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ JSON_EXPORT void json_object_object_del(struct json_object *obj, const char *key
|
|||||||
* @param val the local name for the json_object* object variable defined in
|
* @param val the local name for the json_object* object variable defined in
|
||||||
* the body
|
* the body
|
||||||
*/
|
*/
|
||||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L
|
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
|
||||||
|
|
||||||
#define json_object_object_foreach(obj, key, val) \
|
#define json_object_object_foreach(obj, key, val) \
|
||||||
char *key = NULL; \
|
char *key = NULL; \
|
||||||
@@ -502,7 +502,7 @@ JSON_EXPORT void json_object_object_del(struct json_object *obj, const char *key
|
|||||||
: 0); \
|
: 0); \
|
||||||
entry##key = entry_next##key)
|
entry##key = entry_next##key)
|
||||||
|
|
||||||
#endif /* defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L */
|
#endif /* defined(__GNUC__) && !defined(__STRICT_ANSI__) && (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) */
|
||||||
|
|
||||||
/** Iterate through all keys and values of an object (ANSI C Safe)
|
/** Iterate through all keys and values of an object (ANSI C Safe)
|
||||||
* @param obj the json_object instance
|
* @param obj the json_object instance
|
||||||
@@ -656,8 +656,9 @@ JSON_EXPORT struct json_object *json_object_new_boolean(json_bool b);
|
|||||||
* The type is coerced to a json_bool if the passed object is not a json_bool.
|
* The type is coerced to a json_bool if the passed object is not a json_bool.
|
||||||
* integer and double objects will return 0 if there value is zero
|
* integer and double objects will return 0 if there value is zero
|
||||||
* or 1 otherwise. If the passed object is a string it will return
|
* or 1 otherwise. If the passed object is a string it will return
|
||||||
* 1 if it has a non zero length. If any other object type is passed
|
* 1 if it has a non zero length.
|
||||||
* 1 will be returned if the object is not NULL.
|
* If any other object type is passed 0 will be returned, even non-empty
|
||||||
|
* json_type_array and json_type_object objects.
|
||||||
*
|
*
|
||||||
* @param obj the json_object instance
|
* @param obj the json_object instance
|
||||||
* @returns a json_bool
|
* @returns a json_bool
|
||||||
|
|||||||
@@ -155,6 +155,12 @@ struct json_tokener *json_tokener_new_ex(int depth)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
tok->pb = printbuf_new();
|
tok->pb = printbuf_new();
|
||||||
|
if (!tok->pb)
|
||||||
|
{
|
||||||
|
free(tok);
|
||||||
|
free(tok->stack);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
tok->max_depth = depth;
|
tok->max_depth = depth;
|
||||||
json_tokener_reset(tok);
|
json_tokener_reset(tok);
|
||||||
return tok;
|
return tok;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef JSON_EXPORT
|
#ifndef JSON_EXPORT
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && defined(JSON_C_DLL)
|
||||||
#define JSON_EXPORT __declspec(dllexport)
|
#define JSON_EXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define JSON_EXPORT extern
|
#define JSON_EXPORT extern
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
* this is exposed by the json_object_get_object() function and within the
|
* this is exposed by the json_object_get_object() function and within the
|
||||||
* json_object_iter type, it is not recommended for direct use.
|
* json_object_iter type, it is not recommended for direct use.
|
||||||
*/
|
*/
|
||||||
#ifndef _linkhash_h_
|
#ifndef _json_c_linkhash_h_
|
||||||
#define _linkhash_h_
|
#define _json_c_linkhash_h_
|
||||||
|
|
||||||
#include "json_object.h"
|
#include "json_object.h"
|
||||||
|
|
||||||
|
|||||||
@@ -20,11 +20,11 @@
|
|||||||
* json_object_set_serializer() direct use of this is not
|
* json_object_set_serializer() direct use of this is not
|
||||||
* recommended.
|
* recommended.
|
||||||
*/
|
*/
|
||||||
#ifndef _printbuf_h_
|
#ifndef _json_c_printbuf_h_
|
||||||
#define _printbuf_h_
|
#define _json_c_printbuf_h_
|
||||||
|
|
||||||
#ifndef JSON_EXPORT
|
#ifndef JSON_EXPORT
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && defined(JSON_C_DLL)
|
||||||
#define JSON_EXPORT __declspec(dllexport)
|
#define JSON_EXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define JSON_EXPORT extern
|
#define JSON_EXPORT extern
|
||||||
|
|||||||
108
random_seed.c
108
random_seed.c
@@ -13,9 +13,23 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "strerror_override.h"
|
#include "strerror_override.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifdef HAVE_BSD_STDLIB_H
|
||||||
|
#include <bsd/stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEBUG_SEED(s)
|
#define DEBUG_SEED(s)
|
||||||
|
|
||||||
|
#if defined(__APPLE__) || defined(__unix__) || defined(__linux__)
|
||||||
|
#define HAVE_DEV_RANDOM 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_ARC4RANDOM
|
||||||
|
#undef HAVE_GETRANDOM
|
||||||
|
#undef HAVE_DEV_RANDOM
|
||||||
|
#undef HAVE_CRYPTGENRANDOM
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined ENABLE_RDRAND
|
#if defined ENABLE_RDRAND
|
||||||
|
|
||||||
/* cpuid */
|
/* cpuid */
|
||||||
@@ -162,36 +176,38 @@ retry:
|
|||||||
#include <sys/random.h>
|
#include <sys/random.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int get_getrandom_seed(void)
|
static int get_getrandom_seed(int *seed)
|
||||||
{
|
{
|
||||||
DEBUG_SEED("get_dev_random_seed");
|
DEBUG_SEED("get_getrandom_seed");
|
||||||
|
|
||||||
int r;
|
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
do {
|
do
|
||||||
ret = getrandom(&r, sizeof(r), 0);
|
{
|
||||||
|
ret = getrandom(seed, sizeof(*seed), GRND_NONBLOCK);
|
||||||
} while ((ret == -1) && (errno == EINTR));
|
} while ((ret == -1) && (errno == EINTR));
|
||||||
|
|
||||||
if (ret == -1)
|
if (ret == -1)
|
||||||
{
|
{
|
||||||
if (errno == ENOSYS) /* syscall not available in kernel */
|
if (errno == ENOSYS) /* syscall not available in kernel */
|
||||||
return -1;
|
return -1;
|
||||||
|
if (errno == EAGAIN) /* entropy not yet initialized */
|
||||||
|
return -1;
|
||||||
|
|
||||||
fprintf(stderr, "error from getrandom(): %s", strerror(errno));
|
fprintf(stderr, "error from getrandom(): %s", strerror(errno));
|
||||||
exit(1);
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != sizeof(r))
|
if (ret != sizeof(*seed))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return r;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* defined HAVE_GETRANDOM */
|
#endif /* defined HAVE_GETRANDOM */
|
||||||
|
|
||||||
/* has_dev_urandom */
|
/* get_dev_random_seed */
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(__unix__) || defined(__linux__)
|
#ifdef HAVE_DEV_RANDOM
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -201,43 +217,34 @@ static int get_getrandom_seed(void)
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#define HAVE_DEV_RANDOM 1
|
|
||||||
|
|
||||||
static const char *dev_random_file = "/dev/urandom";
|
static const char *dev_random_file = "/dev/urandom";
|
||||||
|
|
||||||
static int has_dev_urandom(void)
|
static int get_dev_random_seed(int *seed)
|
||||||
{
|
|
||||||
struct stat buf;
|
|
||||||
if (stat(dev_random_file, &buf))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return ((buf.st_mode & S_IFCHR) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get_dev_random_seed */
|
|
||||||
|
|
||||||
static int get_dev_random_seed(void)
|
|
||||||
{
|
{
|
||||||
DEBUG_SEED("get_dev_random_seed");
|
DEBUG_SEED("get_dev_random_seed");
|
||||||
|
|
||||||
|
struct stat buf;
|
||||||
|
if (stat(dev_random_file, &buf))
|
||||||
|
return -1;
|
||||||
|
if ((buf.st_mode & S_IFCHR) == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
int fd = open(dev_random_file, O_RDONLY);
|
int fd = open(dev_random_file, O_RDONLY);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "error opening %s: %s", dev_random_file, strerror(errno));
|
fprintf(stderr, "error opening %s: %s", dev_random_file, strerror(errno));
|
||||||
exit(1);
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int r;
|
ssize_t nread = read(fd, seed, sizeof(*seed));
|
||||||
ssize_t nread = read(fd, &r, sizeof(r));
|
if (nread != sizeof(*seed))
|
||||||
if (nread != sizeof(r))
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "error short read %s: %s", dev_random_file, strerror(errno));
|
fprintf(stderr, "error short read %s: %s", dev_random_file, strerror(errno));
|
||||||
exit(1);
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
return r;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -260,13 +267,10 @@ static int get_dev_random_seed(void)
|
|||||||
#pragma comment(lib, "advapi32.lib")
|
#pragma comment(lib, "advapi32.lib")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int get_time_seed(void);
|
static int get_cryptgenrandom_seed(int *seed)
|
||||||
|
|
||||||
static int get_cryptgenrandom_seed(void)
|
|
||||||
{
|
{
|
||||||
HCRYPTPROV hProvider = 0;
|
HCRYPTPROV hProvider = 0;
|
||||||
DWORD dwFlags = CRYPT_VERIFYCONTEXT;
|
DWORD dwFlags = CRYPT_VERIFYCONTEXT;
|
||||||
int r;
|
|
||||||
|
|
||||||
DEBUG_SEED("get_cryptgenrandom_seed");
|
DEBUG_SEED("get_cryptgenrandom_seed");
|
||||||
|
|
||||||
@@ -277,34 +281,36 @@ static int get_cryptgenrandom_seed(void)
|
|||||||
if (!CryptAcquireContextA(&hProvider, 0, 0, PROV_RSA_FULL, dwFlags))
|
if (!CryptAcquireContextA(&hProvider, 0, 0, PROV_RSA_FULL, dwFlags))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "error CryptAcquireContextA 0x%08lx", GetLastError());
|
fprintf(stderr, "error CryptAcquireContextA 0x%08lx", GetLastError());
|
||||||
r = get_time_seed();
|
return -1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BOOL ret = CryptGenRandom(hProvider, sizeof(r), (BYTE*)&r);
|
BOOL ret = CryptGenRandom(hProvider, sizeof(*seed), (BYTE *)seed);
|
||||||
CryptReleaseContext(hProvider, 0);
|
CryptReleaseContext(hProvider, 0);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "error CryptGenRandom 0x%08lx", GetLastError());
|
fprintf(stderr, "error CryptGenRandom 0x%08lx", GetLastError());
|
||||||
r = get_time_seed();
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* get_time_seed */
|
/* get_time_seed */
|
||||||
|
|
||||||
|
#ifndef HAVE_ARC4RANDOM
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
static int get_time_seed(void)
|
static int get_time_seed(void)
|
||||||
{
|
{
|
||||||
DEBUG_SEED("get_time_seed");
|
DEBUG_SEED("get_time_seed");
|
||||||
|
|
||||||
return (int)time(NULL) * 433494437;
|
return (unsigned)time(NULL) * 433494437;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* json_c_get_random_seed */
|
/* json_c_get_random_seed */
|
||||||
|
|
||||||
@@ -317,19 +323,31 @@ int json_c_get_random_seed(void)
|
|||||||
if (has_rdrand())
|
if (has_rdrand())
|
||||||
return get_rdrand_seed();
|
return get_rdrand_seed();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_ARC4RANDOM
|
||||||
|
/* arc4random never fails, so use it if it's available */
|
||||||
|
return arc4random();
|
||||||
|
#else
|
||||||
#ifdef HAVE_GETRANDOM
|
#ifdef HAVE_GETRANDOM
|
||||||
{
|
{
|
||||||
int seed = get_getrandom_seed();
|
int seed;
|
||||||
if (seed != -1)
|
if (get_getrandom_seed(&seed) == 0)
|
||||||
return seed;
|
return seed;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM
|
#if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM
|
||||||
if (has_dev_urandom())
|
{
|
||||||
return get_dev_random_seed();
|
int seed;
|
||||||
|
if (get_dev_random_seed(&seed) == 0)
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined HAVE_CRYPTGENRANDOM && HAVE_CRYPTGENRANDOM
|
#if defined HAVE_CRYPTGENRANDOM && HAVE_CRYPTGENRANDOM
|
||||||
return get_cryptgenrandom_seed();
|
{
|
||||||
|
int seed;
|
||||||
|
if (get_cryptgenrandom_seed(&seed) == 0)
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return get_time_seed();
|
return get_time_seed();
|
||||||
|
#endif /* !HAVE_ARC4RANDOM */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ char *_json_c_strerror(int errno_in)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// It's not one of the known errno values, return the numeric value.
|
// It's not one of the known errno values, return the numeric value.
|
||||||
for (ii = 0; errno_in > 10; errno_in /= 10, ii++)
|
for (ii = 0; errno_in >= 10; errno_in /= 10, ii++)
|
||||||
{
|
{
|
||||||
digbuf[ii] = "0123456789"[(errno_in % 10)];
|
digbuf[ii] = "0123456789"[(errno_in % 10)];
|
||||||
}
|
}
|
||||||
@@ -105,5 +105,6 @@ char *_json_c_strerror(int errno_in)
|
|||||||
{
|
{
|
||||||
errno_buf[start_idx] = digbuf[ii];
|
errno_buf[start_idx] = digbuf[ii];
|
||||||
}
|
}
|
||||||
|
errno_buf[start_idx] = '\0';
|
||||||
return errno_buf;
|
return errno_buf;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,32 +12,38 @@ target_link_libraries(test2Formatted PRIVATE ${PROJECT_NAME})
|
|||||||
|
|
||||||
include_directories(PUBLIC ${CMAKE_SOURCE_DIR})
|
include_directories(PUBLIC ${CMAKE_SOURCE_DIR})
|
||||||
|
|
||||||
foreach(TESTNAME
|
set(ALL_TEST_NAMES
|
||||||
test1
|
test1
|
||||||
test2
|
test2
|
||||||
test4
|
test4
|
||||||
testReplaceExisting
|
testReplaceExisting
|
||||||
test_cast
|
test_cast
|
||||||
test_charcase
|
test_charcase
|
||||||
test_compare
|
test_compare
|
||||||
test_deep_copy
|
test_deep_copy
|
||||||
test_double_serializer
|
test_double_serializer
|
||||||
test_float
|
test_float
|
||||||
test_int_add
|
test_int_add
|
||||||
test_json_pointer
|
test_locale
|
||||||
test_locale
|
test_null
|
||||||
test_null
|
test_parse
|
||||||
test_parse
|
test_parse_int64
|
||||||
test_parse_int64
|
test_printbuf
|
||||||
test_printbuf
|
test_set_serializer
|
||||||
test_set_serializer
|
test_set_value
|
||||||
test_set_value
|
test_strerror
|
||||||
test_util_file
|
test_util_file
|
||||||
test_visit
|
test_visit
|
||||||
test_object_iterator)
|
test_object_iterator)
|
||||||
|
|
||||||
|
if (NOT DISABLE_JSON_POINTER)
|
||||||
|
set(ALL_TEST_NAMES ${ALL_TEST_NAMES} test_json_pointer)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
foreach(TESTNAME ${ALL_TEST_NAMES})
|
||||||
|
|
||||||
add_executable(${TESTNAME} ${TESTNAME}.c)
|
add_executable(${TESTNAME} ${TESTNAME}.c)
|
||||||
if(${TESTNAME} STREQUAL test_util_file)
|
if(${TESTNAME} STREQUAL test_strerror OR ${TESTNAME} STREQUAL test_util_file)
|
||||||
# For output consistency, we need _json_c_strerror() in some tests:
|
# For output consistency, we need _json_c_strerror() in some tests:
|
||||||
target_sources(${TESTNAME} PRIVATE ../strerror_override.c)
|
target_sources(${TESTNAME} PRIVATE ../strerror_override.c)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include "json.h"
|
#include "json.h"
|
||||||
#include "parse_flags.h"
|
#include "parse_flags.h"
|
||||||
|
|
||||||
@@ -307,6 +310,27 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
printf("my_object.to_string()=%s\n", json_object_to_json_string(my_object));
|
printf("my_object.to_string()=%s\n", json_object_to_json_string(my_object));
|
||||||
|
|
||||||
|
json_object_put(my_array);
|
||||||
|
my_array = json_object_new_array_ext(INT_MIN + 1);
|
||||||
|
if (my_array != NULL)
|
||||||
|
{
|
||||||
|
printf("ERROR: able to allocate an array of negative size!\n");
|
||||||
|
fflush(stdout);
|
||||||
|
json_object_put(my_array);
|
||||||
|
my_array = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if SIZEOF_SIZE_T == SIZEOF_INT
|
||||||
|
my_array = json_object_new_array_ext(INT_MAX / 2 + 2);
|
||||||
|
if (my_array != NULL)
|
||||||
|
{
|
||||||
|
printf("ERROR: able to allocate an array of insufficient size!\n");
|
||||||
|
fflush(stdout);
|
||||||
|
json_object_put(my_array);
|
||||||
|
my_array = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
json_object_put(my_string);
|
json_object_put(my_string);
|
||||||
json_object_put(my_int);
|
json_object_put(my_int);
|
||||||
json_object_put(my_null);
|
json_object_put(my_null);
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ int main(int argc, char **argv)
|
|||||||
\"int64_number\": 2147483649,\n\
|
\"int64_number\": 2147483649,\n\
|
||||||
\"negative_number\": -321321321,\n\
|
\"negative_number\": -321321321,\n\
|
||||||
\"a_null\": null,\n\
|
\"a_null\": null,\n\
|
||||||
|
\"empty_array\": [],\n\
|
||||||
|
\"nonempty_array\": [ 123 ],\n\
|
||||||
|
\"array_with_zero\": [ 0 ],\n\
|
||||||
|
\"empty_object\": {},\n\
|
||||||
|
\"nonempty_object\": { \"a\": 123 },\n\
|
||||||
}";
|
}";
|
||||||
/* Note: 2147483649 = INT_MAX + 2 */
|
/* Note: 2147483649 = INT_MAX + 2 */
|
||||||
/* Note: 9223372036854775809 = INT64_MAX + 2 */
|
/* Note: 9223372036854775809 = INT64_MAX + 2 */
|
||||||
@@ -49,6 +54,11 @@ int main(int argc, char **argv)
|
|||||||
getit(new_obj, "int64_number");
|
getit(new_obj, "int64_number");
|
||||||
getit(new_obj, "negative_number");
|
getit(new_obj, "negative_number");
|
||||||
getit(new_obj, "a_null");
|
getit(new_obj, "a_null");
|
||||||
|
getit(new_obj, "empty_array");
|
||||||
|
getit(new_obj, "nonempty_array");
|
||||||
|
getit(new_obj, "array_with_zero");
|
||||||
|
getit(new_obj, "empty_object");
|
||||||
|
getit(new_obj, "nonempty_object");
|
||||||
|
|
||||||
// Now check the behaviour of the json_object_is_type() function.
|
// Now check the behaviour of the json_object_is_type() function.
|
||||||
printf("\n================================\n");
|
printf("\n================================\n");
|
||||||
|
|||||||
@@ -7,6 +7,11 @@ Parsed input: {
|
|||||||
"int64_number": 2147483649,
|
"int64_number": 2147483649,
|
||||||
"negative_number": -321321321,
|
"negative_number": -321321321,
|
||||||
"a_null": null,
|
"a_null": null,
|
||||||
|
"empty_array": [],
|
||||||
|
"nonempty_array": [ 123 ],
|
||||||
|
"array_with_zero": [ 0 ],
|
||||||
|
"empty_object": {},
|
||||||
|
"nonempty_object": { "a": 123 },
|
||||||
}
|
}
|
||||||
Result is not NULL
|
Result is not NULL
|
||||||
new_obj.string_of_digits json_object_get_type()=string
|
new_obj.string_of_digits json_object_get_type()=string
|
||||||
@@ -57,6 +62,36 @@ new_obj.a_null json_object_get_int64()=0
|
|||||||
new_obj.a_null json_object_get_uint64()=0
|
new_obj.a_null json_object_get_uint64()=0
|
||||||
new_obj.a_null json_object_get_boolean()=0
|
new_obj.a_null json_object_get_boolean()=0
|
||||||
new_obj.a_null json_object_get_double()=0.000000
|
new_obj.a_null json_object_get_double()=0.000000
|
||||||
|
new_obj.empty_array json_object_get_type()=array
|
||||||
|
new_obj.empty_array json_object_get_int()=0
|
||||||
|
new_obj.empty_array json_object_get_int64()=0
|
||||||
|
new_obj.empty_array json_object_get_uint64()=0
|
||||||
|
new_obj.empty_array json_object_get_boolean()=0
|
||||||
|
new_obj.empty_array json_object_get_double()=0.000000
|
||||||
|
new_obj.nonempty_array json_object_get_type()=array
|
||||||
|
new_obj.nonempty_array json_object_get_int()=0
|
||||||
|
new_obj.nonempty_array json_object_get_int64()=0
|
||||||
|
new_obj.nonempty_array json_object_get_uint64()=0
|
||||||
|
new_obj.nonempty_array json_object_get_boolean()=0
|
||||||
|
new_obj.nonempty_array json_object_get_double()=0.000000
|
||||||
|
new_obj.array_with_zero json_object_get_type()=array
|
||||||
|
new_obj.array_with_zero json_object_get_int()=0
|
||||||
|
new_obj.array_with_zero json_object_get_int64()=0
|
||||||
|
new_obj.array_with_zero json_object_get_uint64()=0
|
||||||
|
new_obj.array_with_zero json_object_get_boolean()=0
|
||||||
|
new_obj.array_with_zero json_object_get_double()=0.000000
|
||||||
|
new_obj.empty_object json_object_get_type()=object
|
||||||
|
new_obj.empty_object json_object_get_int()=0
|
||||||
|
new_obj.empty_object json_object_get_int64()=0
|
||||||
|
new_obj.empty_object json_object_get_uint64()=0
|
||||||
|
new_obj.empty_object json_object_get_boolean()=0
|
||||||
|
new_obj.empty_object json_object_get_double()=0.000000
|
||||||
|
new_obj.nonempty_object json_object_get_type()=object
|
||||||
|
new_obj.nonempty_object json_object_get_int()=0
|
||||||
|
new_obj.nonempty_object json_object_get_int64()=0
|
||||||
|
new_obj.nonempty_object json_object_get_uint64()=0
|
||||||
|
new_obj.nonempty_object json_object_get_boolean()=0
|
||||||
|
new_obj.nonempty_object json_object_get_double()=0.000000
|
||||||
|
|
||||||
================================
|
================================
|
||||||
json_object_is_type: null,boolean,double,int,object,array,string
|
json_object_is_type: null,boolean,double,int,object,array,string
|
||||||
|
|||||||
11
tests/test_strerror.c
Normal file
11
tests/test_strerror.c
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#include "strerror_override.h"
|
||||||
|
#include "strerror_override_private.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
puts(strerror(10000));
|
||||||
|
puts(strerror(999));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
2
tests/test_strerror.expected
Normal file
2
tests/test_strerror.expected
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ERRNO=10000
|
||||||
|
ERRNO=999
|
||||||
1
tests/test_strerror.test
Symbolic link
1
tests/test_strerror.test
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
test_basic.test
|
||||||
Reference in New Issue
Block a user