|  | @@ -1930,35 +1930,41 @@ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newit
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void ReplaceItemInArray(cJSON *array, size_t which, cJSON *newitem)
 | 
	
		
			
				|  |  | +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    cJSON *replaced = get_array_item(array, which);
 | 
	
		
			
				|  |  | +    if ((parent == NULL) || (replacement == NULL))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (replaced == NULL)
 | 
	
		
			
				|  |  | +    if (replacement == item)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        return;
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    newitem->next = replaced->next;
 | 
	
		
			
				|  |  | -    newitem->prev = replaced->prev;
 | 
	
		
			
				|  |  | -    if (newitem->next)
 | 
	
		
			
				|  |  | +    replacement->next = item->next;
 | 
	
		
			
				|  |  | +    replacement->prev = item->prev;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (replacement->next != NULL)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        newitem->next->prev = newitem;
 | 
	
		
			
				|  |  | +        replacement->next->prev = replacement;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if (replaced == array->child)
 | 
	
		
			
				|  |  | +    if (replacement->prev != NULL)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        array->child = newitem;
 | 
	
		
			
				|  |  | +        replacement->prev->next = replacement;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    else
 | 
	
		
			
				|  |  | +    if (parent->child == item)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        newitem->prev->next = newitem;
 | 
	
		
			
				|  |  | +        parent->child = replacement;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    replaced->next = NULL;
 | 
	
		
			
				|  |  | -    replaced->prev = NULL;
 | 
	
		
			
				|  |  | +    item->next = NULL;
 | 
	
		
			
				|  |  | +    item->prev = NULL;
 | 
	
		
			
				|  |  | +    cJSON_Delete(item);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    cJSON_Delete(replaced);
 | 
	
		
			
				|  |  | +    return true;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      if (which < 0)
 | 
	
	
		
			
				|  | @@ -1966,29 +1972,12 @@ CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newi
 | 
	
		
			
				|  |  |          return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    ReplaceItemInArray(array, (size_t)which, newitem);
 | 
	
		
			
				|  |  | +    cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    size_t i = 0;
 | 
	
		
			
				|  |  | -    cJSON *c = object->child;
 | 
	
		
			
				|  |  | -    while(c && (case_insensitive_strcmp((unsigned char*)c->string, (const unsigned char*)string) != 0))
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        i++;
 | 
	
		
			
				|  |  | -        c = c->next;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if(c)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        /* free the old string if not const */
 | 
	
		
			
				|  |  | -        if (!(newitem->type & cJSON_StringIsConst) && newitem->string)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -             global_hooks.deallocate(newitem->string);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        newitem->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks);
 | 
	
		
			
				|  |  | -        ReplaceItemInArray(object, i, newitem);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +    cJSON_ReplaceItemViaPointer(object, cJSON_GetObjectItem(object, string), newitem);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* Create basic types: */
 |