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
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
/* 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
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,