diff --git a/lib/linklist.c b/lib/linklist.c index 4b16f07dd1..8b6a852826 100644 --- a/lib/linklist.c +++ b/lib/linklist.c @@ -159,6 +159,44 @@ listnode_add_after (struct list *list, struct listnode *pp, void *val) list->count++; } +struct listnode * +listnode_add_before (struct list *list, struct listnode *pp, void *val) +{ + struct listnode *nn; + + assert (val != NULL); + + nn = listnode_new (); + nn->data = val; + + if (pp == NULL) + { + if (list->tail) + list->tail->next = nn; + else + list->head = nn; + + nn->prev = list->tail; + nn->next = pp; + + list->tail = nn; + } + else + { + if (pp->prev) + pp->prev->next = nn; + else + list->head = nn; + + nn->prev = pp->prev; + nn->next = pp; + + pp->prev = nn; + } + list->count++; + return nn; +} + /* Move given listnode to tail of the list */ void listnode_move_to_tail (struct list *l, struct listnode *n) diff --git a/lib/linklist.h b/lib/linklist.h index 6209c8b9d6..96aaf43196 100644 --- a/lib/linklist.h +++ b/lib/linklist.h @@ -68,6 +68,7 @@ extern void list_free (struct list *); extern void listnode_add (struct list *, void *); extern void listnode_add_sort (struct list *, void *); extern void listnode_add_after (struct list *, struct listnode *, void *); +extern struct listnode *listnode_add_before (struct list *, struct listnode *, void *); extern void listnode_move_to_tail (struct list *, struct listnode *); extern void listnode_delete (struct list *, void *); extern struct listnode *listnode_lookup (struct list *, void *);