Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
 src/libinput-util.c | 14 ++++++++++++
 src/libinput-util.h |  1 +
 test/test-misc.c    | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 79 insertions(+)

diff --git a/src/libinput-util.c b/src/libinput-util.c
index eb6e3ecf..a475c465 100644
--- a/src/libinput-util.c
+++ b/src/libinput-util.c
@@ -61,6 +61,20 @@ list_insert(struct list *list, struct list *elm)
        elm->next->prev = elm;
 }
 
+void
+list_append(struct list *list, struct list *elm)
+{
+       assert((list->next != NULL && list->prev != NULL) ||
+              !"list->next|prev is NULL, possibly missing list_init()");
+       assert(((elm->next == NULL && elm->prev == NULL) || list_empty(elm)) ||
+              !"elm->next|prev is not NULL, list node used twice?");
+
+       elm->next = list;
+       elm->prev = list->prev;
+       list->prev = elm;
+       elm->prev->next = elm;
+}
+
 void
 list_remove(struct list *elm)
 {
diff --git a/src/libinput-util.h b/src/libinput-util.h
index 92e7cf73..6524d940 100644
--- a/src/libinput-util.h
+++ b/src/libinput-util.h
@@ -86,6 +86,7 @@ struct list {
 
 void list_init(struct list *list);
 void list_insert(struct list *list, struct list *elm);
+void list_append(struct list *list, struct list *elm);
 void list_remove(struct list *elm);
 bool list_empty(const struct list *list);
 
diff --git a/test/test-misc.c b/test/test-misc.c
index ea262f65..779baf31 100644
--- a/test/test-misc.c
+++ b/test/test-misc.c
@@ -1580,6 +1580,67 @@ START_TEST(timer_flush)
 }
 END_TEST
 
+START_TEST(list_test_insert)
+{
+       struct list_test {
+               int val;
+               struct list node;
+       } tests[] = {
+               { .val  = 1 },
+               { .val  = 2 },
+               { .val  = 3 },
+               { .val  = 4 },
+       };
+       struct list_test *t;
+       struct list head;
+       int val;
+
+       list_init(&head);
+
+       ARRAY_FOR_EACH(tests, t) {
+               list_insert(&head, &t->node);
+       }
+
+       val = 4;
+       list_for_each(t, &head, node) {
+               ck_assert_int_eq(t->val, val);
+               val--;
+       }
+
+       ck_assert_int_eq(val, 0);
+}
+END_TEST
+
+START_TEST(list_test_append)
+{
+       struct list_test {
+               int val;
+               struct list node;
+       } tests[] = {
+               { .val  = 1 },
+               { .val  = 2 },
+               { .val  = 3 },
+               { .val  = 4 },
+       };
+       struct list_test *t;
+       struct list head;
+       int val;
+
+       list_init(&head);
+
+       ARRAY_FOR_EACH(tests, t) {
+               list_append(&head, &t->node);
+       }
+
+       val = 1;
+       list_for_each(t, &head, node) {
+               ck_assert_int_eq(t->val, val);
+               val++;
+       }
+       ck_assert_int_eq(val, 5);
+}
+END_TEST
+
 TEST_COLLECTION(misc)
 {
        litest_add_no_device("events:conversion", 
event_conversion_device_notify);
@@ -1623,4 +1684,7 @@ TEST_COLLECTION(misc)
        litest_add_no_device("misc:fd", fd_no_event_leak);
 
        litest_add_no_device("misc:library_version", library_version);
+
+       litest_add_no_device("misc:list", list_test_insert);
+       litest_add_no_device("misc:list", list_test_append);
 }
-- 
2.14.4

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to