diff options
Diffstat (limited to 'common/list.c')
-rw-r--r-- | common/list.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/common/list.c b/common/list.c index a887bcdd..579d9574 100644 --- a/common/list.c +++ b/common/list.c @@ -70,6 +70,36 @@ struct slist *slist_prepend(struct slist *list, void *data) return entry; } +struct slist *slist_insert_before(struct slist *list, struct slist *sibling, void *data) +{ + struct slist *entry, *prev, *cur; + + entry = malloc(sizeof(struct slist)); + if (!entry) + return list; + + entry->data = data; + entry->next = NULL; + + if (!list) + return entry; + + for (cur = list, prev = NULL; cur != NULL; prev = cur, cur = prev->next) { + if (cur == sibling) + break; + } + + if (!prev) { + entry->next = list; + return entry; + } + + entry->next = prev->next; + prev->next = entry; + + return list; +} + struct slist *slist_remove(struct slist *list, void *data) { struct slist *l, *next, *prev = NULL, *match = NULL; |