1 /* @configure_input@ */
4 ** Copyright 1998-2002 University of Illinois Board of Trustees
5 ** Copyright 1998-2002 Mark D. Roth
6 ** All rights reserved.
8 ** @LISTHASH_PREFIX@_list.c - linked list routines
10 ** Mark D. Roth <roth@uiuc.edu>
11 ** Campus Information Technologies and Educational Services
12 ** University of Illinois at Urbana-Champaign
18 #include <@LISTHASH_PREFIX@_listhash.h>
22 #include <sys/param.h>
31 ** @LISTHASH_PREFIX@_listptr_reset() - reset a list pointer
34 @LISTHASH_PREFIX@
_listptr_reset(@LISTHASH_PREFIX@_listptr_t
*lp
)
41 ** @LISTHASH_PREFIX@_listptr_data() - retrieve the data pointed to by lp
44 @LISTHASH_PREFIX@
_listptr_data(@LISTHASH_PREFIX@_listptr_t
*lp
)
51 ** @LISTHASH_PREFIX@_list_new() - create a new, empty list
53 @LISTHASH_PREFIX@_list_t
*
54 @LISTHASH_PREFIX@
_list_new(int flags
, @LISTHASH_PREFIX@_cmpfunc_t cmpfunc
)
56 @LISTHASH_PREFIX@_list_t
*newlist
;
59 printf("in @LISTHASH_PREFIX@_list_new(%d, 0x%lx)\n", flags
, cmpfunc
);
62 if (flags
!= LIST_USERFUNC
63 && flags
!= LIST_STACK
64 && flags
!= LIST_QUEUE
)
70 newlist
= (@LISTHASH_PREFIX@_list_t
*)calloc(1, sizeof(@LISTHASH_PREFIX@_list_t
));
72 newlist
->cmpfunc
= cmpfunc
;
74 newlist
->cmpfunc
= (@LISTHASH_PREFIX@_cmpfunc_t
)strcmp
;
75 newlist
->flags
= flags
;
82 ** @LISTHASH_PREFIX@_list_iterate() - call a function for every element
86 @LISTHASH_PREFIX@
_list_iterate(@LISTHASH_PREFIX@_list_t
*l
,
87 @LISTHASH_PREFIX@_iterate_func_t plugin
,
90 @LISTHASH_PREFIX@_listptr_t n
;
95 for (n
= l
->first
; n
!= NULL
; n
= n
->next
)
97 if ((*plugin
)(n
->data
, state
) == -1)
106 ** @LISTHASH_PREFIX@_list_empty() - empty the list
109 @LISTHASH_PREFIX@
_list_empty(@LISTHASH_PREFIX@_list_t
*l
, @LISTHASH_PREFIX@_freefunc_t freefunc
)
111 @LISTHASH_PREFIX@_listptr_t n
;
113 for (n
= l
->first
; n
!= NULL
; n
= l
->first
)
116 if (freefunc
!= NULL
)
117 (*freefunc
)(n
->data
);
126 ** @LISTHASH_PREFIX@_list_free() - remove and free() the whole list
129 @LISTHASH_PREFIX@
_list_free(@LISTHASH_PREFIX@_list_t
*l
, @LISTHASH_PREFIX@_freefunc_t freefunc
)
131 @LISTHASH_PREFIX@
_list_empty(l
, freefunc
);
137 ** @LISTHASH_PREFIX@_list_nents() - return number of elements in the list
140 @LISTHASH_PREFIX@
_list_nents(@LISTHASH_PREFIX@_list_t
*l
)
147 ** @LISTHASH_PREFIX@_list_add() - adds an element to the list
150 ** -1 (and sets errno) failure
153 @LISTHASH_PREFIX@
_list_add(@LISTHASH_PREFIX@_list_t
*l
, void *data
)
155 @LISTHASH_PREFIX@_listptr_t n
, m
;
158 printf("==> @LISTHASH_PREFIX@_list_add(\"%s\")\n", (char *)data
);
161 n
= (@LISTHASH_PREFIX@_listptr_t
)malloc(sizeof(struct @LISTHASH_PREFIX@_node
));
168 printf(" @LISTHASH_PREFIX@_list_add(): allocated data\n");
171 /* if the list is empty */
172 if (l
->first
== NULL
)
174 l
->last
= l
->first
= n
;
175 n
->next
= n
->prev
= NULL
;
177 printf("<== @LISTHASH_PREFIX@_list_add(): list was empty; "
178 "added first element and returning 0\n");
184 printf(" @LISTHASH_PREFIX@_list_add(): list not empty\n");
187 if (l
->flags
== LIST_STACK
)
191 if (l
->first
!= NULL
)
195 printf("<== @LISTHASH_PREFIX@_list_add(): LIST_STACK set; "
201 if (l
->flags
== LIST_QUEUE
)
209 printf("<== @LISTHASH_PREFIX@_list_add(): LIST_QUEUE set; "
215 for (m
= l
->first
; m
!= NULL
; m
= m
->next
)
216 if ((*(l
->cmpfunc
))(data
, m
->data
) < 0)
219 ** if we find one that's bigger,
220 ** insert data before it
223 printf(" @LISTHASH_PREFIX@_list_add(): gotcha..."
233 printf("<== @LISTHASH_PREFIX@_list_add(): "
234 "added first, returning 0\n");
243 printf("<== @LISTHASH_PREFIX@_list_add(): added middle,"
250 printf(" @LISTHASH_PREFIX@_list_add(): new data larger than current "
254 /* if we get here, data is bigger than everything in the list */
260 printf("<== @LISTHASH_PREFIX@_list_add(): added end, returning 0\n");
267 ** @LISTHASH_PREFIX@_list_del() - remove the element pointed to by n
271 @LISTHASH_PREFIX@
_list_del(@LISTHASH_PREFIX@_list_t
*l
, @LISTHASH_PREFIX@_listptr_t
*n
)
273 @LISTHASH_PREFIX@_listptr_t m
;
276 printf("==> @LISTHASH_PREFIX@_list_del()\n");
284 (*n
)->prev
->next
= (*n
)->next
;
286 l
->first
= (*n
)->next
;
288 (*n
)->next
->prev
= (*n
)->prev
;
290 l
->last
= (*n
)->prev
;
298 ** @LISTHASH_PREFIX@_list_next() - get the next element in the list
304 @LISTHASH_PREFIX@
_list_next(@LISTHASH_PREFIX@_list_t
*l
,
305 @LISTHASH_PREFIX@_listptr_t
*n
)
312 return (*n
!= NULL
? 1 : 0);
317 ** @LISTHASH_PREFIX@_list_prev() - get the previous element in the list
323 @LISTHASH_PREFIX@
_list_prev(@LISTHASH_PREFIX@_list_t
*l
,
324 @LISTHASH_PREFIX@_listptr_t
*n
)
331 return (*n
!= NULL
? 1 : 0);
336 ** @LISTHASH_PREFIX@_str_match() - string matching function
342 @LISTHASH_PREFIX@
_str_match(char *check
, char *data
)
344 return !strcmp(check
, data
);
349 ** @LISTHASH_PREFIX@_list_add_str() - splits string str into delim-delimited
350 ** elements and adds them to list l
353 ** -1 (and sets errno) failure
356 @LISTHASH_PREFIX@
_list_add_str(@LISTHASH_PREFIX@_list_t
*l
,
357 char *str
, char *delim
)
360 char *tokp
, *nextp
= tmp
;
362 strlcpy(tmp
, str
, sizeof(tmp
));
363 while ((tokp
= strsep(&nextp
, delim
)) != NULL
)
367 if (@LISTHASH_PREFIX@
_list_add(l
, strdup(tokp
)))
376 ** @LISTHASH_PREFIX@_list_search() - find an entry in a list
382 @LISTHASH_PREFIX@
_list_search(@LISTHASH_PREFIX@_list_t
*l
,
383 @LISTHASH_PREFIX@_listptr_t
*n
, void *data
,
384 @LISTHASH_PREFIX@_matchfunc_t matchfunc
)
387 printf("==> @LISTHASH_PREFIX@_list_search(l=0x%lx, n=0x%lx, \"%s\")\n",
391 if (matchfunc
== NULL
)
392 matchfunc
= (@LISTHASH_PREFIX@_matchfunc_t
)@LISTHASH_PREFIX@_str_match
;
399 for (; *n
!= NULL
; *n
= (*n
)->next
)
402 printf("checking against \"%s\"\n", (char *)(*n
)->data
);
404 if ((*(matchfunc
))(data
, (*n
)->data
) != 0)
409 printf("no matches found\n");
416 ** @LISTHASH_PREFIX@_list_dup() - copy an existing list
418 @LISTHASH_PREFIX@_list_t
*
419 @LISTHASH_PREFIX@
_list_dup(@LISTHASH_PREFIX@_list_t
*l
)
421 @LISTHASH_PREFIX@_list_t
*newlist
;
422 @LISTHASH_PREFIX@_listptr_t n
;
424 newlist
= @LISTHASH_PREFIX@
_list_new(l
->flags
, l
->cmpfunc
);
425 for (n
= l
->first
; n
!= NULL
; n
= n
->next
)
426 @LISTHASH_PREFIX@
_list_add(newlist
, n
->data
);
429 printf("returning from @LISTHASH_PREFIX@_list_dup()\n");
436 ** @LISTHASH_PREFIX@_list_merge() - merge two lists into a new list
438 @LISTHASH_PREFIX@_list_t
*
439 @LISTHASH_PREFIX@
_list_merge(@LISTHASH_PREFIX@_cmpfunc_t cmpfunc
, int flags
,
440 @LISTHASH_PREFIX@_list_t
*list1
,
441 @LISTHASH_PREFIX@_list_t
*list2
)
443 @LISTHASH_PREFIX@_list_t
*newlist
;
444 @LISTHASH_PREFIX@_listptr_t n
;
446 newlist
= @LISTHASH_PREFIX@
_list_new(flags
, cmpfunc
);
449 while (@LISTHASH_PREFIX@
_list_next(list1
, &n
) != 0)
450 @LISTHASH_PREFIX@
_list_add(newlist
, n
->data
);
452 while (@LISTHASH_PREFIX@
_list_next(list2
, &n
) != 0)
453 @LISTHASH_PREFIX@
_list_add(newlist
, n
->data
);