Advertisement
danielhilst

llist.c

Dec 15th, 2015
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.66 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. /* --- cut here ------------------------------------------------------------- */
  4. #include <assert.h>
  5. struct llist {
  6.         struct llist *next;
  7. };
  8. #define LLIST_HEAD_INIT { NULL }
  9.  
  10. static inline void llist_add(struct llist *head, struct llist *node)
  11. {
  12.         assert(head && node);
  13.         struct llist *p = head;
  14.         while (p->next) p = p->next;
  15.         p->next = node; node->next = NULL;
  16. }
  17. #define offset_of(type, member) ((unsigned long) &((type *)0)->member)
  18. #define container_of(ptr, type, member) \
  19.         ((type *) ((char *)ptr - offset_of(type, member)))
  20. /* ptr  => pointer to your struct
  21.  * head => start of list
  22.  * type => struct type where struct llist is embedded
  23.  * member => the name of the struct llist member embedded in type */
  24. #define llist_foreach(ptr, head, type, member)                        \
  25.         for ((ptr) = container_of((head)->next, type, member);        \
  26.              ptr;                                                     \
  27.              ptr   = ((ptr)->member.next ?                            \
  28.                       container_of((ptr)->member.next, type, member)  \
  29.                       : NULL))
  30. /* --- cut here------------------------------------------------------------ */
  31.  
  32.  
  33. struct foo {
  34.         char *name;
  35.         struct llist l;
  36. };
  37.  
  38. int main(void)
  39. {
  40.         struct llist head = LLIST_HEAD_INIT;
  41.         struct foo bar, tar, zar;
  42.         bar.name = "bar";
  43.         tar.name = "tar";
  44.         zar.name = "zar";
  45.         llist_add(&head, &bar.l);
  46.         llist_add(&head, &tar.l);
  47.         llist_add(&head, &zar.l);
  48.         struct foo *p;
  49.         llist_foreach(p, &head, struct foo, l)
  50.                 puts(p->name);
  51.  
  52.         return 0;
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement