Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/libbb/llist.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/libbb/llist.c
r821 r1770 8 8 * Copyright (C) 2006 Rob Landley <rob@landley.net> 9 9 * 10 * Licensed under the GPL v2 , see the file LICENSE in this tarball.10 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. 11 11 */ 12 #include <stdlib.h> 12 13 13 #include "libbb.h" 14 14 15 #ifdef L_llist_add_to16 15 /* Add data to the start of the linked list. */ 17 16 void llist_add_to(llist_t **old_head, void *data) 18 17 { 19 18 llist_t *new_head = xmalloc(sizeof(llist_t)); 19 20 20 new_head->data = data; 21 21 new_head->link = *old_head; 22 22 *old_head = new_head; 23 23 } 24 #endif25 24 26 #ifdef L_llist_add_to_end27 25 /* Add data to the end of the linked list. */ 28 26 void llist_add_to_end(llist_t **list_head, void *data) 29 27 { 30 28 llist_t *new_item = xmalloc(sizeof(llist_t)); 29 31 30 new_item->data = data; 32 31 new_item->link = NULL; 33 32 34 if (!*list_head) *list_head = new_item; 33 if (!*list_head) 34 *list_head = new_item; 35 35 else { 36 36 llist_t *tail = *list_head; 37 while (tail->link) tail = tail->link; 37 38 while (tail->link) 39 tail = tail->link; 38 40 tail->link = new_item; 39 41 } 40 42 } 41 #endif42 43 43 #ifdef L_llist_pop44 44 /* Remove first element from the list and return it */ 45 45 void *llist_pop(llist_t **head) 46 46 { 47 void *data ;47 void *data, *next; 48 48 49 if (!*head) data = *head;50 else {51 void *next = (*head)->link; 52 53 free(*head);54 *head = next;55 }49 if (!*head) 50 return NULL; 51 52 data = (*head)->data; 53 next = (*head)->link; 54 free(*head); 55 *head = next; 56 56 57 57 return data; 58 58 } 59 #endif60 59 61 #ifdef L_llist_free 60 /* Unlink arbitrary given element from the list */ 61 void 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 62 81 /* Recursively free all elements in the linked list. If freeit != NULL 63 82 * call it on each datum in the list */ 64 void llist_free(llist_t *elm, void (*freeit) (void *data))83 void llist_free(llist_t *elm, void (*freeit) (void *data)) 65 84 { 66 85 while (elm) { 67 86 void *data = llist_pop(&elm); 68 if (freeit) freeit(data); 87 88 if (freeit) 89 freeit(data); 69 90 } 70 91 } 92 93 #ifdef UNUSED 94 /* Reverse list order. */ 95 llist_t *llist_rev(llist_t *list) 96 { 97 llist_t *rev = NULL; 98 99 while (list) { 100 llist_t *next = list->link; 101 102 list->link = rev; 103 rev = list; 104 list = next; 105 } 106 return rev; 107 } 71 108 #endif
Note:
See TracChangeset
for help on using the changeset viewer.