1
0
mirror of https://github.com/DaveGamble/cJSON synced 2024-12-23 15:12:04 +00:00

Merge pull request #446 from DaveGamble/revert-430-array_add

Revert "use prev pointer when array do adding"
This commit is contained in:
Alan Wang 2020-03-16 23:08:06 +08:00 committed by GitHub
commit 0586a6c437
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 29 deletions

37
cJSON.c
View File

@ -1871,34 +1871,22 @@ static cJSON_bool add_item_to_array(cJSON *array, cJSON *item)
} }
child = array->child; child = array->child;
/*
* To find the last item int array quickly, we use prev in array
*/
if (child == NULL) if (child == NULL)
{ {
/* list is empty, start new one */ /* list is empty, start new one */
array->child = item; array->child = item;
item->prev = item;
item->next = NULL;
} }
else else
{ {
/* append to the end */ /* append to the end */
if (child->prev) while (child->next)
{ {
suffix_object(child->prev, item); child = child->next;
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; return true;
} }
@ -2218,21 +2206,14 @@ CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON
{ {
replacement->next->prev = replacement; replacement->next->prev = replacement;
} }
if (replacement->prev != NULL)
{
replacement->prev->next = replacement;
}
if (parent->child == item) if (parent->child == item)
{ {
parent->child = replacement; 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->next = NULL;
item->prev = NULL; item->prev = NULL;

View File

@ -306,7 +306,7 @@ static void cjson_replace_item_via_pointer_should_replace_items(void)
/* replace beginning */ /* replace beginning */
TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, beginning, &(replacements[0]))); TEST_ASSERT_TRUE(cJSON_ReplaceItemViaPointer(array, beginning, &(replacements[0])));
TEST_ASSERT_TRUE(replacements[0].prev == end); TEST_ASSERT_NULL(replacements[0].prev);
TEST_ASSERT_TRUE(replacements[0].next == middle); TEST_ASSERT_TRUE(replacements[0].next == middle);
TEST_ASSERT_TRUE(middle->prev == &(replacements[0])); TEST_ASSERT_TRUE(middle->prev == &(replacements[0]));
TEST_ASSERT_TRUE(array->child == &(replacements[0])); TEST_ASSERT_TRUE(array->child == &(replacements[0]));