mirror of
https://github.com/DaveGamble/cJSON.git
synced 2024-12-26 21:04:24 +08:00
Use error_position instead of error pointer internally
This commit is contained in:
parent
770e8263a5
commit
56a32f9ecc
32
cJSON.c
32
cJSON.c
@ -40,11 +40,15 @@
|
|||||||
#define true ((cJSON_bool)1)
|
#define true ((cJSON_bool)1)
|
||||||
#define false ((cJSON_bool)0)
|
#define false ((cJSON_bool)0)
|
||||||
|
|
||||||
static const unsigned char *global_ep = NULL;
|
typedef struct {
|
||||||
|
const unsigned char *json;
|
||||||
|
size_t position;
|
||||||
|
} error;
|
||||||
|
static error global_error = { NULL, 0 };
|
||||||
|
|
||||||
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void)
|
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void)
|
||||||
{
|
{
|
||||||
return (const char*) global_ep;
|
return (const char*) (global_error.json + global_error.position);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */
|
/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */
|
||||||
@ -945,10 +949,11 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer)
|
|||||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)
|
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)
|
||||||
{
|
{
|
||||||
parse_buffer buffer;
|
parse_buffer buffer;
|
||||||
/* use global error pointer if no specific one was given */
|
|
||||||
const unsigned char **error_pointer = (return_parse_end != NULL) ? (const unsigned char**)return_parse_end : &global_ep;
|
|
||||||
cJSON *item = NULL;
|
cJSON *item = NULL;
|
||||||
*error_pointer = NULL;
|
|
||||||
|
/* reset error position */
|
||||||
|
global_error.json = NULL;
|
||||||
|
global_error.position = 0;
|
||||||
|
|
||||||
if (value == NULL)
|
if (value == NULL)
|
||||||
{
|
{
|
||||||
@ -995,13 +1000,26 @@ fail:
|
|||||||
|
|
||||||
if (value != NULL)
|
if (value != NULL)
|
||||||
{
|
{
|
||||||
|
error local_error;
|
||||||
|
local_error.json = (const unsigned char*)value;
|
||||||
|
local_error.position = 0;
|
||||||
|
|
||||||
if (buffer.offset < buffer.length)
|
if (buffer.offset < buffer.length)
|
||||||
{
|
{
|
||||||
*error_pointer = buffer_at_offset(&buffer);
|
local_error.position = buffer.offset;
|
||||||
}
|
}
|
||||||
else if (buffer.length > 0)
|
else if (buffer.length > 0)
|
||||||
{
|
{
|
||||||
*error_pointer = buffer.content + buffer.length - 1;
|
local_error.position = buffer.length - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (return_parse_end != NULL)
|
||||||
|
{
|
||||||
|
*return_parse_end = (const char*)local_error.json + local_error.position;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
global_error = local_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user