1 /************************************************/
4 /* Jean-Marc Pigeon <jmp@safe.ca> 2009 */
6 /************************************************/
7 /* This program is free software; you can */
8 /* redistribute it and/or modify it under the */
9 /* terms of the GNU General Public License as */
10 /* published by the Free Software Foundation */
11 /* version 2 of the License */
13 /* This program is distributed in the hope that */
14 /* it will be useful, but WITHOUT ANY WARRANTY; */
15 /* without even the implied warranty of */
16 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR */
17 /* PURPOSE. See the GNU General Public License */
18 /* for more details. */
20 /* You should have received a copy of the GNU */
21 /* General Public License along with this */
22 /* program; if not, write to the Free Software */
23 /* Foundation, Inc., 51 Franklin Street, */
24 /* Fifth Floor, Boston, MA 02110-1301, USA. */
25 /************************************************/
27 /* Implement utlity level procedure to */
28 /* manage linked list */
30 /************************************************/
39 /************************************************/
41 /* Procedure to add a payload within */
44 /************************************************/
45 VPTR *vec_addveclst(VPTR *vptr,void *payload)
50 node=(VECLST *)calloc(1,sizeof(VECLST));
51 node->payload=payload;
52 if (vptr==(VPTR *)0) {
53 vptr=(VPTR *)calloc(1,sizeof(VPTR));
60 node->prv=vptr->vcl->prv;
61 vptr->vcl->prv->nxt=node;
70 /************************************************/
72 /* Procedure to remove on vector from the */
73 /* vector list, return the number of */
74 /* payload subtracted. */
76 /************************************************/
77 int vec_rmveclst(VPTR **vptr,void *payload)
83 if (*vptr!=(VPTR *)0) {
87 for (i=0,cur=(*vptr)->vcl;i<(*vptr)->numvec;i++) {
88 if (payload==cur->payload) {
93 cur->prv->nxt=cur->nxt;
94 cur->nxt->prv=cur->prv;
101 if ((*vptr)->numvec==0) {
111 /************************************************/
113 /* Procedure to free a vector list, */
114 /* memory used by payload is freed too. */
116 /************************************************/
117 VPTR *vec_freeveclst(VPTR *vptr,void *(*freepayload)(void *))
120 if (vptr!=(VPTR *)0) {
122 register VECLST *cur;
124 for (i=0,cur=vptr->vcl->prv;i<vptr->numvec;i++) {
125 register VECLST *tofree;
126 register void *payload;
129 payload=tofree->payload;
132 if ((payload!=(void *)0)&&(freepayload!=(void *(*)(void*))0))
133 (void) freepayload(payload);
143 /************************************************/
145 /* Procedure to count number of element */
146 /* within an ordered list. */
148 /************************************************/
149 unsigned int vec_sizelstlst(void **lptr)
152 register unsigned int num;
155 if (lptr!=(void **)0) {
156 for (;*lptr!=(void *)0;lptr++,num++);
163 /************************************************/
165 /* Procedure to add a payload within */
166 /* an ordered list */
168 /************************************************/
169 void **vec_addlstlst(void **lptr,void *payload)
175 if (lptr!=(void **)0) {
176 num=vec_sizelstlst(lptr);
177 lptr=(void **)realloc(lptr,(num+2)*sizeof(void *));
180 lptr=(void **)calloc(2,sizeof(void *));
182 lptr[num+1]=(void *)0;
188 /************************************************/
190 /* Procedure to merge to ordereded list */
191 /* second list array definition is freed */
193 /************************************************/
194 void **vec_mrglstlst(void **lptr,void **ladd)
197 if (ladd!=(void **)0) {
198 register unsigned int t1;
199 register unsigned int t2;
201 if (lptr==(void **)0)
202 lptr=(void **)calloc(1,sizeof(void *));
203 t1=vec_sizelstlst(lptr);
204 t2=vec_sizelstlst(ladd);
205 lptr=(void **)realloc(lptr,(t1+t2+1)*sizeof(void *));
206 (void) memcpy(lptr+t1,ladd,(t2+1)*sizeof(void *));
214 /************************************************/
216 /* Procedure to remove one payload from */
217 /* within an ordered list */
218 /* Return true if success, false otherwise */
220 /************************************************/
221 int vec_rmlstlst(void **lptr,void *payload)
227 if (lptr!=(void **)0) {
228 for (;*lptr!=(void *)0;lptr++) {
229 if (success==false) {
230 if (*lptr==payload) {
244 /************************************************/
246 /* Procedure to remove all payload from */
247 /* an ordered list. */
249 /************************************************/
250 void **vec_freelstlst(void **lptr,void *(*freepayload)(void *))
253 if (lptr!=(void **)0) {
256 for (p=lptr;*p!=(void *)0;p++) {
257 if (freepayload!=(void *(*)(void*))0)