diff --git a/cJSON.c b/cJSON.c index 05b124c..bcf15bd 100644 --- a/cJSON.c +++ b/cJSON.c @@ -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)