summaryrefslogtreecommitdiffstats
path: root/src/list.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2021-12-27 17:53:13 +0100
committerLouis Burda <quent.burda@gmail.com>2021-12-27 17:53:13 +0100
commit16449e8a72c7d9282647823d1747ae5696619d4f (patch)
treec63a477da9cda19426a76ebf0e3e48b261641835 /src/list.c
parentf07580d31d1148c4a1811c36b09ca0ad50d9576b (diff)
downloadtmus-16449e8a72c7d9282647823d1747ae5696619d4f.tar.gz
tmus-16449e8a72c7d9282647823d1747ae5696619d4f.zip
refactored autoplay and prev/next functionality
Diffstat (limited to 'src/list.c')
-rw-r--r--src/list.c60
1 files changed, 45 insertions, 15 deletions
diff --git a/src/list.c b/src/list.c
index 29ddcf1..0573512 100644
--- a/src/list.c
+++ b/src/list.c
@@ -1,9 +1,21 @@
#include "list.h"
#include "util.h"
+void
+list_free(struct link *head, void (*free_item)(void *), int offset)
+{
+ struct link *item;
+
+ while (head->next) {
+ item = link_pop(head->next);
+ free_item(((void *) item) - offset);
+ }
+}
+
int
list_empty(struct link *head)
{
+ ASSERT(head != NULL);
return head->next == NULL;
}
@@ -28,20 +40,37 @@ list_ffind(struct link *head, struct link *link)
struct link *iter;
ASSERT(head != NULL);
-
for (iter = head->next; iter && iter != link; iter = iter->next);
-
return (iter == link);
}
struct link *
-link_back(struct link *link)
+list_at(struct link *head, int n)
{
- ASSERT(link != NULL);
+ ASSERT(head != NULL);
+ return link_iter(head->next, n);
+}
- for (; link->next; link = link->next);
+void
+list_push_front(struct link *head, struct link *link)
+{
+ link_append(head, link);
+}
- return link;
+void
+list_push_back(struct link *cur, struct link *link)
+{
+ struct link *back;
+
+ back = link_back(cur);
+ link_append(back, link);
+}
+
+struct link *
+list_pop_front(struct link *head)
+{
+ ASSERT(head != NULL);
+ return link_pop(head->next);
}
void
@@ -73,6 +102,16 @@ link_append(struct link *cur, struct link *link)
}
struct link *
+link_back(struct link *link)
+{
+ ASSERT(link != NULL);
+
+ for (; link->next; link = link->next);
+
+ return link;
+}
+
+struct link *
link_pop(struct link *link)
{
ASSERT(link != NULL);
@@ -97,12 +136,3 @@ link_iter(struct link *link, int n)
return link;
}
-
-void
-list_push_back(struct link *cur, struct link *link)
-{
- struct link *back;
-
- back = link_back(cur);
- link_append(back, link);
-}