|
@@ -1871,22 +1871,34 @@ static cJSON_bool add_item_to_array(cJSON *array, cJSON *item)
|
|
|
}
|
|
|
|
|
|
child = array->child;
|
|
|
-
|
|
|
+ /*
|
|
|
+ * To find the last item int array quickly, we use prev in array
|
|
|
+ */
|
|
|
if (child == NULL)
|
|
|
{
|
|
|
/* list is empty, start new one */
|
|
|
array->child = item;
|
|
|
+ item->prev = item;
|
|
|
+ item->next = NULL;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
/* append to the end */
|
|
|
- while (child->next)
|
|
|
+ if (child->prev)
|
|
|
{
|
|
|
- child = child->next;
|
|
|
+ suffix_object(child->prev, item);
|
|
|
+ array->child->prev = item;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ while (child->next)
|
|
|
+ {
|
|
|
+ child = child->next;
|
|
|
+ }
|
|
|
+ suffix_object(child, item);
|
|
|
+ array->child->prev = item;
|
|
|
}
|
|
|
- suffix_object(child, item);
|
|
|
}
|
|
|
-
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -2206,14 +2218,21 @@ CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON
|
|
|
{
|
|
|
replacement->next->prev = replacement;
|
|
|
}
|
|
|
- if (replacement->prev != NULL)
|
|
|
- {
|
|
|
- replacement->prev->next = replacement;
|
|
|
- }
|
|
|
+
|
|
|
if (parent->child == item)
|
|
|
{
|
|
|
parent->child = replacement;
|
|
|
}
|
|
|
+ else
|
|
|
+ { /*
|
|
|
+ * To find the last item int array quickly, we use prev in array.
|
|
|
+ * We can't modify the last item's next pointer where this item was the parent's child
|
|
|
+ */
|
|
|
+ if (replacement->prev != NULL)
|
|
|
+ {
|
|
|
+ replacement->prev->next = replacement;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
item->next = NULL;
|
|
|
item->prev = NULL;
|