0d599db6b4974cbce25285b9855c11402b114ec6
[oweals/busybox.git] / libbb / llist.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * linked list helper functions.
4  *
5  * Copyright (C) 2003 Glenn McGrath
6  * Copyright (C) 2005 Vladimir Oleynik
7  * Copyright (C) 2005 Bernhard Fischer
8  *
9  * Licensed under the GPL v2, see the file LICENSE in this tarball.
10  */
11 #include <stdlib.h>
12 #include "libbb.h"
13
14 #ifdef L_llist_add_to
15 /* Add data to the start of the linked list.  */
16 llist_t *llist_add_to(llist_t *old_head, char *new_item)
17 {
18         llist_t *new_head;
19
20         new_head = xmalloc(sizeof(llist_t));
21         new_head->data = new_item;
22         new_head->link = old_head;
23
24         return (new_head);
25 }
26 #endif
27
28 #ifdef L_llist_add_to_end
29 /* Add data to the end of the linked list.  */
30 llist_t *llist_add_to_end(llist_t *list_head, char *data)
31 {
32         llist_t *new_item;
33
34         new_item = xmalloc(sizeof(llist_t));
35         new_item->data = data;
36         new_item->link = NULL;
37
38         if (list_head == NULL) {
39                 list_head = new_item;
40         } else {
41                 llist_t *tail = list_head;
42                 while (tail->link)
43                         tail = tail->link;
44                 tail->link = new_item;
45         }
46         return list_head;
47 }
48 #endif
49
50 #ifdef L_llist_pop
51 /* Remove first element from the list and return it */
52 void *llist_pop(llist_t **head)
53 {
54         void *data;
55
56         if(!*head) data = *head;
57         else {
58                 void *next = (*head)->link;
59                 data = (*head)->data;
60                 *head = (*head)->link;
61                 free(next);
62         }
63
64         return data;
65 }
66 #endif
67
68 #ifdef L_llist_free
69 /* Recursively free all elements in the linked list.  If freeit != NULL
70  * call it on each datum in the list */
71 void llist_free(llist_t *elm, void (*freeit)(void *data))
72 {
73         while (elm) {
74                 void *data = llist_pop(&elm);
75                 if (freeit) freeit(data);
76         }
77 }
78 #endif