|  | @@ -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);}
 | 
	
		
			
				|  |  |  
 |