|  | @@ -1665,16 +1665,33 @@ CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)
 | 
											
												
													
														|  |      return (int)i;
 |  |      return (int)i;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int item)
 |  | 
 | 
											
												
													
														|  | 
 |  | +static cJSON* get_array_item(const cJSON *array, size_t index)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  | -    cJSON *c = array ? array->child : NULL;
 |  | 
 | 
											
												
													
														|  | -    while (c && item > 0)
 |  | 
 | 
											
												
													
														|  | 
 |  | +    cJSON *current_child = NULL;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if (array == NULL)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | -        item--;
 |  | 
 | 
											
												
													
														|  | -        c = c->next;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        return NULL;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    current_child = array->child;
 | 
											
												
													
														|  | 
 |  | +    while ((current_child != NULL) && (index > 0))
 | 
											
												
													
														|  | 
 |  | +    {
 | 
											
												
													
														|  | 
 |  | +        index--;
 | 
											
												
													
														|  | 
 |  | +        current_child = current_child->next;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    return current_child;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index)
 | 
											
												
													
														|  | 
 |  | +{
 | 
											
												
													
														|  | 
 |  | +    if (index < 0)
 | 
											
												
													
														|  | 
 |  | +    {
 | 
											
												
													
														|  | 
 |  | +        return NULL;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    return c;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    return get_array_item(array, (size_t)index);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive)
 |  |  static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive)
 | 
											
										
											
												
													
														|  | @@ -1844,17 +1861,6 @@ CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const it
 | 
											
												
													
														|  |      return item;
 |  |      return item;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -static cJSON *DetachItemFromArray(cJSON *array, size_t which)
 |  | 
 | 
											
												
													
														|  | -{
 |  | 
 | 
											
												
													
														|  | -    cJSON *c = array->child;
 |  | 
 | 
											
												
													
														|  | -    while (c && (which > 0))
 |  | 
 | 
											
												
													
														|  | -    {
 |  | 
 | 
											
												
													
														|  | -        c = c->next;
 |  | 
 | 
											
												
													
														|  | -        which--;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -    return cJSON_DetachItemViaPointer(array, c);
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  |  CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which)
 |  |  CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      if (which < 0)
 |  |      if (which < 0)
 | 
											
										
											
												
													
														|  | @@ -1862,7 +1868,7 @@ CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which)
 | 
											
												
													
														|  |          return NULL;
 |  |          return NULL;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    return DetachItemFromArray(array, (size_t)which);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which));
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which)
 |  |  CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which)
 | 
											
										
											
												
													
														|  | @@ -1889,21 +1895,24 @@ CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string)
 | 
											
												
													
														|  |  /* Replace array/object items with new ones. */
 |  |  /* Replace array/object items with new ones. */
 | 
											
												
													
														|  |  CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem)
 |  |  CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  | -    cJSON *c = array->child;
 |  | 
 | 
											
												
													
														|  | -    while (c && (which > 0))
 |  | 
 | 
											
												
													
														|  | 
 |  | +    cJSON *after_inserted = NULL;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if (which < 0)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  | -        c = c->next;
 |  | 
 | 
											
												
													
														|  | -        which--;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        return;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    if (!c)
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    after_inserted = get_array_item(array, (size_t)which);
 | 
											
												
													
														|  | 
 |  | +    if (after_inserted == NULL)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          cJSON_AddItemToArray(array, newitem);
 |  |          cJSON_AddItemToArray(array, newitem);
 | 
											
												
													
														|  |          return;
 |  |          return;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    newitem->next = c;
 |  | 
 | 
											
												
													
														|  | -    newitem->prev = c->prev;
 |  | 
 | 
											
												
													
														|  | -    c->prev = newitem;
 |  | 
 | 
											
												
													
														|  | -    if (c == array->child)
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    newitem->next = after_inserted;
 | 
											
												
													
														|  | 
 |  | +    newitem->prev = after_inserted->prev;
 | 
											
												
													
														|  | 
 |  | +    after_inserted->prev = newitem;
 | 
											
												
													
														|  | 
 |  | +    if (after_inserted == array->child)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          array->child = newitem;
 |  |          array->child = newitem;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
										
											
												
													
														|  | @@ -1915,23 +1924,20 @@ CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newit
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  static void ReplaceItemInArray(cJSON *array, size_t which, cJSON *newitem)
 |  |  static void ReplaceItemInArray(cJSON *array, size_t which, cJSON *newitem)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  | -    cJSON *c = array->child;
 |  | 
 | 
											
												
													
														|  | -    while (c && (which > 0))
 |  | 
 | 
											
												
													
														|  | -    {
 |  | 
 | 
											
												
													
														|  | -        c = c->next;
 |  | 
 | 
											
												
													
														|  | -        which--;
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    if (!c)
 |  | 
 | 
											
												
													
														|  | 
 |  | +    cJSON *replaced = get_array_item(array, which);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if (replaced == NULL)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          return;
 |  |          return;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    newitem->next = c->next;
 |  | 
 | 
											
												
													
														|  | -    newitem->prev = c->prev;
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    newitem->next = replaced->next;
 | 
											
												
													
														|  | 
 |  | +    newitem->prev = replaced->prev;
 | 
											
												
													
														|  |      if (newitem->next)
 |  |      if (newitem->next)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          newitem->next->prev = newitem;
 |  |          newitem->next->prev = newitem;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    if (c == array->child)
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if (replaced == array->child)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          array->child = newitem;
 |  |          array->child = newitem;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
										
											
												
													
														|  | @@ -1939,8 +1945,11 @@ static void ReplaceItemInArray(cJSON *array, size_t which, cJSON *newitem)
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |          newitem->prev->next = newitem;
 |  |          newitem->prev->next = newitem;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    c->next = c->prev = NULL;
 |  | 
 | 
											
												
													
														|  | -    cJSON_Delete(c);
 |  | 
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    replaced->next = NULL;
 | 
											
												
													
														|  | 
 |  | +    replaced->prev = NULL;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    cJSON_Delete(replaced);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem)
 |  |  CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem)
 | 
											
												
													
														|  |  {
 |  |  {
 |