toys

toys.git
git clone git://git.lenczewski.org/toys.git
Log | Files | Refs | README | LICENSE

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 }