summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaul E Rangel <rrangel@chromium.org>2021-11-01 13:40:14 -0600
committerPatrick Georgi <pgeorgi@google.com>2021-11-03 08:29:16 +0000
commit4c8c8442ab6d3b0cdc267f5c479dc5d54bf87525 (patch)
tree29b2dde483588e9db54b5093d2b18cbd75e36d40
parent74a06296608e4c868e101ea47c0a1389977ecd91 (diff)
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 Reviewed-on: https://review.coreboot.org/c/coreboot/+/58805 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
-rw-r--r--src/include/list.h2
-rw-r--r--src/lib/list.c8
-rw-r--r--tests/lib/list-test.c20
3 files changed, 30 insertions, 0 deletions
diff --git a/src/include/list.h b/src/include/list.h
index 6f0b54d818..bfd92a747b 100644
--- a/src/include/list.h
+++ b/src/include/list.h
@@ -15,6 +15,8 @@ void list_remove(struct list_node *node);
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 01d5c8914e..c3f8ee42c8 100644
--- a/src/lib/list.c
+++ b/src/lib/list.c
@@ -28,3 +28,11 @@ void list_insert_before(struct list_node *node, struct list_node *before)
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 309346abec..39bfb17f7c 100644
--- a/tests/lib/list-test.c
+++ b/tests/lib/list-test.c
@@ -116,12 +116,32 @@ void test_list_remove(void **state)
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),
};