|  | @@ -2052,31 +2052,77 @@ cJSON *cJSON_CreateStringArray(const char **strings, int count)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* Duplication */
 | 
	
		
			
				|  |  | -cJSON *cJSON_Duplicate(cJSON *item,int recurse)
 | 
	
		
			
				|  |  | +cJSON *cJSON_Duplicate(cJSON *item, int recurse)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -	cJSON *newitem,*cptr,*nptr=0,*newchild;
 | 
	
		
			
				|  |  | -	/* Bail on bad ptr */
 | 
	
		
			
				|  |  | -	if (!item) return 0;
 | 
	
		
			
				|  |  | -	/* Create new item */
 | 
	
		
			
				|  |  | -	newitem=cJSON_New_Item();
 | 
	
		
			
				|  |  | -	if (!newitem) return 0;
 | 
	
		
			
				|  |  | -	/* Copy over all vars */
 | 
	
		
			
				|  |  | -	newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble;
 | 
	
		
			
				|  |  | -	if (item->valuestring)	{newitem->valuestring=cJSON_strdup(item->valuestring);	if (!newitem->valuestring)	{cJSON_Delete(newitem);return 0;}}
 | 
	
		
			
				|  |  | -	if (item->string)		{newitem->string=cJSON_strdup(item->string);			if (!newitem->string)		{cJSON_Delete(newitem);return 0;}}
 | 
	
		
			
				|  |  | -	/* If non-recursive, then we're done! */
 | 
	
		
			
				|  |  | -	if (!recurse) return newitem;
 | 
	
		
			
				|  |  | -	/* Walk the ->next chain for the child. */
 | 
	
		
			
				|  |  | -	cptr=item->child;
 | 
	
		
			
				|  |  | -	while (cptr)
 | 
	
		
			
				|  |  | -	{
 | 
	
		
			
				|  |  | -		newchild=cJSON_Duplicate(cptr,1);		/* Duplicate (with recurse) each item in the ->next chain */
 | 
	
		
			
				|  |  | -		if (!newchild) {cJSON_Delete(newitem);return 0;}
 | 
	
		
			
				|  |  | -		if (nptr)	{nptr->next=newchild,newchild->prev=nptr;nptr=newchild;}	/* If newitem->child already set, then crosswire ->prev and ->next and move on */
 | 
	
		
			
				|  |  | -		else		{newitem->child=newchild;nptr=newchild;}					/* Set newitem->child and move to it */
 | 
	
		
			
				|  |  | -		cptr=cptr->next;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return newitem;
 | 
	
		
			
				|  |  | +    cJSON *newitem;
 | 
	
		
			
				|  |  | +    cJSON *cptr;
 | 
	
		
			
				|  |  | +    cJSON *nptr = 0;
 | 
	
		
			
				|  |  | +    cJSON *newchild;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /* Bail on bad ptr */
 | 
	
		
			
				|  |  | +    if (!item)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /* Create new item */
 | 
	
		
			
				|  |  | +    newitem = cJSON_New_Item();
 | 
	
		
			
				|  |  | +    if (!newitem)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return 0;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /* Copy over all vars */
 | 
	
		
			
				|  |  | +    newitem->type = item->type & (~cJSON_IsReference);
 | 
	
		
			
				|  |  | +    newitem->valueint = item->valueint;
 | 
	
		
			
				|  |  | +    newitem->valuedouble = item->valuedouble;
 | 
	
		
			
				|  |  | +    if (item->valuestring)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        newitem->valuestring = cJSON_strdup(item->valuestring);
 | 
	
		
			
				|  |  | +        if (!newitem->valuestring)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            cJSON_Delete(newitem);
 | 
	
		
			
				|  |  | +            return 0;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (item->string)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        newitem->string = cJSON_strdup(item->string);
 | 
	
		
			
				|  |  | +        if (!newitem->string)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            cJSON_Delete(newitem);
 | 
	
		
			
				|  |  | +            return 0;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /* If non-recursive, then we're done! */
 | 
	
		
			
				|  |  | +    if (!recurse)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return newitem;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /* Walk the ->next chain for the child. */
 | 
	
		
			
				|  |  | +    cptr = item->child;
 | 
	
		
			
				|  |  | +    while (cptr)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        newchild = cJSON_Duplicate(cptr, 1); /* Duplicate (with recurse) each item in the ->next chain */
 | 
	
		
			
				|  |  | +        if (!newchild)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            cJSON_Delete(newitem);
 | 
	
		
			
				|  |  | +            return 0;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (nptr)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            /* If newitem->child already set, then crosswire ->prev and ->next and move on */
 | 
	
		
			
				|  |  | +            nptr->next = newchild;
 | 
	
		
			
				|  |  | +            newchild->prev = nptr;
 | 
	
		
			
				|  |  | +            nptr = newchild;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            /* Set newitem->child and move to it */
 | 
	
		
			
				|  |  | +            newitem->child = newchild; nptr = newchild;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        cptr = cptr->next;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return newitem;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void cJSON_Minify(char *json)
 |