Merge 'remotes/dkogan/merged_submodules'
[notion.git] / libtu / ptrlist.c
blobf86d9a4bc33fe1ad74d3207c3e1b4f46ca97e8cc
1 /*
2 * libtu/ptrlist.c
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.
8 */
10 #include "obj.h"
11 #include "ptrlist.h"
12 #include "types.h"
13 #include "dlist.h"
14 #include "misc.h"
17 static void free_node(PtrList **ptrlist, PtrList *node)
19 UNLINK_ITEM(*ptrlist, node, next, prev);
20 free(node);
24 static PtrList *mknode(void *ptr)
26 PtrList *node;
28 if(ptr==NULL)
29 return NULL;
31 node=ALLOC(PtrList);
33 if(node==NULL)
34 return FALSE;
36 node->ptr=ptr;
38 return node;
42 static PtrList *ptrlist_find_node(PtrList *ptrlist, void *ptr)
44 PtrList *node=ptrlist;
46 while(node!=NULL){
47 if(node->ptr==ptr)
48 break;
49 node=node->next;
52 return node;
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);
66 if(node==NULL)
67 return FALSE;
69 LINK_ITEM_LAST(*ptrlist, node, next, prev);
71 return TRUE;
75 bool ptrlist_insert_first(PtrList **ptrlist, void *ptr)
77 PtrList *node=mknode(ptr);
79 if(node==NULL)
80 return FALSE;
82 LINK_ITEM_FIRST(*ptrlist, node, next, prev);
84 return TRUE;
88 bool ptrlist_reinsert_last(PtrList **ptrlist, void *ptr)
90 PtrList *node=ptrlist_find_node(*ptrlist, ptr);
92 if(node==NULL)
93 return ptrlist_insert_last(ptrlist, ptr);
95 UNLINK_ITEM(*ptrlist, node, next, prev);
96 LINK_ITEM_LAST(*ptrlist, node, next, prev);
98 return TRUE;
102 bool ptrlist_reinsert_first(PtrList **ptrlist, void *ptr)
104 PtrList *node=ptrlist_find_node(*ptrlist, ptr);
106 if(node==NULL)
107 return ptrlist_insert_first(ptrlist, ptr);
109 UNLINK_ITEM(*ptrlist, node, next, prev);
110 LINK_ITEM_FIRST(*ptrlist, node, next, prev);
112 return TRUE;
116 bool ptrlist_remove(PtrList **ptrlist, void *ptr)
118 PtrList *node=ptrlist_find_node(*ptrlist, ptr);
120 if(node!=NULL)
121 free_node(ptrlist, node);
123 return (node!=NULL);
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)
139 *state=ptrlist;
143 void *ptrlist_iter(PtrListIterTmp *state)
145 void *ptr=NULL;
147 if(*state!=NULL){
148 ptr=(*state)->ptr;
149 (*state)=(*state)->next;
152 return ptr;
156 void ptrlist_iter_rev_init(PtrListIterTmp *state, PtrList *ptrlist)
158 *state=(ptrlist==NULL ? NULL : ptrlist->prev);
162 void *ptrlist_iter_rev(PtrListIterTmp *state)
164 void *ptr=NULL;
166 if(*state!=NULL){
167 ptr=(*state)->ptr;
168 *state=(*state)->prev;
169 if((*state)->next==NULL)
170 *state=NULL;
173 return ptr;
177 void *ptrlist_take_first(PtrList **ptrlist)
179 PtrList *node=*ptrlist;
180 void *ptr;
182 if(node==NULL)
183 return NULL;
185 ptr=node->ptr;
187 free_node(ptrlist, node);
189 return ptr;
193 void *ptrlist_take_last(PtrList **ptrlist)
195 PtrList *node=*ptrlist;
196 void *ptr;
198 if(node==NULL)
199 return NULL;
201 node=node->prev;
203 ptr=node->ptr;
205 free_node(ptrlist, node);
207 return ptr;