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 --- list.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 list.c (limited to 'list.c') diff --git a/list.c b/list.c new file mode 100644 index 0000000..c509152 --- /dev/null +++ b/list.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include + +/* + * list macro usage examples by Peter Werner + * + * please see http://www.ifost.org.au/~peterw/queue.html for more info + */ + +/* + * our struct definition, with the list element to be referenced by f_link + */ + +struct foo { + int f_a; + char f_b; + LIST_ENTRY(foo) f_link; +}; + +/* + * the head of our list of struct foo's (see the manpage for more info) + */ +LIST_HEAD(listhead, foo) list; + +struct foo *alloc_foo(int a, char b); + +int +main(void) +{ + struct foo *fp, *other; + struct listhead *listp; + + LIST_INIT(&list); + listp = &list; + + /* + * insert the elements, note the use of the f_link item + */ + fp = alloc_foo(1, 'a'); + LIST_INSERT_HEAD(listp, fp, f_link); + + other = alloc_foo(2, 'b'); + LIST_INSERT_AFTER(fp, other, f_link); + + fp = alloc_foo(3, 'c'); + LIST_INSERT_BEFORE(other, fp, f_link); + + /* + * loop through the list + */ + LIST_FOREACH(fp, listp, f_link) + printf("%d %c\n", fp->f_a, fp->f_b); + + /* + * free up our list + */ + for (fp = LIST_FIRST(listp); fp != LIST_END(listp); fp = other) { + other = LIST_NEXT(fp, f_link); + LIST_REMOVE(fp, f_link); + free(fp); + } + + /* + * make sure + */ + if (LIST_EMPTY(listp)) + 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