Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/libbb/llist.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 816 - (hide annotations) (download)
Fri Apr 24 18:33:46 2009 UTC (15 years, 2 months ago) by niro
File MIME type: text/plain
File size: 2003 byte(s)
-updated to busybox-1.13.4
1 niro 532 /* 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 niro 816 * Copyright (C) 2005 Bernhard Reutner-Fischer
8 niro 532 * Copyright (C) 2006 Rob Landley <rob@landley.net>
9     *
10     * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
11     */
12    
13     #include "libbb.h"
14    
15     /* Add data to the start of the linked list. */
16 niro 816 void FAST_FUNC llist_add_to(llist_t **old_head, void *data)
17 niro 532 {
18     llist_t *new_head = xmalloc(sizeof(llist_t));
19 niro 816
20 niro 532 new_head->data = data;
21     new_head->link = *old_head;
22     *old_head = new_head;
23     }
24    
25     /* Add data to the end of the linked list. */
26 niro 816 void FAST_FUNC llist_add_to_end(llist_t **list_head, void *data)
27 niro 532 {
28     llist_t *new_item = xmalloc(sizeof(llist_t));
29 niro 816
30 niro 532 new_item->data = data;
31     new_item->link = NULL;
32    
33 niro 816 if (!*list_head)
34     *list_head = new_item;
35 niro 532 else {
36     llist_t *tail = *list_head;
37 niro 816
38     while (tail->link)
39     tail = tail->link;
40 niro 532 tail->link = new_item;
41     }
42     }
43    
44     /* Remove first element from the list and return it */
45 niro 816 void* FAST_FUNC llist_pop(llist_t **head)
46 niro 532 {
47 niro 816 void *data, *next;
48 niro 532
49 niro 816 if (!*head)
50     return NULL;
51 niro 532
52 niro 816 data = (*head)->data;
53     next = (*head)->link;
54     free(*head);
55     *head = next;
56    
57 niro 532 return data;
58     }
59    
60 niro 816 /* Unlink arbitrary given element from the list */
61     void FAST_FUNC llist_unlink(llist_t **head, llist_t *elm)
62     {
63     llist_t *crt;
64    
65     if (!(elm && *head))
66     return;
67    
68     if (elm == *head) {
69     *head = (*head)->link;
70     return;
71     }
72    
73     for (crt = *head; crt; crt = crt->link) {
74     if (crt->link == elm) {
75     crt->link = elm->link;
76     return;
77     }
78     }
79     }
80    
81 niro 532 /* Recursively free all elements in the linked list. If freeit != NULL
82     * call it on each datum in the list */
83 niro 816 void FAST_FUNC llist_free(llist_t *elm, void (*freeit) (void *data))
84 niro 532 {
85     while (elm) {
86     void *data = llist_pop(&elm);
87 niro 816
88     if (freeit)
89     freeit(data);
90 niro 532 }
91     }
92    
93 niro 816 /* Reverse list order. */
94     llist_t* FAST_FUNC llist_rev(llist_t *list)
95 niro 532 {
96 niro 816 llist_t *rev = NULL;
97    
98 niro 532 while (list) {
99     llist_t *next = list->link;
100 niro 816
101     list->link = rev;
102     rev = list;
103 niro 532 list = next;
104     }
105 niro 816 return rev;
106 niro 532 }