|
@@ -40,11 +40,15 @@
|
|
|
#define true ((cJSON_bool)1)
|
|
|
#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)
|
|
|
{
|
|
|
- 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 */
|
|
@@ -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)
|
|
|
{
|
|
|
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;
|
|
|
- *error_pointer = NULL;
|
|
|
+
|
|
|
+ /* reset error position */
|
|
|
+ global_error.json = NULL;
|
|
|
+ global_error.position = 0;
|
|
|
|
|
|
if (value == NULL)
|
|
|
{
|
|
@@ -995,13 +1000,26 @@ fail:
|
|
|
|
|
|
if (value != NULL)
|
|
|
{
|
|
|
+ error local_error;
|
|
|
+ local_error.json = (const unsigned char*)value;
|
|
|
+ local_error.position = 0;
|
|
|
+
|
|
|
if (buffer.offset < buffer.length)
|
|
|
{
|
|
|
- *error_pointer = buffer_at_offset(&buffer);
|
|
|
+ local_error.position = buffer.offset;
|
|
|
}
|
|
|
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;
|
|
|
}
|
|
|
}
|
|
|
|