New plugins system
[opsoft.git] / gclib2 / modules / Core / dlist.cxx
blobe334ddd1042f0347cce37a6f61e1ffeeba1b7f5f
1 /*
2 * (c) Oleg Puchinin 2006
3 * graycardinalster@gmail.com
5 */
7 /* 2006-05-25 */
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <Macroses.h>
13 #include <dlist.h>
15 DList::~DList ()
17 __dlist_entry_t * one;
18 __dlist_entry_t * d_del;
19 if (! head || dont_free)
20 return;
22 one = head;
23 while (one) {
24 d_del = one;
25 one = one->next;
26 free (d_del);
28 head = NULL;
29 tail = NULL;
32 char * DList::init (__dlist_entry_t * one)
34 head = one;
35 tail = one;
36 return one->data;
39 char * DList::add_head (char * one)
41 __dlist_entry_t *entry;
43 if (head == NULL)
44 return init (one);
46 entry = new_one (one);
47 head->prev = entry;
48 entry->next = head;
49 head = entry;
51 return one;
54 char * DList::add_tail (char * one)
56 __dlist_entry_t * entry;
57 if (tail == NULL)
58 return init (one);
60 entry = new_one (one);
61 tail->next = entry;
62 entry->prev = tail;
63 tail = entry;
65 return one;
68 void DList::rm (__dlist_entry_t * one)
70 if (! one)
71 return;
73 --ecount;
74 if (one == tail && one == head) {
75 free (one);
76 head = NULL;
77 tail = NULL;
78 return;
81 if (one == head) {
82 head = one->next;
83 head->prev = NULL;
84 free (one);
85 return;
88 if (one == tail) {
89 tail = one->prev;
90 tail->next = NULL;
91 free (one);
92 return;
95 one->prev->next = one->next;
96 one->next->prev = one->prev;
97 free (one);
100 void DList::detach (__dlist_entry_t * one)
102 if (! one)
103 return;
105 if (one == tail && one == head) {
106 head = NULL;
107 tail = NULL;
108 return;
111 if (one == head) {
112 head = one->next;
113 head->prev = NULL;
114 return;
117 if (one == tail) {
118 tail = one->prev;
119 tail->next = NULL;
120 return;
123 one->prev->next = one->next;
124 one->next->prev = one->prev;
128 char * DList::add_after (__dlist_entry_t *two, char * one)
130 __dlist_entry_t * entry;
132 if (! two || ! one)
133 return NULL;
135 if (two == tail)
136 return add_tail (one);
138 entry = new_one (one);
139 if (two->next) {
140 entry->prev = two;
141 entry->next = two->next;
142 two->next->prev = entry;
143 two->next = entry;
144 } else
145 return NULL;
147 return one;
150 char * DList::add_before (__dlist_entry_t *two, char * one)
152 __dlist_entry_t * entry;
154 if (! two || ! one)
155 return NULL;
157 if (two == head)
158 return add_head (one);
160 entry = new_one (one);
161 if (two->prev) {
162 entry->next = two;
163 entry->prev = two->prev;
164 two->prev->next = entry;
165 two->prev = entry;
166 } else
167 return NULL;
169 return one;
172 void DList::foreach (Dfunc_t f)
174 __dlist_entry_t * entry;
175 entry = head;
176 while (entry) {
177 f((void *) entry->data);
178 entry = entry->next;
182 char * DList::add_entry_head (__dlist_entry_t * one)
184 if (head == NULL)
185 return init (one);
186 head->prev = one;
187 one->next = head;
188 one->prev = NULL;
189 head = one;
190 return one->data;
193 char * DList::add_entry_tail (__dlist_entry_t * one)
195 if (tail == NULL)
196 return init (one);
197 tail->next = one;
198 one->prev = tail;
199 one->next = NULL;
200 tail = one;
201 return one->data;
204 __dlist_entry_t * DList::get_entry_at (int N)
206 __dlist_entry_t * one;
207 one = get_head ();
208 if (! one || ! N)
209 return NULL;
210 while ((one = one->next) && one && --N);
211 return NULL;
214 char * DList::get_at (int N)
216 __dlist_entry_t * one;
217 one = get_entry_at (N);
218 if (! one)
219 return NULL;
220 else
221 return one->data;