objlist.c

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

mercurial