diff options
Diffstat (limited to 'src/list.c')
| -rw-r--r-- | src/list.c | 60 |
1 files changed, 45 insertions, 15 deletions
@@ -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); -} |
