objlist.c

changeset 60
a4033700e35c
child 62
aae5facf9fc5
equal deleted inserted replaced
59:d8ecbeda7683 60:a4033700e35c
1 /*
2 * libtu/objlist.c
3 *
4 * Copyright (c) Tuomo Valkonen 1999-2004.
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 "types.h"
12 #include "objlist.h"
13 #include "dlist.h"
14 #include "misc.h"
15
16
17 static ObjList *iter_next=NULL;
18
19
20 static void free_node(ObjList **objlist, ObjList *node)
21 {
22 UNLINK_ITEM(*objlist, node, next, prev);
23 free(node);
24 }
25
26
27 void watch_handler(Watch *watch, Obj *obj)
28 {
29 ObjList *node=(ObjList*)watch;
30 ObjList **list=node->list;
31
32 if(iter_next==node)
33 iter_next=node->next;
34
35 free_node(list, node);
36 }
37
38
39
40 bool objlist_insert(ObjList **objlist, Obj *obj)
41 {
42 ObjList *node;
43
44 if(obj==NULL)
45 return FALSE;
46
47 node=ALLOC(ObjList);
48
49 if(node==NULL)
50 return FALSE;
51
52 watch_init(&(node->watch));
53 watch_setup(&(node->watch), obj, watch_handler);
54 node->list=objlist;
55
56 LINK_ITEM_FIRST(*objlist, node, next, prev);
57
58 return TRUE;
59 }
60
61
62 void objlist_remove(ObjList **objlist, Obj *obj)
63 {
64 ObjList *node=*objlist;
65
66 while(node!=NULL){
67 if(node->watch.obj==obj){
68 watch_reset(&(node->watch));
69 free_node(objlist, node);
70 return;
71 }
72 node=node->next;
73 }
74 }
75
76
77 void objlist_clear(ObjList **objlist)
78 {
79 while(*objlist!=NULL){
80 watch_reset(&((*objlist)->watch));
81 free_node(objlist, *objlist);
82 }
83 }
84
85
86 /* Warning: not thread-safe */
87
88
89 Obj *objlist_init_iter(ObjList *objlist)
90 {
91 if(objlist==NULL){
92 iter_next=NULL;
93 return NULL;
94 }
95
96 iter_next=objlist->next;
97 return objlist->watch.obj;
98 }
99
100
101 Obj *objlist_iter()
102 {
103 ObjList *ret;
104
105 if(iter_next==NULL)
106 return NULL;
107
108 ret=iter_next;
109 iter_next=iter_next->next;
110
111 return ret->watch.obj;
112 }

mercurial