summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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),
};