Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- /* --- cut here ------------------------------------------------------------- */
- #include <assert.h>
- struct llist {
- struct llist *next;
- };
- #define LLIST_HEAD_INIT { NULL }
- static inline void llist_add(struct llist *head, struct llist *node)
- {
- assert(head && node);
- struct llist *p = head;
- while (p->next) p = p->next;
- p->next = node; node->next = NULL;
- }
- #define offset_of(type, member) ((unsigned long) &((type *)0)->member)
- #define container_of(ptr, type, member) \
- ((type *) ((char *)ptr - offset_of(type, member)))
- /* ptr => pointer to your struct
- * head => start of list
- * type => struct type where struct llist is embedded
- * member => the name of the struct llist member embedded in type */
- #define llist_foreach(ptr, head, type, member) \
- for ((ptr) = container_of((head)->next, type, member); \
- ptr; \
- ptr = ((ptr)->member.next ? \
- container_of((ptr)->member.next, type, member) \
- : NULL))
- /* --- cut here------------------------------------------------------------ */
- struct foo {
- char *name;
- struct llist l;
- };
- int main(void)
- {
- struct llist head = LLIST_HEAD_INIT;
- struct foo bar, tar, zar;
- bar.name = "bar";
- tar.name = "tar";
- zar.name = "zar";
- llist_add(&head, &bar.l);
- llist_add(&head, &tar.l);
- llist_add(&head, &zar.l);
- struct foo *p;
- llist_foreach(p, &head, struct foo, l)
- puts(p->name);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement