mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
Merge branch 'develop'
This commit is contained in:
62
cJSON.c
62
cJSON.c
@ -23,9 +23,19 @@
|
||||
/* cJSON */
|
||||
/* JSON parser in C. */
|
||||
|
||||
/* disable warnings about old C89 functions in MSVC */
|
||||
#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER)
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC visibility push(default)
|
||||
#endif
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning (push)
|
||||
/* disable warning about single line comments in system headers */
|
||||
#pragma warning (disable : 4001)
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
@ -36,6 +46,9 @@
|
||||
#include <ctype.h>
|
||||
#include <locale.h>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning (pop)
|
||||
#endif
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC visibility pop
|
||||
#endif
|
||||
@ -101,7 +114,27 @@ typedef struct internal_hooks
|
||||
void *(*reallocate)(void *pointer, size_t size);
|
||||
} internal_hooks;
|
||||
|
||||
static internal_hooks global_hooks = { malloc, free, realloc };
|
||||
#if defined(_MSC_VER)
|
||||
/* work around MSVC error C2322: '...' address of dillimport '...' is not static */
|
||||
static void *internal_malloc(size_t size)
|
||||
{
|
||||
return malloc(size);
|
||||
}
|
||||
static void internal_free(void *pointer)
|
||||
{
|
||||
free(pointer);
|
||||
}
|
||||
static void *internal_realloc(void *pointer, size_t size)
|
||||
{
|
||||
return realloc(pointer, size);
|
||||
}
|
||||
#else
|
||||
#define internal_malloc malloc
|
||||
#define internal_free free
|
||||
#define internal_realloc realloc
|
||||
#endif
|
||||
|
||||
static internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc };
|
||||
|
||||
static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks)
|
||||
{
|
||||
@ -114,7 +147,8 @@ static unsigned char* cJSON_strdup(const unsigned char* string, const internal_h
|
||||
}
|
||||
|
||||
length = strlen((const char*)string) + sizeof("");
|
||||
if (!(copy = (unsigned char*)hooks->allocate(length)))
|
||||
copy = (unsigned char*)hooks->allocate(length);
|
||||
if (copy == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
@ -212,7 +246,6 @@ typedef struct
|
||||
|
||||
/* check if the given size is left to read in a given parse buffer (starting with 1) */
|
||||
#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length))
|
||||
#define cannot_read(buffer, size) (!can_read(buffer, size))
|
||||
/* check if the buffer can be accessed at the given index (starting with 0) */
|
||||
#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length))
|
||||
#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index))
|
||||
@ -937,6 +970,22 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */
|
||||
static parse_buffer *skip_utf8_bom(parse_buffer * const buffer)
|
||||
{
|
||||
if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0))
|
||||
{
|
||||
buffer->offset += 3;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/* Parse an object - create a new root, and populate. */
|
||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)
|
||||
{
|
||||
@ -963,7 +1012,7 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!parse_value(item, buffer_skip_whitespace(&buffer)))
|
||||
if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer))))
|
||||
{
|
||||
/* parse failure. ep is set. */
|
||||
goto fail;
|
||||
@ -1199,7 +1248,6 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf
|
||||
return parse_object(item, input_buffer);
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1826,7 +1874,7 @@ CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSO
|
||||
item->type &= ~cJSON_StringIsConst;
|
||||
}
|
||||
|
||||
#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
|
||||
#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
|
||||
#pragma GCC diagnostic push
|
||||
#endif
|
||||
#ifdef __GNUC__
|
||||
@ -1848,7 +1896,7 @@ CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJ
|
||||
item->type |= cJSON_StringIsConst;
|
||||
cJSON_AddItemToArray(object, item);
|
||||
}
|
||||
#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
|
||||
#if defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user