]> git.ozlabs.org Git - ccan/blobdiff - ccan/list/list.h
ttxml: exclude license_comment check so it doesn't fail ccanlint.
[ccan] / ccan / list / list.h
index 02835a6b51e092c4b95fbc21a88bb71bbb46910a..bda2922bc37b7b8dc22ec5482b5e6d75513c1eb7 100644 (file)
@@ -1,3 +1,4 @@
+/* Licensed under LGPLv2.1+ - see LICENSE file for details */
 #ifndef CCAN_LIST_H
 #define CCAN_LIST_H
 #include <stdbool.h>
@@ -95,17 +96,34 @@ struct list_node *list_check_node(const struct list_node *n,
 #endif
 
 /**
- * LIST_HEAD - define and initalize 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.
+ *
+ * See also:
+ *     LIST_HEAD, list_head_init()
+ *
+ * Example:
+ *     static struct list_head my_list = LIST_HEAD_INIT(my_list);
+ */
+#define LIST_HEAD_INIT(name) { { &name.n, &name.n } }
+
+/**
+ * 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
  * list.  It can be prepended by "static" to define a static list_head.
  *
+ * See also:
+ *     LIST_HEAD_INIT, list_head_init()
+ *
  * Example:
  *     static LIST_HEAD(my_global_list);
  */
 #define LIST_HEAD(name) \
-       struct list_head name = { { &name.n, &name.n } }
+       struct list_head name = LIST_HEAD_INIT(name)
 
 /**
  * list_head_init - initialize a list_head
@@ -297,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