]> git.decadent.org.uk Git - ion3.git/blob - libtu/ptrlist.c
[svn-upgrade] Integrating new upstream version, ion3 (20070506)
[ion3.git] / libtu / ptrlist.c
1 /*
2  * libtu/ptrlist.c
3  *
4  * Copyright (c) Tuomo Valkonen 1999-2005. 
5  *
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  */
9
10 #include "obj.h"
11 #include "ptrlist.h"
12 #include "types.h"
13 #include "dlist.h"
14 #include "misc.h"
15
16
17 static void free_node(PtrList **ptrlist, PtrList *node)
18 {
19     UNLINK_ITEM(*ptrlist, node, next, prev);
20     free(node);
21 }
22
23
24 static PtrList *mknode(void *ptr)
25 {
26     PtrList *node;
27     
28     if(ptr==NULL)
29         return NULL;
30     
31     node=ALLOC(PtrList);
32     
33     if(node==NULL)
34         return FALSE;
35         
36     node->ptr=ptr;
37     
38     return node;
39 }
40
41
42 static PtrList *ptrlist_find_node(PtrList *ptrlist, void *ptr)
43 {
44     PtrList *node=ptrlist;
45     
46     while(node!=NULL){
47         if(node->ptr==ptr)
48             break;
49         node=node->next;
50     }
51     
52     return node;
53 }
54
55
56 bool ptrlist_contains(PtrList *ptrlist, void *ptr)
57 {
58     return (ptrlist_find_node(ptrlist, ptr)!=NULL);
59 }
60
61
62 bool ptrlist_insert_last(PtrList **ptrlist, void *ptr)
63 {
64     PtrList *node=mknode(ptr);
65     
66     if(node==NULL)
67         return FALSE;
68     
69     LINK_ITEM_LAST(*ptrlist, node, next, prev);
70     
71     return TRUE;
72 }
73
74
75 bool ptrlist_insert_first(PtrList **ptrlist, void *ptr)
76 {
77     PtrList *node=mknode(ptr);
78     
79     if(node==NULL)
80         return FALSE;
81     
82     LINK_ITEM_FIRST(*ptrlist, node, next, prev);
83     
84     return TRUE;
85 }
86
87
88 bool ptrlist_reinsert_last(PtrList **ptrlist, void *ptr)
89 {
90     PtrList *node=ptrlist_find_node(*ptrlist, ptr);
91     
92     if(node==NULL)
93         return ptrlist_insert_last(ptrlist, ptr);
94     
95     UNLINK_ITEM(*ptrlist, node, next, prev);
96     LINK_ITEM_LAST(*ptrlist, node, next, prev);
97     
98     return TRUE;
99 }
100
101
102 bool ptrlist_reinsert_first(PtrList **ptrlist, void *ptr)
103 {
104     PtrList *node=ptrlist_find_node(*ptrlist, ptr);
105     
106     if(node==NULL)
107         return ptrlist_insert_first(ptrlist, ptr);
108     
109     UNLINK_ITEM(*ptrlist, node, next, prev);
110     LINK_ITEM_FIRST(*ptrlist, node, next, prev);
111     
112     return TRUE;
113 }
114
115
116 bool ptrlist_remove(PtrList **ptrlist, void *ptr)
117 {
118     PtrList *node=ptrlist_find_node(*ptrlist, ptr);
119     
120     if(node!=NULL)
121         free_node(ptrlist, node);
122     
123     return (node!=NULL);
124 }
125
126
127 void ptrlist_clear(PtrList **ptrlist)
128 {
129     while(*ptrlist!=NULL)
130         free_node(ptrlist, *ptrlist);
131 }
132
133
134 PtrListIterTmp ptrlist_iter_tmp=NULL;
135
136
137 void ptrlist_iter_init(PtrListIterTmp *state, PtrList *ptrlist)
138 {
139     *state=ptrlist;
140 }
141
142
143 void *ptrlist_iter(PtrListIterTmp *state)
144 {
145     void *ptr=NULL;
146     
147     if(*state!=NULL){
148         ptr=(*state)->ptr;
149         (*state)=(*state)->next;
150     }
151     
152     return ptr;
153 }
154
155
156 void ptrlist_iter_rev_init(PtrListIterTmp *state, PtrList *ptrlist)
157 {
158     *state=(ptrlist==NULL ? NULL : ptrlist->prev);
159 }
160
161
162 void *ptrlist_iter_rev(PtrListIterTmp *state)
163 {
164     void *ptr=NULL;
165     
166     if(*state!=NULL){
167         ptr=(*state)->ptr;
168         *state=(*state)->prev;
169         if((*state)->next==NULL)
170             *state=NULL;
171     }
172     
173     return ptr;
174 }
175
176
177 void *ptrlist_take_first(PtrList **ptrlist)
178 {
179     PtrList *node=*ptrlist;
180     void *ptr;
181     
182     if(node==NULL)
183         return NULL;
184     
185     ptr=node->ptr;
186     
187     free_node(ptrlist, node);
188     
189     return ptr;
190 }
191     
192         
193 void *ptrlist_take_last(PtrList **ptrlist)
194 {
195     PtrList *node=*ptrlist;
196     void *ptr;
197     
198     if(node==NULL)
199         return NULL;
200     
201     node=node->prev;
202     
203     ptr=node->ptr;
204     
205     free_node(ptrlist, node);
206     
207     return ptr;
208 }