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 --- circleq.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 circleq.c (limited to 'circleq.c') diff --git a/circleq.c b/circleq.c new file mode 100644 index 0000000..db66271 --- /dev/null +++ b/circleq.c @@ -0,0 +1,105 @@ +#include +#include +#include +#include + +/* + * circleq macro usage examples by Peter Werner + * + * please see http://www.ifost.org.au/~peterw/queue.html for more info + */ + +/* + * our struct definition, with the circleq element to be referenced by f_link + */ + +struct foo { + int f_a; + char f_b; + CIRCLEQ_ENTRY(foo) f_link; +}; + +/* + * the head of our circleq of struct foo's (see the manpage for more info) + */ +CIRCLEQ_HEAD(cqhead, foo) cq; + +struct foo *alloc_foo(int a, char b); + +int +main(void) +{ + struct foo *fp, *other; + struct cqhead *cqp; + + CIRCLEQ_INIT(&cq); + cqp = &cq; + + /* + * insert the elements, note the use of the f_link item + */ + fp = alloc_foo(1, 'a'); + CIRCLEQ_INSERT_HEAD(cqp, fp, f_link); + + fp = alloc_foo(2, 'b'); + CIRCLEQ_INSERT_TAIL(cqp, fp, f_link); + + /* + * put this one after the head of the queue + */ + fp = alloc_foo(3, 'c'); + CIRCLEQ_INSERT_AFTER(cqp, CIRCLEQ_FIRST(cqp), fp, f_link); + + /* + * put this one in front of the one we just inserted + */ + other = alloc_foo(4, 'd'); + CIRCLEQ_INSERT_BEFORE(cqp, fp, other, f_link); + + + /* + * loop through the list + */ + CIRCLEQ_FOREACH(fp, cqp, f_link) + printf("%d %c\n", fp->f_a, fp->f_b); + + /* + * loop through the other way, note the use of cqhead + */ + printf("backwards!\n"); + CIRCLEQ_FOREACH_REVERSE(fp, cqp, f_link) + printf("%d %c\n", fp->f_a, fp->f_b); + + /* + * free up our list + */ + for (fp = CIRCLEQ_FIRST(cqp); fp != CIRCLEQ_END(cqp); fp = other) { + other = CIRCLEQ_NEXT(fp, f_link); + CIRCLEQ_REMOVE(cqp, fp, f_link); + free(fp); + } + + /* + * make sure + */ + if (CIRCLEQ_EMPTY(cqp)) + 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