|
@@ -2052,31 +2052,77 @@ cJSON *cJSON_CreateStringArray(const char **strings, int count)
|
|
}
|
|
}
|
|
|
|
|
|
/* Duplication */
|
|
/* 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)
|
|
void cJSON_Minify(char *json)
|