diff --git a/cJSON.c b/cJSON.c index 3ebcce1..b590628 100644 --- a/cJSON.c +++ b/cJSON.c @@ -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);}