]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Add cJSON_Duplicate() function from upstream source.
authorEliot Gable <egable@gmail.com>
Mon, 11 Feb 2013 18:53:37 +0000 (18:53 +0000)
committerEliot Gable <egable@gmail.com>
Mon, 11 Feb 2013 18:53:37 +0000 (18:53 +0000)
src/include/switch_json.h
src/switch_json.c

index b4ca229c39a9a544f62807a4f913623270b634ca..00f4e23df4be034d9bb29f7b6e43dc5e067ce4e4 100755 (executable)
@@ -114,6 +114,13 @@ SWITCH_DECLARE(void)   cJSON_DeleteItemFromObject(cJSON *object,const char *stri
 SWITCH_DECLARE(void) cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem);
 SWITCH_DECLARE(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
 
+/* Duplicate a cJSON item */
+SWITCH_DECLARE(cJSON *) cJSON_Duplicate(cJSON *item,int recurse);
+/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
+   need to be released. With recurse!=0, it will duplicate any children connected to the item.
+   The item->next and ->prev pointers are always zero on return from Duplicate. */
+
+
 #define cJSON_AddNullToObject(object,name)     cJSON_AddItemToObject(object, name, cJSON_CreateNull())
 #define cJSON_AddTrueToObject(object,name)     cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
 #define cJSON_AddFalseToObject(object,name)            cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
index c68e678ebf9dadd6faf0305ea5a682882c2be9aa..3819cda2d2227dbb5161b9cb1a6c31d69df14eaf 100644 (file)
@@ -527,3 +527,30 @@ SWITCH_DECLARE(cJSON *)cJSON_CreateIntArray(int *numbers,int count)                                {int i;cJ
 SWITCH_DECLARE(cJSON *)cJSON_CreateFloatArray(float *numbers,int count)                        {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
 SWITCH_DECLARE(cJSON *)cJSON_CreateDoubleArray(double *numbers,int count)              {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
 SWITCH_DECLARE(cJSON *)cJSON_CreateStringArray(const char **strings,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateString(strings[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}
+
+/* Duplication */
+SWITCH_DECLARE(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;
+}