summaryrefslogtreecommitdiffstats
path: root/src/list.c
diff options
context:
space:
mode:
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);
-}