From 4325c036fca0264d64212c6c837616387818d752 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 13 Nov 2008 16:34:47 +0000 Subject: BSD Lists macros --- slist.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 slist.c (limited to 'slist.c') diff --git a/slist.c b/slist.c new file mode 100644 index 0000000..e05dd25 --- /dev/null +++ b/slist.c @@ -0,0 +1,90 @@ +#include +#include +#include +#include + +/* + * slist macro usage examples by Peter Werner + * + * please see http://www.ifost.org.au/~peterw/queue.html for more info + */ + +/* + * our struct definition, with the slist element + */ + +struct foo { + int f_a; + char f_b; + SLIST_ENTRY(foo) f_link; +}; + +/* + * the head of our list of struct foo's (see the manpage for more info) + */ +SLIST_HEAD(, foo) list; + +struct foo *alloc_foo(int a, char b); + +int +main(void) +{ + struct foo *fp; + + SLIST_INIT(&list); + + /* + * insert the elements, note the use of the f_link item + */ + fp = alloc_foo(1, 'a'); + SLIST_INSERT_HEAD(&list, fp, f_link); + fp = alloc_foo(2, 'b'); + SLIST_INSERT_HEAD(&list, fp, f_link); + fp = alloc_foo(3, 'c'); + SLIST_INSERT_HEAD(&list, fp, f_link); + + /* + * loop through the list + */ + for (fp = SLIST_FIRST(&list); fp != NULL; fp = SLIST_NEXT(fp, f_link)) + printf("%d %c\n", fp->f_a, fp->f_b); + + /* + * another way of looping + */ + SLIST_FOREACH(fp, &list, f_link) + printf("%d %c\n", fp->f_a, fp->f_b); + + /* + * free up our list + */ + while (!SLIST_EMPTY(&list)) { + fp = SLIST_FIRST(&list); + SLIST_REMOVE_HEAD(&list, f_link); + free(fp); + } + + /* + * make sure + */ + if (SLIST_EMPTY(&list)) + printf("List is empty!\n"); + else + printf("List not empty!\n"); + + return(0); +} + +struct foo * +alloc_foo(int a, char b) +{ + struct foo *tmp; + + tmp = (struct foo *)malloc(sizeof(struct foo)); + if (tmp == NULL) + err(1, "malloc"); + + tmp->f_a = a; + tmp->f_b = b; + return(tmp); +} -- cgit v1.2.3