list.c (2201B)
1 #define HEADER_IMPL 2 #include "list.h" 3 4 #include <stdio.h> 5 6 static inline void 7 list_print(struct list_node const *list, int reversed) 8 { 9 fprintf(stderr, "list: %p, head: %p, tail: %p\n", 10 (void *) list, (void *) LIST_HEAD(list), (void *) LIST_TAIL(list)); 11 12 struct list_node *it; 13 if (reversed) { 14 LIST_ITER(list, it) { 15 fprintf(stderr, "\t{ %p, prev: %p, next: %p }\n", 16 (void *) it, (void *) it->prev, (void *) it->next); 17 } 18 } else { 19 LIST_RITER(list, it) { 20 fprintf(stderr, "\t{ %p, prev: %p, next: %p }\n", 21 (void *) it, (void *) it->prev, (void *) it->next); 22 } 23 } 24 } 25 26 struct mystruct { 27 int a; 28 struct list_node list_node; 29 }; 30 31 int 32 main(void) 33 { 34 struct list_node list = LIST_INIT(list); 35 list_print(&list, 0); 36 37 struct mystruct a = {1,{0,0}}, b = {2,{0,0}}, c = {3,{0,0}}; 38 fprintf(stderr, "a: %p\n", (void *) &a.list_node); 39 fprintf(stderr, "b: %p\n", (void *) &b.list_node); 40 fprintf(stderr, "c: %p\n", (void *) &c.list_node); 41 42 /* list_iter() */ 43 fprintf(stderr, "list_iter()...\n"); 44 list_push_head(&list, &a.list_node); 45 list_push_head(&list, &b.list_node); 46 list_push_head(&list, &c.list_node); 47 list_print(&list, 0); 48 49 /* list_entry_iter() */ 50 { 51 fprintf(stderr, "list_entry_iter()...\n"); 52 fprintf(stderr, "mystruct list: %p, head: %p, tail: %p\n", 53 (void *) &list, (void *) LIST_HEAD(&list), (void *) LIST_TAIL(&list)); 54 55 size_t i = 0; 56 struct mystruct *it; 57 LIST_ENTRY_ITER(&list, it, list_node) { 58 fprintf(stderr, "\t%zu = { %d, { %p, prev: %p, next: %p } }\n", 59 i++, it->a, 60 (void *) &it->list_node, 61 (void *) it->list_node.prev, 62 (void *) it->list_node.next); 63 } 64 } 65 66 /* list_riter() */ 67 fprintf(stderr, "list_riter()...\n"); 68 list_print(&list, 1); 69 70 /* list_entry_riter() */ 71 { 72 fprintf(stderr, "list_entry_riter()...\n"); 73 fprintf(stderr, "list: %p, head: %p, tail: %p\n", 74 (void *) &list, (void *) LIST_HEAD(&list), (void *) LIST_TAIL(&list)); 75 76 size_t i = 0; 77 struct mystruct *it; 78 LIST_ENTRY_RITER(&list, it, list_node) { 79 fprintf(stderr, "\t%zu = { %d, { %p, prev: %p, next: %p } }\n", 80 i++, it->a, 81 (void *) &it->list_node, 82 (void *) it->list_node.prev, 83 (void *) it->list_node.next); 84 } 85 } 86 87 return 0; 88 }