summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Nagy <mnagy@redhat.com>2009-07-29 09:58:53 +0200
committerMartin Nagy <mnagy@redhat.com>2009-08-04 16:50:53 +0200
commitb49c9c1ad3b5be46fb5bd9451d26f133bbe98126 (patch)
tree5e8b2734f7462ebe4e44bb78f9a2e8dcda377f6d /src
parent01827e38817bb7bf1e848a6c627406209c2fe551 (diff)
downloadldap_driver-b49c9c1ad3b5be46fb5bd9451d26f133bbe98126.tar.gz
ldap_driver-b49c9c1ad3b5be46fb5bd9451d26f133bbe98126.tar.xz
ldap_driver-b49c9c1ad3b5be46fb5bd9451d26f133bbe98126.zip
Add FOR_EACH style macros
The FOR_EACH() macro will simply traverse the given list. Usage: FOR_EACH(element, list) do_something(element); The FOR_EACH_UNLINK() macro will traverse the list and unlink each element. Useful when destroying a whole list. Usage: FOR_EACH_UNLINK(element, list) { destroy(&element); } END_FOR_EACH_UNLINK(element); All these macros assume that 'link' is used to connect list elements, as used in standard ISC list macros.
Diffstat (limited to 'src')
-rw-r--r--src/util.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/util.h b/src/util.h
index 372cd4d..0dd6ee3 100644
--- a/src/util.h
+++ b/src/util.h
@@ -89,4 +89,19 @@
dns_name_setbuffer(&name, &name##__buffer); \
} while (0)
+#define FOR_EACH(elt, list) \
+ for ((elt) = HEAD(list); (elt) != NULL; (elt) = NEXT(elt, link))
+
+#define FOR_EACH_UNLINK(elt, list) \
+ do { \
+ typeof(elt) __next_elt; \
+ for (elt = HEAD(list); elt != NULL; elt = NEXT(elt, link)) { \
+ __next_elt = NEXT(elt, link); \
+ UNLINK(list, elt, link);
+
+#define END_FOR_EACH_UNLINK(elt) \
+ elt = __next_elt; \
+ } \
+ } while (0)
+
#endif /* !_LD_UTIL_H_ */