symlist.c

Sat, 26 Feb 2005 10:37:20 +0100

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sat, 26 Feb 2005 10:37:20 +0100
changeset 89
17a16ed84bbf
parent 88
308dfa54da3e
permissions
-rw-r--r--

Added struct field address macros.

60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
1 /*
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
2 * libtu/symlist.c
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
3 *
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
4 * Copyright (c) Tuomo Valkonen 1999-2004.
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
5 *
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
6 * You may distribute and modify this library under the terms of either
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
7 * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
8 */
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
9
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
10 #include "obj.h"
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
11 #include "symlist.h"
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
12 #include "types.h"
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
13 #include "dlist.h"
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
14 #include "misc.h"
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
15
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
16
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
17 static void free_node(Symlist **symlist, Symlist *node)
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
18 {
62
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
19 UNLINK_ITEM(*symlist, node, next, prev);
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
20 free(node);
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
21 }
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
22
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
23
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
24 static Symlist *mknode(void *symbol)
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
25 {
62
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
26 Symlist *node;
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
27
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
28 if(symbol==NULL)
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
29 return NULL;
62
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
30
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
31 node=ALLOC(Symlist);
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
32
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
33 if(node==NULL)
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
34 return FALSE;
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
35
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
36 node->symbol=symbol;
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
37
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
38 return node;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
39 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
40
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
41
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
42 static Symlist *symlist_find_node(Symlist *symlist, void *symbol)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
43 {
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
44 Symlist *node=symlist;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
45
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
46 while(node!=NULL){
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
47 if(node->symbol==symbol)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
48 break;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
49 node=node->next;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
50 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
51
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
52 return node;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
53 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
54
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
55
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
56 bool symlist_insert_last(Symlist **symlist, void *symbol)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
57 {
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
58 Symlist *node=mknode(symbol);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
59
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
60 if(node==NULL)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
61 return FALSE;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
62
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
63 LINK_ITEM_LAST(*symlist, node, next, prev);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
64
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
65 return TRUE;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
66 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
67
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
68
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
69 bool symlist_insert_first(Symlist **symlist, void *symbol)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
70 {
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
71 Symlist *node=mknode(symbol);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
72
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
73 if(node==NULL)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
74 return FALSE;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
75
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
76 LINK_ITEM_FIRST(*symlist, node, next, prev);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
77
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
78 return TRUE;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
79 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
80
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
81
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
82 bool symlist_reinsert_last(Symlist **symlist, void *symbol)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
83 {
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
84 Symlist *node=symlist_find_node(*symlist, symbol);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
85
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
86 if(node==NULL)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
87 return FALSE;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
89 UNLINK_ITEM(*symlist, node, next, prev);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
90 LINK_ITEM_LAST(*symlist, node, next, prev);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
91
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
92 return TRUE;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
93 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
94
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
95
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
96 bool symlist_reinsert_first(Symlist **symlist, void *symbol)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
97 {
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
98 Symlist *node=symlist_find_node(*symlist, symbol);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
99
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
100 if(node==NULL)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
101 return FALSE;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
102
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
103 UNLINK_ITEM(*symlist, node, next, prev);
62
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
104 LINK_ITEM_FIRST(*symlist, node, next, prev);
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
105
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
106 return TRUE;
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
107 }
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
108
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
109
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
110 void symlist_remove(Symlist **symlist, void *symbol)
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
111 {
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
112 Symlist *node=symlist_find_node(*symlist, symbol);
62
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
113
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
114 if(node!=NULL)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
115 free_node(symlist, node);
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
116 }
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
117
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
118
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
119 void symlist_clear(Symlist **symlist)
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
120 {
62
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
121 while(*symlist!=NULL)
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
122 free_node(symlist, *symlist);
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
123 }
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
124
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
125
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
126 SymlistIterTmp symlist_iter_tmp=NULL;
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
127
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
128
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
129 void symlist_iter_init(SymlistIterTmp *state, Symlist *symlist)
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
130 {
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
131 *state=symlist;
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
132 }
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
133
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
134
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
135 void *symlist_iter(SymlistIterTmp *state)
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
136 {
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
137 void *symbol=NULL;
62
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
138
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
139 if(*state!=NULL){
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
140 symbol=(*state)->symbol;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
141 (*state)=(*state)->next;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
142 }
62
aae5facf9fc5 trunk: changeset 1318
tuomov
parents: 60
diff changeset
143
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
144 return symbol;
60
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
145 }
a4033700e35c trunk: changeset 1313
tuomov
parents:
diff changeset
146
88
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
147
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
148 void symlist_iter_rev_init(SymlistIterTmp *state, Symlist *symlist)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
149 {
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
150 *state=(symlist==NULL ? NULL : symlist->prev);
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
151 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
152
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
153
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
154 void *symlist_iter_rev(SymlistIterTmp *state)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
155 {
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
156 void *symbol=NULL;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
157
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
158 if(*state!=NULL){
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
159 symbol=(*state)->symbol;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
160 *state=(*state)->prev;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
161 if((*state)->next==NULL)
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
162 *state=NULL;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
163 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
164
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
165 return symbol;
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
166 }
308dfa54da3e Symlist improvements.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
167

mercurial