4 * Copyright (c) Tuomo Valkonen 1999-2005.
6 * You may distribute and modify this library under the terms of either
7 * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
17 static void free_node(PtrList **ptrlist, PtrList *node)
19 UNLINK_ITEM(*ptrlist, node, next, prev);
24 static PtrList *mknode(void *ptr)
42 static PtrList *ptrlist_find_node(PtrList *ptrlist, void *ptr)
44 PtrList *node=ptrlist;
56 bool ptrlist_contains(PtrList *ptrlist, void *ptr)
58 return (ptrlist_find_node(ptrlist, ptr)!=NULL);
62 bool ptrlist_insert_last(PtrList **ptrlist, void *ptr)
64 PtrList *node=mknode(ptr);
69 LINK_ITEM_LAST(*ptrlist, node, next, prev);
75 bool ptrlist_insert_first(PtrList **ptrlist, void *ptr)
77 PtrList *node=mknode(ptr);
82 LINK_ITEM_FIRST(*ptrlist, node, next, prev);
88 bool ptrlist_reinsert_last(PtrList **ptrlist, void *ptr)
90 PtrList *node=ptrlist_find_node(*ptrlist, ptr);
93 return ptrlist_insert_last(ptrlist, ptr);
95 UNLINK_ITEM(*ptrlist, node, next, prev);
96 LINK_ITEM_LAST(*ptrlist, node, next, prev);
102 bool ptrlist_reinsert_first(PtrList **ptrlist, void *ptr)
104 PtrList *node=ptrlist_find_node(*ptrlist, ptr);
107 return ptrlist_insert_first(ptrlist, ptr);
109 UNLINK_ITEM(*ptrlist, node, next, prev);
110 LINK_ITEM_FIRST(*ptrlist, node, next, prev);
116 bool ptrlist_remove(PtrList **ptrlist, void *ptr)
118 PtrList *node=ptrlist_find_node(*ptrlist, ptr);
121 free_node(ptrlist, node);
127 void ptrlist_clear(PtrList **ptrlist)
129 while(*ptrlist!=NULL)
130 free_node(ptrlist, *ptrlist);
134 PtrListIterTmp ptrlist_iter_tmp=NULL;
137 void ptrlist_iter_init(PtrListIterTmp *state, PtrList *ptrlist)
143 void *ptrlist_iter(PtrListIterTmp *state)
149 (*state)=(*state)->next;
156 void ptrlist_iter_rev_init(PtrListIterTmp *state, PtrList *ptrlist)
158 *state=(ptrlist==NULL ? NULL : ptrlist->prev);
162 void *ptrlist_iter_rev(PtrListIterTmp *state)
168 *state=(*state)->prev;
169 if((*state)->next==NULL)
177 void *ptrlist_take_first(PtrList **ptrlist)
179 PtrList *node=*ptrlist;
187 free_node(ptrlist, node);
193 void *ptrlist_take_last(PtrList **ptrlist)
195 PtrList *node=*ptrlist;
205 free_node(ptrlist, node);