40#if defined(DEBUG_MALLOC) && defined(DEBUG_MALLOC_LIST)
41s_list_t* _ml_new(
const void *elem,
int line,
char *fi)
44 item = freewrlMalloc(line, fi,
sizeof(s_list_t), TRUE);
45 ml_elem(item) = (
void *) elem;
49s_list_t* ml_new(
const void *elem)
52 item = XALLOC(s_list_t);
53 ml_elem(item) = (
void *) elem;
61int ml_count(s_list_t *list)
76s_list_t* ml_prev(s_list_t *list, s_list_t *item)
79 if (!item)
return NULL;
94s_list_t* ml_last(s_list_t *list)
107s_list_t* ml_find(s_list_t *list, s_list_t *item)
112 list = ml_next(list);
121s_list_t* ml_find_elem(s_list_t *list,
void *elem)
124 if (ml_elem(list) == elem)
126 list = ml_next(list);
134s_list_t* ml_insert(s_list_t *list, s_list_t *point, s_list_t *item)
137 if (item) ml_next(item) = point;
140 if (!point || (list == point)) {
141 if (item) ml_next(item) = list;
144 prev = ml_prev(list, point);
146 ml_next(prev) = item;
147 ml_next(item) = point;
157s_list_t* ml_append(s_list_t *list, s_list_t *item)
160 ml_next(ml_last(list)) = item;
170void ml_delete(s_list_t *list, s_list_t *item)
173 prev = ml_prev(list, item);
175 ml_next(prev) = ml_next(item);
182s_list_t *ml_remove(s_list_t *list, s_list_t *item)
184 s_list_t *prev, *newlist;
186 prev = ml_prev(list, item);
188 ml_next(prev) = ml_next(item);
194void ml_enqueue(s_list_t **list, s_list_t *item)
196 *list = ml_insert(*list,*list,item);
198s_list_t* ml_dequeue(s_list_t **list){
199 s_list_t* item = NULL;
200 item = ml_last(*list);
201 *list = ml_remove(*list,item);
206void ml_free(s_list_t *item){
216s_list_t* ml_delete_self(s_list_t *list, s_list_t *item)
225 ml_delete(list, item);
233void ml_delete2(s_list_t *list, s_list_t *item, f_free_t f)
236 prev = ml_prev(list, item);
237 ml_next(prev) = ml_next(item);
241 ERROR_MSG(
"ml_delete2: *error* deleting empty item %p from list %p\n", item, list);
250void ml_delete_all(s_list_t *list)
254 next = ml_next(list);
264void ml_delete_all2(s_list_t *list, f_free_t f)
266 s_list_t *begin, *next;
275 ERROR_MSG(
"ml_delete_all2: *error* deleting empty item %p from list %p\n", list, begin);
277 next = ml_next(list);
287s_list_t* ml_get(s_list_t* list,
int index)
294 list = ml_next(list);
300void ml_dump(s_list_t *list)
302 TRACE_MSG(
"ml_dump (%p) : ", list);
303 ml_foreach(list, TRACE_MSG(
"%p ", __l));
307void ml_dump_char(s_list_t *list)
309 TRACE_MSG(
"ml_dump_char (%p) : ", list);
310 ml_foreach(list, TRACE_MSG(
"%s ", (
char*)ml_elem(__l)));
334cd_list_t* cdl_new(
const void *elem)
337 item = XALLOC(cd_list_t);
338 cdl_elem(item) = (
void *) elem;
347int cdl_count(cd_list_t *head)
354 list = cdl_next(list);
355 }
while(list != head);
362cd_list_t* cdl_find(cd_list_t *head, cd_list_t *item)
364 cd_list_t *list = head;
365 if(!head)
return NULL;
369 list = cdl_next(list);
370 }
while(list != head);
379cd_list_t* cdl_find_elem(cd_list_t *head,
void *elem)
381 cd_list_t *list = head;
382 if(!list)
return NULL;
384 if (cdl_elem(list) == elem)
386 list = cdl_next(list);
387 }
while(list != head);
395cd_list_t* cdl_insert(cd_list_t *head, cd_list_t *point, cd_list_t *item)
398 if(!item)
return head;
402 if(!point) tmp = item;
408 if(!point) point = head;
410 item->prev = point->prev;
412 item->prev->next = item;
423cd_list_t* cdl_append(cd_list_t *head, cd_list_t *item)
427 last = cdl_prev(head);
445cd_list_t *cdl_delete(cd_list_t *head, cd_list_t *item)
447 cd_list_t *prev, *next, *ret;
450 ERROR_MSG(
"cdl_delete: no head or item\n");
454 if(item == head) ret = head->next;
455 if(head->next == head) ret = NULL;
457 prev = cdl_prev(item);
458 next = cdl_next(item);
471cd_list_t * cdl_delete2(cd_list_t *head, cd_list_t *item, f_free_t f)
473 cd_list_t *prev, *next, *ret;
476 ERROR_MSG(
"cdl_delete2: no head or item\n");
480 if(item == head) ret = head->next;
481 if(head->next == head) ret = NULL;
483 prev = cdl_prev(item);
484 next = cdl_next(item);
490 ERROR_MSG(
"cdl_delete2: *error* deleting empty item %p from list %p\n", item, head);
500void cdl_delete_all(cd_list_t *head)
502 cd_list_t *next, *list;
506 next = cdl_next(list);
509 }
while(list != head);
516void cdl_delete_all2(cd_list_t *head, f_free_t f)
518 cd_list_t *list, *next;
525 if (cdl_elem(list)) {
528 ERROR_MSG(
"cdl_delete_all2: *error* deleting empty item %p from list %p\n", list, head);
530 next = cdl_next(list);
533 }
while(list != head);
540cd_list_t* cdl_get(cd_list_t* head,
int index)
550 list = cdl_next(list);
552 }
while(list != head);
556void cdl_dump(cd_list_t *head)
558 TRACE_MSG(
"cdl_dump (%p) : ", head);
559 cdl_foreach(list, TRACE_MSG(
"%p ", __l));
563void cdl_dump_char(cd_list_t *head)
565 TRACE_MSG(
"cdl_dump_char (%p) : ", head);
566 cdl_foreach(list, TRACE_MSG(
"%s ", (
char*)cdl_elem(__l)));