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
);