Attention is currently required from: Jakub Czapiga. Raul Rangel has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/58805 )
Change subject: lib/list: Add list_append ......................................................................
lib/list: Add list_append
This method will add a node to the end of the list.
BUG=b:179699789 TEST=Boot guybrush to the OS
Signed-off-by: Raul E Rangel rrangel@chromium.org Change-Id: I1792e40f789e3ef16ceca65ce4cae946e08583d1 --- M src/include/list.h M src/lib/list.c M tests/lib/list-test.c 3 files changed, 30 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/05/58805/1
diff --git a/src/include/list.h b/src/include/list.h index 6f0b54d..bfd92a7 100644 --- a/src/include/list.h +++ b/src/include/list.h @@ -15,6 +15,8 @@ void list_insert_after(struct list_node *node, struct list_node *after); // Insert list_node node before list_node before in a doubly linked list. void list_insert_before(struct list_node *node, struct list_node *before); +// Appends the node to the end of the list. +void list_append(struct list_node *node, struct list_node *head);
#define list_for_each(ptr, head, member) \ for ((ptr) = container_of((head).next, typeof(*(ptr)), member); \ diff --git a/src/lib/list.c b/src/lib/list.c index 01d5c89..c3f8ee4 100644 --- a/src/lib/list.c +++ b/src/lib/list.c @@ -28,3 +28,11 @@ if (node->prev) node->prev->next = node; } + +void list_append(struct list_node *node, struct list_node *head) +{ + while (head->next) + head = head->next; + + list_insert_after(node, head); +} diff --git a/tests/lib/list-test.c b/tests/lib/list-test.c index 309346a..39bfb17 100644 --- a/tests/lib/list-test.c +++ b/tests/lib/list-test.c @@ -116,12 +116,32 @@ free(c1); }
+void test_list_append(void **state) +{ + size_t idx; + struct test_container *node; + struct list_node root = {}; + struct test_container nodes[] = { + {1}, {2}, {3} + }; + + for (idx = 0; idx < ARRAY_SIZE(nodes); ++idx) + list_append(&nodes[idx].list_node, &root); + + idx = 0; + list_for_each(node, root, list_node) { + assert_ptr_equal(node, &nodes[idx]); + idx++; + } +} + int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(test_list_insert_after), cmocka_unit_test(test_list_insert_before), cmocka_unit_test(test_list_remove), + cmocka_unit_test(test_list_append), };