From 031cf17e974a9ea972bd5ae22272f9f089527b78 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 3 Sep 2004 06:25:36 +0000 Subject: [PATCH] Add list_head(), list_tail(). --- src/lib/list.c | 38 ++++++++++++++++++++++++++++++++------ src/lib/list.h | 11 +++++++---- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/lib/list.c b/src/lib/list.c index 0011fc7..a5f7c1a 100644 --- a/src/lib/list.c +++ b/src/lib/list.c @@ -103,6 +103,16 @@ list_rbegin (struct list *list) return list->tail.prev; } +/* Returns the element before ELEM in its list. If ELEM is the + first element in its list, returns the list head. Results are + undefined if ELEM is itself a list head. */ +list_elem * +list_prev (list_elem *elem) +{ + ASSERT (is_interior (elem) || is_tail (elem)); + return elem->prev; +} + /* Returns LIST's head. list_rend() is often used in iterating through a list in @@ -123,14 +133,30 @@ list_rend (struct list *list) return &list->head; } -/* Returns the element before ELEM in its list. If ELEM is the - first element in its list, returns the list head. Results are - undefined if ELEM is itself a list head. */ +/* Return's LIST's head. + + list_head() can be used for an alternate style of iterating + through a list, e.g.: + + e = list_head (&list); + while ((e = list_next (e)) != list_end (&list)) + { + ... + } +*/ list_elem * -list_prev (list_elem *elem) +list_head (struct list *list) { - ASSERT (is_interior (elem) || is_tail (elem)); - return elem->prev; + ASSERT (list != NULL); + return &list->head; +} + +/* Return's LIST's tail. */ +list_elem * +list_tail (struct list *list) +{ + ASSERT (list != NULL); + return &list->tail; } /* Inserts ELEM just before BEFORE, which may be either an diff --git a/src/lib/list.h b/src/lib/list.h index a808606..1bf6631 100644 --- a/src/lib/list.h +++ b/src/lib/list.h @@ -89,16 +89,16 @@ /* List element. */ typedef struct list_elem { - struct list_elem *prev; /* Previous node in list. */ - struct list_elem *next; /* Next node in list. */ + struct list_elem *prev; /* Previous list element. */ + struct list_elem *next; /* Next list element. */ } list_elem; /* List. */ struct list { - list_elem head; /* Start-of-list header node. */ - list_elem tail; /* End-of-list header node. */ + list_elem head; /* List head. */ + list_elem tail; /* List tail. */ }; /* Converts pointer to list element LIST_ELEM into a pointer to @@ -120,6 +120,9 @@ list_elem *list_rbegin (struct list *); list_elem *list_prev (list_elem *); list_elem *list_rend (struct list *); +list_elem *list_head (struct list *); +list_elem *list_tail (struct list *); + /* List insertion. */ void list_insert (list_elem *, list_elem *); void list_splice (list_elem *before, -- 2.30.2