|
|
@ -785,21 +785,45 @@ static const char *skip(const char *in) |
|
|
|
} |
|
|
|
|
|
|
|
/* Parse an object - create a new root, and populate. */ |
|
|
|
cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated) |
|
|
|
cJSON *cJSON_ParseWithOpts(const char *value, const char **return_parse_end, int require_null_terminated) |
|
|
|
{ |
|
|
|
const char *end=0,**ep=return_parse_end?return_parse_end:&global_ep; |
|
|
|
cJSON *c=cJSON_New_Item(); |
|
|
|
*ep=0; |
|
|
|
if (!c) return 0; /* memory fail */ |
|
|
|
|
|
|
|
end=parse_value(c,skip(value),ep); |
|
|
|
if (!end) {cJSON_Delete(c);return 0;} /* parse failure. ep is set. */ |
|
|
|
|
|
|
|
/* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ |
|
|
|
if (require_null_terminated) {end=skip(end);if (*end) {cJSON_Delete(c);*ep=end;return 0;}} |
|
|
|
if (return_parse_end) *return_parse_end=end; |
|
|
|
return c; |
|
|
|
const char *end = 0; |
|
|
|
/* use global error pointer if no specific one was given */ |
|
|
|
const char **ep = return_parse_end ? return_parse_end : &global_ep; |
|
|
|
cJSON *c = cJSON_New_Item(); |
|
|
|
*ep = 0; |
|
|
|
if (!c) /* memory fail */ |
|
|
|
{ |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
end = parse_value(c, skip(value), ep); |
|
|
|
if (!end) |
|
|
|
{ |
|
|
|
/* parse failure. ep is set. */ |
|
|
|
cJSON_Delete(c); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
/* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ |
|
|
|
if (require_null_terminated) |
|
|
|
{ |
|
|
|
end = skip(end); |
|
|
|
if (*end) |
|
|
|
{ |
|
|
|
cJSON_Delete(c); |
|
|
|
*ep = end; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
if (return_parse_end) |
|
|
|
{ |
|
|
|
*return_parse_end = end; |
|
|
|
} |
|
|
|
|
|
|
|
return c; |
|
|
|
} |
|
|
|
|
|
|
|
/* Default options for cJSON_Parse */ |
|
|
|
cJSON *cJSON_Parse(const char *value) {return cJSON_ParseWithOpts(value,0,0);} |
|
|
|
|
|
|
|