Add p2dp plugin (generalized mdns), thanks to Teco Boot <teco@inf-net.nl>
[olsrd.git] / lib / p2pd / src / dllist.c
1 #include <stdlib.h>
2
3 #include "olsr_types.h"
4 #include "dllist.h"
5
6 /*------------------------------------------------------------------------------
7  * Description : appends a node to the list specified by the head and tail
8  *               elements
9  * Parameters  : head - pointer to the head of the list
10  *               tail - pointer to the tail of the list
11  *               data - pointer to the data to store in the list
12  * Returns     : pointer to the newly created element in the list
13  * Uses data   : none
14  *------------------------------------------------------------------------------
15  */
16 struct node * append_node(struct node ** head, struct node ** tail, void * data)
17 {
18   struct node * new = calloc(1, sizeof(struct node));
19
20   if (*head == NULL) {
21     *head = new;
22   } else {
23     new->prev = *tail;
24     (*tail)->next = new;
25   }
26
27   new->data = data;
28   *tail = new;
29
30   return new;
31 }
32
33 /*------------------------------------------------------------------------------
34  * Description : removes the specified element from the list specified by the
35  *               head and tail elements
36  * Parameters  : head - pointer to the head of the list
37  *               tail - pointer to the tail of the list
38  *               node - the element to remove from the list
39  *               free_data - indicator whether to free the content of the data
40  *               element
41  * Returns     : nothing
42  * Uses data   : none
43  *------------------------------------------------------------------------------
44  */
45 void remove_node(struct node ** head, struct node **tail, struct node * node, bool free_data)
46 {
47   struct node * curr = NULL;
48
49   for (curr = *head; curr; curr = curr->next) {
50     if (curr == node) {
51       // Now we found the proper node so we can remove it
52
53       if (free_data)
54         free(curr->data);
55
56       if (curr == *head) {
57         // Head node
58         *head = curr->next;
59       } else if (curr == *tail) {
60         // Tail node
61         *tail = curr->prev;
62       } else {
63         // Middle node
64         curr->prev->next = curr->next;
65         curr->next->prev = curr->prev;
66       }
67
68       if (*head != NULL)
69         (*head)->prev = NULL;
70
71       if (*tail != NULL)
72         (*tail)->next = NULL;
73
74       if (curr != NULL) {
75         curr->next = curr->prev = NULL;
76         free(curr);
77       }
78       break; // Bail out if we handled a remove
79     }
80   }
81 }
82
83 /*------------------------------------------------------------------------------
84  * Description : clears the entire list specified by the head and tail elements
85  * Parameters  : head - pointer to the head of the list
86  *               tail - pointer to the tail of the list
87  *               free_data - indicator whether to free the data pointer
88  * Returns     : nothing
89  * Uses data   : none
90  *------------------------------------------------------------------------------
91  */
92 void clear_list(struct node **head, struct node **tail, bool free_data)
93 {
94   while (*head)
95     remove_node(head, tail, *head, free_data);
96 }
97
98