]> git.sur5r.net Git - ngadmin/blob - raw/src/list.c
Raw: separate attribute filtering in a separate function.
[ngadmin] / raw / src / list.c
1
2 #include "list.h"
3
4
5
6
7 // -------------------------
8 List* createEmptyList (void) {
9  
10  List *l;
11  
12  
13  l=malloc(sizeof(List));
14  l->first=NULL;
15  l->last=NULL;
16  l->count=0;
17  
18  #ifdef MT_SAFE_LIST
19  pthread_cond_init(&l->cond, NULL);
20  pthread_mutex_init(&l->mutex, NULL);
21  #endif
22  
23  
24  return l;
25  
26 }
27
28
29
30 // ------------------------------------------------
31 void destroyList (List *l, void (*freefunc)(void*)) {
32  
33  ListNode *pr, *ln;
34  
35  
36  
37  if ( l==NULL ) {
38   return;
39  }
40  
41  
42  #ifdef MT_SAFE_LIST
43  pthread_mutex_destroy(&l->mutex);
44  pthread_cond_destroy(&l->cond);
45  #endif
46  
47  for (ln=l->first; ln!=NULL; ) {
48   
49   pr=ln;
50   
51   if ( freefunc!=NULL ) {
52    freefunc(pr->data);
53   }
54   
55   ln=pr->next;
56   free(pr);
57   
58  }
59  
60  
61  free(l);
62  
63 }
64
65
66
67 // -------------------------------------
68 void pushFrontList (List *l, void* data) {
69  
70  ListNode *ln;
71  
72  
73  if ( l==NULL ) {
74   return;
75  }
76  
77  
78  #ifdef MT_SAFE_LIST
79  pthread_mutex_lock(&l->mutex);
80  #endif
81  
82  ln=malloc(sizeof(ListNode));
83  ln->data=data;
84  ln->prev=NULL;
85  ln->next=l->first;
86  
87  if ( l->first==NULL ) {
88   l->last=ln;
89  } else {
90   l->first->prev=ln;
91  }
92  
93  l->first=ln;
94  l->count++;
95  
96  #ifdef MT_SAFE_LIST
97  pthread_mutex_unlock(&l->mutex);
98  pthread_cond_broadcast(&l->cond);
99  #endif
100  
101 }
102
103
104
105 // ------------------------------------
106 void pushBackList (List *l, void* data) {
107  
108  ListNode *ln;
109  
110  
111  if ( l==NULL ) {
112   return;
113  }
114  
115  
116  #ifdef MT_SAFE_LIST
117  pthread_mutex_lock(&l->mutex);
118  #endif
119  
120  ln=malloc(sizeof(ListNode));
121  ln->data=data;
122  ln->prev=l->last;
123  ln->next=NULL;
124  
125  if ( l->last==NULL ) {
126   l->first=ln;
127  } else {
128   l->last->next=ln;
129  }
130  
131  l->last=ln;
132  l->count++;
133  
134  #ifdef MT_SAFE_LIST
135  pthread_mutex_unlock(&l->mutex);
136  pthread_cond_broadcast(&l->cond);
137  #endif
138  
139 }
140
141
142
143 // -------------------------
144 void* popFrontList (List *l) {
145  
146  ListNode *ln;
147  void* data;
148  
149  
150  if ( l==NULL ) {
151   return NULL;
152  }
153  
154  
155  #ifdef MT_SAFE_LIST
156  pthread_mutex_lock(&l->mutex);
157  #endif
158  
159  if ( (ln=l->first)==NULL ) {
160   #ifdef MT_SAFE_LIST
161   pthread_mutex_unlock(&l->mutex);
162   #endif
163   return NULL;
164  }
165  
166  data=ln->data;
167  l->first=ln->next;
168  
169  if ( ln->next==NULL ) {
170   l->last=NULL;
171  } else {
172   ln->next->prev=NULL;
173  }
174  
175  l->count--;
176  free(ln);
177  
178  #ifdef MT_SAFE_LIST
179  pthread_mutex_unlock(&l->mutex);
180  pthread_cond_broadcast(&l->cond);
181  #endif
182  
183  
184  return data;
185  
186 }
187
188
189
190 // ------------------------
191 void* popBackList (List *l) {
192  
193  ListNode *ln;
194  void* data;
195  
196  
197  
198  if ( l==NULL ) {
199   return NULL;
200  }
201  
202  
203  #ifdef MT_SAFE_LIST
204  pthread_mutex_lock(&l->mutex);
205  #endif
206  
207  if ( (ln=l->last)==NULL ) {
208   #ifdef MT_SAFE_LIST
209   pthread_mutex_unlock(&l->mutex);
210   #endif
211   return NULL;
212  }
213  
214  data=ln->data;
215  l->last=ln->prev;
216  
217  if ( ln->prev==NULL ) {
218   l->first=NULL;
219  } else {
220   ln->prev->next=NULL;
221  }
222  
223  l->count--;
224  free(ln);
225  
226  #ifdef MT_SAFE_LIST
227  pthread_mutex_unlock(&l->mutex);
228  pthread_cond_broadcast(&l->cond);
229  #endif
230  
231  
232  return data;
233  
234 }
235
236
237
238 // ----------------------------------------------
239 void clearList (List *l, void (*freefunc)(void*)) {
240  
241  ListNode *ln, *pr;
242  
243  
244  if ( l==NULL ) {
245   return;
246  }
247  
248  
249  #ifdef MT_SAFE_LIST
250  pthread_mutex_lock(&l->mutex);
251  #endif
252  
253  for (ln=l->first; ln!=NULL; ) {
254   
255   pr=ln;
256   
257   if ( freefunc!=NULL ) {
258    freefunc(pr->data);
259   }
260   
261   ln=pr->next;
262   free(pr);
263   
264  }
265  
266  l->first=NULL;
267  l->last=NULL;
268  l->count=0;
269  
270  #ifdef MT_SAFE_LIST
271  pthread_mutex_unlock(&l->mutex);
272  pthread_cond_broadcast(&l->cond);
273  #endif
274  
275 }
276
277
278
279 static void __destroyElement (List *l, ListNode *ln, void (*freefunc)(void*)) {
280  
281  
282  if ( ln->prev==NULL ) {
283   l->first=ln->next;
284  } else {
285   ln->prev->next=ln->next;
286  }
287  
288  if ( ln->next==NULL ) {
289   l->last=ln->prev;
290  } else {
291   ln->next->prev=ln->prev;
292  }
293  
294  
295  if ( freefunc!=NULL ) {
296   freefunc(ln->data);
297  }
298  
299  l->count--;
300  free(ln);
301  
302 }
303
304
305
306 // -----------------------------------------------------------------
307 bool destroyElement (List *l, ListNode *ln, void (*freefunc)(void*)) {
308  
309  
310  if ( l==NULL || ln==NULL ) {
311   return false;
312  }
313  
314  
315  #ifdef MT_SAFE_LIST
316  pthread_mutex_lock(&l->mutex);
317  #endif
318  
319  __destroyElement(l, ln, freefunc);
320  
321  #ifdef MT_SAFE_LIST
322  pthread_mutex_unlock(&l->mutex);
323  #endif
324  
325  
326  return true;
327  
328 }
329
330
331
332 // ---------------------------------------------------------------
333 bool findAndDestroy (List *l, void* data, void (*freefunc)(void*)) {
334  
335  ListNode *ln;
336  
337  
338  
339  if ( l==NULL ) {
340   return false;
341  }
342  
343  
344  #ifdef MT_SAFE_LIST
345  pthread_mutex_lock(&l->mutex);
346  #endif
347  
348  for (ln=l->first; ln!=NULL && ln->data!=data; ln=ln->next);
349  
350  if ( ln==NULL ) {
351   
352   #ifdef MT_SAFE_LIST
353   pthread_mutex_unlock(&l->mutex);
354   #endif
355   
356  } else {
357   
358   __destroyElement(l, ln, freefunc);
359   
360   #ifdef MT_SAFE_LIST
361   pthread_mutex_unlock(&l->mutex);
362   pthread_cond_broadcast(&l->cond);
363   #endif
364   
365  }
366  
367  
368  
369  return true;
370  
371 }
372
373
374
375 // -------------------------------------------------
376 void browseList (List *l, void (*browsefunc)(void*)) {
377  
378  ListNode *ln;
379  
380  
381  
382  if ( l==NULL || browsefunc==NULL ) {
383   return;
384  }
385  
386  
387  #ifdef MT_SAFE_LIST
388  pthread_mutex_lock(&l->mutex);
389  #endif
390  
391  for (ln=l->first; ln!=NULL; ln=ln->next) {
392   browsefunc(ln->data);
393  }
394  
395  #ifdef MT_SAFE_LIST
396  pthread_mutex_unlock(&l->mutex);
397  #endif
398  
399 }
400
401
402 // --------------------------------------
403 void* convertToArray (List *l, size_t sz) {
404  
405  ListNode *ln;
406  void *tab=NULL, *p;
407  
408  
409  
410  if ( l==NULL || sz==0 ) {
411   return NULL;
412  }
413  
414  
415  #ifdef MT_SAFE_LIST
416  pthread_mutex_lock(&l->mutex);
417  #endif
418  
419  if ( l->count>0 ) {
420   
421   tab=malloc(l->count*sz);
422   p=tab;
423   
424   for (ln=l->first; ln!=NULL; ln=ln->next) {
425    memcpy(p, ln->data, sz);
426    p+=sz;
427   }
428   
429  }
430  
431  #ifdef MT_SAFE_LIST
432  pthread_mutex_unlock(&l->mutex);
433  #endif
434  
435  
436  return tab;
437  
438 }
439
440
441
442