X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Flist%2Flist.h;h=bda2922bc37b7b8dc22ec5482b5e6d75513c1eb7;hb=6b0157ffdd333a7e2af9738551df4fbf2eca73db;hp=f27a08829f24494a3b4ba1340152387783274c8b;hpb=9a83a074ce88154bc96e871868ed481cb1c31fe7;p=ccan diff --git a/ccan/list/list.h b/ccan/list/list.h index f27a0882..bda2922b 100644 --- a/ccan/list/list.h +++ b/ccan/list/list.h @@ -1,3 +1,4 @@ +/* Licensed under LGPLv2.1+ - see LICENSE file for details */ #ifndef CCAN_LIST_H #define CCAN_LIST_H #include @@ -95,7 +96,7 @@ struct list_node *list_check_node(const struct list_node *n, #endif /** - * LIST_HEAD_INIT - initalizer for an empty list_head + * LIST_HEAD_INIT - initializer for an empty list_head * @name: the name of the list. * * Explicit initializer for an empty list. @@ -109,7 +110,7 @@ struct list_node *list_check_node(const struct list_node *n, #define LIST_HEAD_INIT(name) { { &name.n, &name.n } } /** - * LIST_HEAD - define and initalize an empty list_head + * LIST_HEAD - define and initialize an empty list_head * @name: the name of the list. * * The LIST_HEAD macro defines a list_head and initializes it to an empty @@ -314,6 +315,24 @@ static inline void list_del_from(struct list_head *h, struct list_node *n) &i->member != &(h)->n; \ i = container_of_var(i->member.next, i, member)) +/** + * list_for_each_rev - iterate through a list backwards. + * @h: the list_head + * @i: the structure containing the list_node + * @member: the list_node member of the structure + * + * This is a convenient wrapper to iterate @i over the entire list. It's + * a for loop, so you can break and continue as normal. + * + * Example: + * list_for_each_rev(&parent->children, child, list) + * printf("Name: %s\n", child->name); + */ +#define list_for_each_rev(h, i, member) \ + for (i = container_of_var(list_debug(h)->n.prev, i, member); \ + &i->member != &(h)->n; \ + i = container_of_var(i->member.prev, i, member)) + /** * list_for_each_safe - iterate through a list, maybe during deletion * @h: the list_head