diff options
author | Martin Nagy <mnagy@redhat.com> | 2009-07-29 09:58:53 +0200 |
---|---|---|
committer | Martin Nagy <mnagy@redhat.com> | 2009-08-04 16:50:53 +0200 |
commit | b49c9c1ad3b5be46fb5bd9451d26f133bbe98126 (patch) | |
tree | 5e8b2734f7462ebe4e44bb78f9a2e8dcda377f6d /src/util.h | |
parent | 01827e38817bb7bf1e848a6c627406209c2fe551 (diff) | |
download | ldap_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/util.h')
-rw-r--r-- | src/util.h | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -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_ */ |