From 9593fc545950782ed75f12f53238b07885559b2b Mon Sep 17 00:00:00 2001 From: William Casarin Date: Mon, 9 Jul 2018 22:28:25 -0700 Subject: remove ccan for now --- ccan/list/LICENSE | 1 - ccan/list/_info | 72 --- ccan/list/list.c | 43 -- ccan/list/list.h | 842 ------------------------------ ccan/list/test/compile_ok-constant.c | 49 -- ccan/list/test/helper.c | 56 -- ccan/list/test/helper.h | 9 - ccan/list/test/run-CCAN_LIST_DEBUG.c | 60 --- ccan/list/test/run-check-corrupt.c | 90 ---- ccan/list/test/run-check-nonconst.c | 27 - ccan/list/test/run-list_del_from-assert.c | 36 -- ccan/list/test/run-list_prev-list_next.c | 65 --- ccan/list/test/run-prepend_list.c | 111 ---- ccan/list/test/run-single-eval.c | 168 ------ ccan/list/test/run-with-debug.c | 3 - ccan/list/test/run.c | 305 ----------- 16 files changed, 1937 deletions(-) delete mode 120000 ccan/list/LICENSE delete mode 100644 ccan/list/_info delete mode 100644 ccan/list/list.c delete mode 100644 ccan/list/list.h delete mode 100644 ccan/list/test/compile_ok-constant.c delete mode 100644 ccan/list/test/helper.c delete mode 100644 ccan/list/test/helper.h delete mode 100644 ccan/list/test/run-CCAN_LIST_DEBUG.c delete mode 100644 ccan/list/test/run-check-corrupt.c delete mode 100644 ccan/list/test/run-check-nonconst.c delete mode 100644 ccan/list/test/run-list_del_from-assert.c delete mode 100644 ccan/list/test/run-list_prev-list_next.c delete mode 100644 ccan/list/test/run-prepend_list.c delete mode 100644 ccan/list/test/run-single-eval.c delete mode 100644 ccan/list/test/run-with-debug.c delete mode 100644 ccan/list/test/run.c (limited to 'ccan/list') diff --git a/ccan/list/LICENSE b/ccan/list/LICENSE deleted file mode 120000 index 2354d12..0000000 --- a/ccan/list/LICENSE +++ /dev/null @@ -1 +0,0 @@ -../../licenses/BSD-MIT \ No newline at end of file diff --git a/ccan/list/_info b/ccan/list/_info deleted file mode 100644 index c4f3e2a..0000000 --- a/ccan/list/_info +++ /dev/null @@ -1,72 +0,0 @@ -#include "config.h" -#include -#include - -/** - * list - double linked list routines - * - * The list header contains routines for manipulating double linked lists. - * It defines two types: struct list_head used for anchoring lists, and - * struct list_node which is usually embedded in the structure which is placed - * in the list. - * - * Example: - * #include - * #include - * #include - * #include - * - * struct parent { - * const char *name; - * struct list_head children; - * unsigned int num_children; - * }; - * - * struct child { - * const char *name; - * struct list_node list; - * }; - * - * int main(int argc, char *argv[]) - * { - * struct parent p; - * struct child *c; - * int i; - * - * if (argc < 2) - * errx(1, "Usage: %s parent children...", argv[0]); - * - * p.name = argv[1]; - * list_head_init(&p.children); - * p.num_children = 0; - * for (i = 2; i < argc; i++) { - * c = malloc(sizeof(*c)); - * c->name = argv[i]; - * list_add(&p.children, &c->list); - * p.num_children++; - * } - * - * printf("%s has %u children:", p.name, p.num_children); - * list_for_each(&p.children, c, list) - * printf("%s ", c->name); - * printf("\n"); - * return 0; - * } - * - * License: BSD-MIT - * Author: Rusty Russell - */ -int main(int argc, char *argv[]) -{ - if (argc != 2) - return 1; - - if (strcmp(argv[1], "depends") == 0) { - printf("ccan/str\n"); - printf("ccan/container_of\n"); - printf("ccan/check_type\n"); - return 0; - } - - return 1; -} diff --git a/ccan/list/list.c b/ccan/list/list.c deleted file mode 100644 index 2717fa3..0000000 --- a/ccan/list/list.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Licensed under BSD-MIT - see LICENSE file for details */ -#include -#include -#include "list.h" - -static void *corrupt(const char *abortstr, - const struct list_node *head, - const struct list_node *node, - unsigned int count) -{ - if (abortstr) { - fprintf(stderr, - "%s: prev corrupt in node %p (%u) of %p\n", - abortstr, node, count, head); - abort(); - } - return NULL; -} - -struct list_node *list_check_node(const struct list_node *node, - const char *abortstr) -{ - const struct list_node *p, *n; - int count = 0; - - for (p = node, n = node->next; n != node; p = n, n = n->next) { - count++; - if (n->prev != p) - return corrupt(abortstr, node, n, count); - } - /* Check prev on head node. */ - if (node->prev != p) - return corrupt(abortstr, node, node, 0); - - return (struct list_node *)node; -} - -struct list_head *list_check(const struct list_head *h, const char *abortstr) -{ - if (!list_check_node(&h->n, abortstr)) - return NULL; - return (struct list_head *)h; -} diff --git a/ccan/list/list.h b/ccan/list/list.h deleted file mode 100644 index a6b0038..0000000 --- a/ccan/list/list.h +++ /dev/null @@ -1,842 +0,0 @@ -/* Licensed under BSD-MIT - see LICENSE file for details */ -#ifndef CCAN_LIST_H -#define CCAN_LIST_H -//#define CCAN_LIST_DEBUG 1 -#include -#include -#include -#include -#include - -/** - * struct list_node - an entry in a doubly-linked list - * @next: next entry (self if empty) - * @prev: previous entry (self if empty) - * - * This is used as an entry in a linked list. - * Example: - * struct child { - * const char *name; - * // Linked list of all us children. - * struct list_node list; - * }; - */ -struct list_node -{ - struct list_node *next, *prev; -}; - -/** - * struct list_head - the head of a doubly-linked list - * @h: the list_head (containing next and prev pointers) - * - * This is used as the head of a linked list. - * Example: - * struct parent { - * const char *name; - * struct list_head children; - * unsigned int num_children; - * }; - */ -struct list_head -{ - struct list_node n; -}; - -/** - * list_check - check head of a list for consistency - * @h: the list_head - * @abortstr: the location to print on aborting, or NULL. - * - * Because list_nodes have redundant information, consistency checking between - * the back and forward links can be done. This is useful as a debugging check. - * If @abortstr is non-NULL, that will be printed in a diagnostic if the list - * is inconsistent, and the function will abort. - * - * Returns the list head if the list is consistent, NULL if not (it - * can never return NULL if @abortstr is set). - * - * See also: list_check_node() - * - * Example: - * static void dump_parent(struct parent *p) - * { - * struct child *c; - * - * printf("%s (%u children):\n", p->name, p->num_children); - * list_check(&p->children, "bad child list"); - * list_for_each(&p->children, c, list) - * printf(" -> %s\n", c->name); - * } - */ -struct list_head *list_check(const struct list_head *h, const char *abortstr); - -/** - * list_check_node - check node of a list for consistency - * @n: the list_node - * @abortstr: the location to print on aborting, or NULL. - * - * Check consistency of the list node is in (it must be in one). - * - * See also: list_check() - * - * Example: - * static void dump_child(const struct child *c) - * { - * list_check_node(&c->list, "bad child list"); - * printf("%s\n", c->name); - * } - */ -struct list_node *list_check_node(const struct list_node *n, - const char *abortstr); - -#define LIST_LOC __FILE__ ":" stringify(__LINE__) -#ifdef CCAN_LIST_DEBUG -#define list_debug(h, loc) list_check((h), loc) -#define list_debug_node(n, loc) list_check_node((n), loc) -#else -#define list_debug(h, loc) ((void)loc, h) -#define list_debug_node(n, loc) ((void)loc, n) -#endif - -/** - * 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 = LIST_HEAD_INIT(name) - -/** - * list_head_init - initialize a list_head - * @h: the list_head to set to the empty list - * - * Example: - * ... - * struct parent *parent = malloc(sizeof(*parent)); - * - * list_head_init(&parent->children); - * parent->num_children = 0; - */ -static inline void list_head_init(struct list_head *h) -{ - h->n.next = h->n.prev = &h->n; -} - -/** - * list_node_init - initialize a list_node - * @n: the list_node to link to itself. - * - * You don't need to use this normally! But it lets you list_del(@n) - * safely. - */ -static inline void list_node_init(struct list_node *n) -{ - n->next = n->prev = n; -} - -/** - * list_add_after - add an entry after an existing node in a linked list - * @h: the list_head to add the node to (for debugging) - * @p: the existing list_node to add the node after - * @n: the new list_node to add to the list. - * - * The existing list_node must already be a member of the list. - * The new list_node does not need to be initialized; it will be overwritten. - * - * Example: - * struct child c1, c2, c3; - * LIST_HEAD(h); - * - * list_add_tail(&h, &c1.list); - * list_add_tail(&h, &c3.list); - * list_add_after(&h, &c1.list, &c2.list); - */ -#define list_add_after(h, p, n) list_add_after_(h, p, n, LIST_LOC) -static inline void list_add_after_(struct list_head *h, - struct list_node *p, - struct list_node *n, - const char *abortstr) -{ - n->next = p->next; - n->prev = p; - p->next->prev = n; - p->next = n; - (void)list_debug(h, abortstr); -} - -/** - * list_add - add an entry at the start of a linked list. - * @h: the list_head to add the node to - * @n: the list_node to add to the list. - * - * The list_node does not need to be initialized; it will be overwritten. - * Example: - * struct child *child = malloc(sizeof(*child)); - * - * child->name = "marvin"; - * list_add(&parent->children, &child->list); - * parent->num_children++; - */ -#define list_add(h, n) list_add_(h, n, LIST_LOC) -static inline void list_add_(struct list_head *h, - struct list_node *n, - const char *abortstr) -{ - list_add_after_(h, &h->n, n, abortstr); -} - -/** - * list_add_before - add an entry before an existing node in a linked list - * @h: the list_head to add the node to (for debugging) - * @p: the existing list_node to add the node before - * @n: the new list_node to add to the list. - * - * The existing list_node must already be a member of the list. - * The new list_node does not need to be initialized; it will be overwritten. - * - * Example: - * list_head_init(&h); - * list_add_tail(&h, &c1.list); - * list_add_tail(&h, &c3.list); - * list_add_before(&h, &c3.list, &c2.list); - */ -#define list_add_before(h, p, n) list_add_before_(h, p, n, LIST_LOC) -static inline void list_add_before_(struct list_head *h, - struct list_node *p, - struct list_node *n, - const char *abortstr) -{ - n->next = p; - n->prev = p->prev; - p->prev->next = n; - p->prev = n; - (void)list_debug(h, abortstr); -} - -/** - * list_add_tail - add an entry at the end of a linked list. - * @h: the list_head to add the node to - * @n: the list_node to add to the list. - * - * The list_node does not need to be initialized; it will be overwritten. - * Example: - * list_add_tail(&parent->children, &child->list); - * parent->num_children++; - */ -#define list_add_tail(h, n) list_add_tail_(h, n, LIST_LOC) -static inline void list_add_tail_(struct list_head *h, - struct list_node *n, - const char *abortstr) -{ - list_add_before_(h, &h->n, n, abortstr); -} - -/** - * list_empty - is a list empty? - * @h: the list_head - * - * If the list is empty, returns true. - * - * Example: - * assert(list_empty(&parent->children) == (parent->num_children == 0)); - */ -#define list_empty(h) list_empty_(h, LIST_LOC) -static inline bool list_empty_(const struct list_head *h, const char* abortstr) -{ - (void)list_debug(h, abortstr); - return h->n.next == &h->n; -} - -/** - * list_empty_nodebug - is a list empty (and don't perform debug checks)? - * @h: the list_head - * - * If the list is empty, returns true. - * This differs from list_empty() in that if CCAN_LIST_DEBUG is set it - * will NOT perform debug checks. Only use this function if you REALLY - * know what you're doing. - * - * Example: - * assert(list_empty_nodebug(&parent->children) == (parent->num_children == 0)); - */ -#ifndef CCAN_LIST_DEBUG -#define list_empty_nodebug(h) list_empty(h) -#else -static inline bool list_empty_nodebug(const struct list_head *h) -{ - return h->n.next == &h->n; -} -#endif - -/** - * list_empty_nocheck - is a list empty? - * @h: the list_head - * - * If the list is empty, returns true. This doesn't perform any - * debug check for list consistency, so it can be called without - * locks, racing with the list being modified. This is ok for - * checks where an incorrect result is not an issue (optimized - * bail out path for example). - */ -static inline bool list_empty_nocheck(const struct list_head *h) -{ - return h->n.next == &h->n; -} - -/** - * list_del - delete an entry from an (unknown) linked list. - * @n: the list_node to delete from the list. - * - * Note that this leaves @n in an undefined state; it can be added to - * another list, but not deleted again. - * - * See also: - * list_del_from(), list_del_init() - * - * Example: - * list_del(&child->list); - * parent->num_children--; - */ -#define list_del(n) list_del_(n, LIST_LOC) -static inline void list_del_(struct list_node *n, const char* abortstr) -{ - (void)list_debug_node(n, abortstr); - n->next->prev = n->prev; - n->prev->next = n->next; -#ifdef CCAN_LIST_DEBUG - /* Catch use-after-del. */ - n->next = n->prev = NULL; -#endif -} - -/** - * list_del_init - delete a node, and reset it so it can be deleted again. - * @n: the list_node to be deleted. - * - * list_del(@n) or list_del_init() again after this will be safe, - * which can be useful in some cases. - * - * See also: - * list_del_from(), list_del() - * - * Example: - * list_del_init(&child->list); - * parent->num_children--; - */ -#define list_del_init(n) list_del_init_(n, LIST_LOC) -static inline void list_del_init_(struct list_node *n, const char *abortstr) -{ - list_del_(n, abortstr); - list_node_init(n); -} - -/** - * list_del_from - delete an entry from a known linked list. - * @h: the list_head the node is in. - * @n: the list_node to delete from the list. - * - * This explicitly indicates which list a node is expected to be in, - * which is better documentation and can catch more bugs. - * - * See also: list_del() - * - * Example: - * list_del_from(&parent->children, &child->list); - * parent->num_children--; - */ -static inline void list_del_from(struct list_head *h, struct list_node *n) -{ -#ifdef CCAN_LIST_DEBUG - { - /* Thorough check: make sure it was in list! */ - struct list_node *i; - for (i = h->n.next; i != n; i = i->next) - assert(i != &h->n); - } -#endif /* CCAN_LIST_DEBUG */ - - /* Quick test that catches a surprising number of bugs. */ - assert(!list_empty(h)); - list_del(n); -} - -/** - * list_swap - swap out an entry from an (unknown) linked list for a new one. - * @o: the list_node to replace from the list. - * @n: the list_node to insert in place of the old one. - * - * Note that this leaves @o in an undefined state; it can be added to - * another list, but not deleted/swapped again. - * - * See also: - * list_del() - * - * Example: - * struct child x1, x2; - * LIST_HEAD(xh); - * - * list_add(&xh, &x1.list); - * list_swap(&x1.list, &x2.list); - */ -#define list_swap(o, n) list_swap_(o, n, LIST_LOC) -static inline void list_swap_(struct list_node *o, - struct list_node *n, - const char* abortstr) -{ - (void)list_debug_node(o, abortstr); - *n = *o; - n->next->prev = n; - n->prev->next = n; -#ifdef CCAN_LIST_DEBUG - /* Catch use-after-del. */ - o->next = o->prev = NULL; -#endif -} - -/** - * list_entry - convert a list_node back into the structure containing it. - * @n: the list_node - * @type: the type of the entry - * @member: the list_node member of the type - * - * Example: - * // First list entry is children.next; convert back to child. - * child = list_entry(parent->children.n.next, struct child, list); - * - * See Also: - * list_top(), list_for_each() - */ -#define list_entry(n, type, member) container_of(n, type, member) - -/** - * list_top - get the first entry in a list - * @h: the list_head - * @type: the type of the entry - * @member: the list_node member of the type - * - * If the list is empty, returns NULL. - * - * Example: - * struct child *first; - * first = list_top(&parent->children, struct child, list); - * if (!first) - * printf("Empty list!\n"); - */ -#define list_top(h, type, member) \ - ((type *)list_top_((h), list_off_(type, member))) - -static inline const void *list_top_(const struct list_head *h, size_t off) -{ - if (list_empty(h)) - return NULL; - return (const char *)h->n.next - off; -} - -/** - * list_pop - remove the first entry in a list - * @h: the list_head - * @type: the type of the entry - * @member: the list_node member of the type - * - * If the list is empty, returns NULL. - * - * Example: - * struct child *one; - * one = list_pop(&parent->children, struct child, list); - * if (!one) - * printf("Empty list!\n"); - */ -#define list_pop(h, type, member) \ - ((type *)list_pop_((h), list_off_(type, member))) - -static inline const void *list_pop_(const struct list_head *h, size_t off) -{ - struct list_node *n; - - if (list_empty(h)) - return NULL; - n = h->n.next; - list_del(n); - return (const char *)n - off; -} - -/** - * list_tail - get the last entry in a list - * @h: the list_head - * @type: the type of the entry - * @member: the list_node member of the type - * - * If the list is empty, returns NULL. - * - * Example: - * struct child *last; - * last = list_tail(&parent->children, struct child, list); - * if (!last) - * printf("Empty list!\n"); - */ -#define list_tail(h, type, member) \ - ((type *)list_tail_((h), list_off_(type, member))) - -static inline const void *list_tail_(const struct list_head *h, size_t off) -{ - if (list_empty(h)) - return NULL; - return (const char *)h->n.prev - off; -} - -/** - * list_for_each - iterate through a list. - * @h: the list_head (warning: evaluated multiple times!) - * @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(&parent->children, child, list) - * printf("Name: %s\n", child->name); - */ -#define list_for_each(h, i, member) \ - list_for_each_off(h, i, list_off_var_(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) \ - list_for_each_rev_off(h, i, list_off_var_(i, member)) - -/** - * list_for_each_rev_safe - iterate through a list backwards, - * maybe during deletion - * @h: the list_head - * @i: the structure containing the list_node - * @nxt: 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 backwards. - * It's a for loop, so you can break and continue as normal. The extra - * variable * @nxt is used to hold the next element, so you can delete @i - * from the list. - * - * Example: - * struct child *next; - * list_for_each_rev_safe(&parent->children, child, next, list) { - * printf("Name: %s\n", child->name); - * } - */ -#define list_for_each_rev_safe(h, i, nxt, member) \ - list_for_each_rev_safe_off(h, i, nxt, list_off_var_(i, member)) - -/** - * list_for_each_safe - iterate through a list, maybe during deletion - * @h: the list_head - * @i: the structure containing the list_node - * @nxt: 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. The extra variable - * @nxt is used to hold the next element, so you can delete @i from the list. - * - * Example: - * list_for_each_safe(&parent->children, child, next, list) { - * list_del(&child->list); - * parent->num_children--; - * } - */ -#define list_for_each_safe(h, i, nxt, member) \ - list_for_each_safe_off(h, i, nxt, list_off_var_(i, member)) - -/** - * list_next - get the next entry in a list - * @h: the list_head - * @i: a pointer to an entry in the list. - * @member: the list_node member of the structure - * - * If @i was the last entry in the list, returns NULL. - * - * Example: - * struct child *second; - * second = list_next(&parent->children, first, list); - * if (!second) - * printf("No second child!\n"); - */ -#define list_next(h, i, member) \ - ((list_typeof(i))list_entry_or_null(list_debug(h, \ - __FILE__ ":" stringify(__LINE__)), \ - (i)->member.next, \ - list_off_var_((i), member))) - -/** - * list_prev - get the previous entry in a list - * @h: the list_head - * @i: a pointer to an entry in the list. - * @member: the list_node member of the structure - * - * If @i was the first entry in the list, returns NULL. - * - * Example: - * first = list_prev(&parent->children, second, list); - * if (!first) - * printf("Can't go back to first child?!\n"); - */ -#define list_prev(h, i, member) \ - ((list_typeof(i))list_entry_or_null(list_debug(h, \ - __FILE__ ":" stringify(__LINE__)), \ - (i)->member.prev, \ - list_off_var_((i), member))) - -/** - * list_append_list - empty one list onto the end of another. - * @to: the list to append into - * @from: the list to empty. - * - * This takes the entire contents of @from and moves it to the end of - * @to. After this @from will be empty. - * - * Example: - * struct list_head adopter; - * - * list_append_list(&adopter, &parent->children); - * assert(list_empty(&parent->children)); - * parent->num_children = 0; - */ -#define list_append_list(t, f) list_append_list_(t, f, \ - __FILE__ ":" stringify(__LINE__)) -static inline void list_append_list_(struct list_head *to, - struct list_head *from, - const char *abortstr) -{ - struct list_node *from_tail = list_debug(from, abortstr)->n.prev; - struct list_node *to_tail = list_debug(to, abortstr)->n.prev; - - /* Sew in head and entire list. */ - to->n.prev = from_tail; - from_tail->next = &to->n; - to_tail->next = &from->n; - from->n.prev = to_tail; - - /* Now remove head. */ - list_del(&from->n); - list_head_init(from); -} - -/** - * list_prepend_list - empty one list into the start of another. - * @to: the list to prepend into - * @from: the list to empty. - * - * This takes the entire contents of @from and moves it to the start - * of @to. After this @from will be empty. - * - * Example: - * list_prepend_list(&adopter, &parent->children); - * assert(list_empty(&parent->children)); - * parent->num_children = 0; - */ -#define list_prepend_list(t, f) list_prepend_list_(t, f, LIST_LOC) -static inline void list_prepend_list_(struct list_head *to, - struct list_head *from, - const char *abortstr) -{ - struct list_node *from_tail = list_debug(from, abortstr)->n.prev; - struct list_node *to_head = list_debug(to, abortstr)->n.next; - - /* Sew in head and entire list. */ - to->n.next = &from->n; - from->n.prev = &to->n; - to_head->prev = from_tail; - from_tail->next = to_head; - - /* Now remove head. */ - list_del(&from->n); - list_head_init(from); -} - -/* internal macros, do not use directly */ -#define list_for_each_off_dir_(h, i, off, dir) \ - for (i = list_node_to_off_(list_debug(h, LIST_LOC)->n.dir, \ - (off)); \ - list_node_from_off_((void *)i, (off)) != &(h)->n; \ - i = list_node_to_off_(list_node_from_off_((void *)i, (off))->dir, \ - (off))) - -#define list_for_each_safe_off_dir_(h, i, nxt, off, dir) \ - for (i = list_node_to_off_(list_debug(h, LIST_LOC)->n.dir, \ - (off)), \ - nxt = list_node_to_off_(list_node_from_off_(i, (off))->dir, \ - (off)); \ - list_node_from_off_(i, (off)) != &(h)->n; \ - i = nxt, \ - nxt = list_node_to_off_(list_node_from_off_(i, (off))->dir, \ - (off))) - -/** - * list_for_each_off - iterate through a list of memory regions. - * @h: the list_head - * @i: the pointer to a memory region wich contains list node data. - * @off: offset(relative to @i) at which list node data resides. - * - * This is a low-level wrapper to iterate @i over the entire list, used to - * implement all oher, more high-level, for-each constructs. It's a for loop, - * so you can break and continue as normal. - * - * WARNING! Being the low-level macro that it is, this wrapper doesn't know - * nor care about the type of @i. The only assumption made is that @i points - * to a chunk of memory that at some @offset, relative to @i, contains a - * properly filled `struct list_node' which in turn contains pointers to - * memory chunks and it's turtles all the way down. With all that in mind - * remember that given the wrong pointer/offset couple this macro will - * happily churn all you memory until SEGFAULT stops it, in other words - * caveat emptor. - * - * It is worth mentioning that one of legitimate use-cases for that wrapper - * is operation on opaque types with known offset for `struct list_node' - * member(preferably 0), because it allows you not to disclose the type of - * @i. - * - * Example: - * list_for_each_off(&parent->children, child, - * offsetof(struct child, list)) - * printf("Name: %s\n", child->name); - */ -#define list_for_each_off(h, i, off) \ - list_for_each_off_dir_((h),(i),(off),next) - -/** - * list_for_each_rev_off - iterate through a list of memory regions backwards - * @h: the list_head - * @i: the pointer to a memory region wich contains list node data. - * @off: offset(relative to @i) at which list node data resides. - * - * See list_for_each_off for details - */ -#define list_for_each_rev_off(h, i, off) \ - list_for_each_off_dir_((h),(i),(off),prev) - -/** - * list_for_each_safe_off - iterate through a list of memory regions, maybe - * during deletion - * @h: the list_head - * @i: the pointer to a memory region wich contains list node data. - * @nxt: the structure containing the list_node - * @off: offset(relative to @i) at which list node data resides. - * - * For details see `list_for_each_off' and `list_for_each_safe' - * descriptions. - * - * Example: - * list_for_each_safe_off(&parent->children, child, - * next, offsetof(struct child, list)) - * printf("Name: %s\n", child->name); - */ -#define list_for_each_safe_off(h, i, nxt, off) \ - list_for_each_safe_off_dir_((h),(i),(nxt),(off),next) - -/** - * list_for_each_rev_safe_off - iterate backwards through a list of - * memory regions, maybe during deletion - * @h: the list_head - * @i: the pointer to a memory region wich contains list node data. - * @nxt: the structure containing the list_node - * @off: offset(relative to @i) at which list node data resides. - * - * For details see `list_for_each_rev_off' and `list_for_each_rev_safe' - * descriptions. - * - * Example: - * list_for_each_rev_safe_off(&parent->children, child, - * next, offsetof(struct child, list)) - * printf("Name: %s\n", child->name); - */ -#define list_for_each_rev_safe_off(h, i, nxt, off) \ - list_for_each_safe_off_dir_((h),(i),(nxt),(off),prev) - -/* Other -off variants. */ -#define list_entry_off(n, type, off) \ - ((type *)list_node_from_off_((n), (off))) - -#define list_head_off(h, type, off) \ - ((type *)list_head_off((h), (off))) - -#define list_tail_off(h, type, off) \ - ((type *)list_tail_((h), (off))) - -#define list_add_off(h, n, off) \ - list_add((h), list_node_from_off_((n), (off))) - -#define list_del_off(n, off) \ - list_del(list_node_from_off_((n), (off))) - -#define list_del_from_off(h, n, off) \ - list_del_from(h, list_node_from_off_((n), (off))) - -/* Offset helper functions so we only single-evaluate. */ -static inline void *list_node_to_off_(struct list_node *node, size_t off) -{ - return (void *)((char *)node - off); -} -static inline struct list_node *list_node_from_off_(void *ptr, size_t off) -{ - return (struct list_node *)((char *)ptr + off); -} - -/* Get the offset of the member, but make sure it's a list_node. */ -#define list_off_(type, member) \ - (container_off(type, member) + \ - check_type(((type *)0)->member, struct list_node)) - -#define list_off_var_(var, member) \ - (container_off_var(var, member) + \ - check_type(var->member, struct list_node)) - -#if HAVE_TYPEOF -#define list_typeof(var) typeof(var) -#else -#define list_typeof(var) void * -#endif - -/* Returns member, or NULL if at end of list. */ -static inline void *list_entry_or_null(const struct list_head *h, - const struct list_node *n, - size_t off) -{ - if (n == &h->n) - return NULL; - return (char *)n - off; -} -#endif /* CCAN_LIST_H */ diff --git a/ccan/list/test/compile_ok-constant.c b/ccan/list/test/compile_ok-constant.c deleted file mode 100644 index c57cdad..0000000 --- a/ccan/list/test/compile_ok-constant.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include -#include -#include - -struct child { - const char *name; - struct list_node list; -}; - -static bool children(const struct list_head *list) -{ - return !list_empty(list); -} - -static const struct child *first_child(const struct list_head *list) -{ - return list_top(list, struct child, list); -} - -static const struct child *last_child(const struct list_head *list) -{ - return list_tail(list, struct child, list); -} - -static void check_children(const struct list_head *list) -{ - list_check(list, "bad child list"); -} - -static void print_children(const struct list_head *list) -{ - const struct child *c; - list_for_each(list, c, list) - printf("%s\n", c->name); -} - -int main(void) -{ - LIST_HEAD(h); - - children(&h); - first_child(&h); - last_child(&h); - check_children(&h); - print_children(&h); - return 0; -} diff --git a/ccan/list/test/helper.c b/ccan/list/test/helper.c deleted file mode 100644 index 4fb1c5a..0000000 --- a/ccan/list/test/helper.c +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include -#include - -#include -#include "helper.h" - -#define ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING \ - (42) - -struct opaque { - struct list_node list; - size_t secret_offset; - char secret_drawer[42]; -}; - -static bool not_randomized = true; - -struct opaque *create_opaque_blob(void) -{ - struct opaque *blob = calloc(1, sizeof(struct opaque)); - - if (not_randomized) { - srandom((int)time(NULL)); - not_randomized = false; - } - - blob->secret_offset = random() % (sizeof(blob->secret_drawer)); - blob->secret_drawer[blob->secret_offset] = - ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING; - - return blob; -} - -bool if_blobs_know_the_secret(struct opaque *blob) -{ - bool answer = true; - int i; - for (i = 0; i < sizeof(blob->secret_drawer) / - sizeof(blob->secret_drawer[0]); i++) - if (i != blob->secret_offset) - answer = answer && (blob->secret_drawer[i] == 0); - else - answer = answer && - (blob->secret_drawer[blob->secret_offset] == - ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE_THE_UNIVERSE_AND_EVERYTHING); - - return answer; -} - -void destroy_opaque_blob(struct opaque *blob) -{ - free(blob); -} - - diff --git a/ccan/list/test/helper.h b/ccan/list/test/helper.h deleted file mode 100644 index 4b64a7d..0000000 --- a/ccan/list/test/helper.h +++ /dev/null @@ -1,9 +0,0 @@ -/* These are in a separate C file so we can test undefined structures. */ -struct opaque; -typedef struct opaque opaque_t; - -opaque_t *create_opaque_blob(void); -bool if_blobs_know_the_secret(opaque_t *blob); -void destroy_opaque_blob(opaque_t *blob); - - diff --git a/ccan/list/test/run-CCAN_LIST_DEBUG.c b/ccan/list/test/run-CCAN_LIST_DEBUG.c deleted file mode 100644 index b8e5165..0000000 --- a/ccan/list/test/run-CCAN_LIST_DEBUG.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Check that CCAN_LIST_DEBUG works */ -#include -#include -#include -#include -#include -#include - -/* We don't actually want it to exit... */ -static jmp_buf aborted; -#define abort() longjmp(aborted, 1) - -#define fprintf my_fprintf -static char printf_buffer[1000]; - -static int my_fprintf(FILE *stream, const char *format, ...) -{ - va_list ap; - int ret; - (void)stream; - va_start(ap, format); - ret = vsprintf(printf_buffer, format, ap); - va_end(ap); - return ret; -} - -#define CCAN_LIST_DEBUG 1 -#include -#include -#include - -int main(void) -{ - struct list_head list; - struct list_node n1; - char expect[100]; - - plan_tests(2); - /* Empty list. */ - list.n.next = &list.n; - list.n.prev = &list.n; - ok1(list_check(&list, NULL) == &list); - - /* Bad back ptr */ - list.n.prev = &n1; - - /* Aborting version. */ - sprintf(expect, "run-CCAN_LIST_DEBUG.c:51: prev corrupt in node %p (0) of %p\n", - &list, &list); - if (setjmp(aborted) == 0) { - assert(list_empty(&list)); - fail("list_empty on empty with bad back ptr didn't fail!"); - } else { - /* __FILE__ might give full path. */ - int prep = strlen(printf_buffer) - strlen(expect); - ok1(prep >= 0 && strcmp(printf_buffer + prep, expect) == 0); - } - - return exit_status(); -} diff --git a/ccan/list/test/run-check-corrupt.c b/ccan/list/test/run-check-corrupt.c deleted file mode 100644 index 94c2e67..0000000 --- a/ccan/list/test/run-check-corrupt.c +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include -#include -#include -#include -#include - -/* We don't actually want it to exit... */ -static jmp_buf aborted; -#define abort() longjmp(aborted, 1) - -#define fprintf my_fprintf -static char printf_buffer[1000]; - -static int my_fprintf(FILE *stream, const char *format, ...) -{ - va_list ap; - int ret; - (void)stream; - va_start(ap, format); - ret = vsprintf(printf_buffer, format, ap); - va_end(ap); - return ret; -} - -#include -#include -#include - -int main(void) -{ - struct list_head list; - struct list_node n1; - char expect[100]; - - plan_tests(9); - /* Empty list. */ - list.n.next = &list.n; - list.n.prev = &list.n; - ok1(list_check(&list, NULL) == &list); - - /* Bad back ptr */ - list.n.prev = &n1; - /* Non-aborting version. */ - ok1(list_check(&list, NULL) == NULL); - - /* Aborting version. */ - sprintf(expect, "test message: prev corrupt in node %p (0) of %p\n", - &list, &list); - if (setjmp(aborted) == 0) { - list_check(&list, "test message"); - fail("list_check on empty with bad back ptr didn't fail!"); - } else { - ok1(strcmp(printf_buffer, expect) == 0); - } - - /* n1 in list. */ - list.n.next = &n1; - list.n.prev = &n1; - n1.prev = &list.n; - n1.next = &list.n; - ok1(list_check(&list, NULL) == &list); - ok1(list_check_node(&n1, NULL) == &n1); - - /* Bad back ptr */ - n1.prev = &n1; - ok1(list_check(&list, NULL) == NULL); - ok1(list_check_node(&n1, NULL) == NULL); - - /* Aborting version. */ - sprintf(expect, "test message: prev corrupt in node %p (1) of %p\n", - &n1, &list); - if (setjmp(aborted) == 0) { - list_check(&list, "test message"); - fail("list_check on n1 bad back ptr didn't fail!"); - } else { - ok1(strcmp(printf_buffer, expect) == 0); - } - - sprintf(expect, "test message: prev corrupt in node %p (0) of %p\n", - &n1, &n1); - if (setjmp(aborted) == 0) { - list_check_node(&n1, "test message"); - fail("list_check_node on n1 bad back ptr didn't fail!"); - } else { - ok1(strcmp(printf_buffer, expect) == 0); - } - - return exit_status(); -} diff --git a/ccan/list/test/run-check-nonconst.c b/ccan/list/test/run-check-nonconst.c deleted file mode 100644 index d3cb652..0000000 --- a/ccan/list/test/run-check-nonconst.c +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include -#include "helper.h" - -struct child { - const char *name; - struct list_node list; -}; - -int main(void) -{ - struct child c1, c2; - struct list_head list = LIST_HEAD_INIT(list); - - plan_tests(1); - - list_add(&list, &c1.list); - list_add_tail(list_check(&list, "Bad list!"), &c2.list); - list_del_from(list_check(&list, "Bad list!"), - list_check_node(&c2.list, "Bad node!")); - list_del_from(list_check(&list, "Bad list!"), - list_check_node(&c1.list, "Bad node!")); - ok1(list_empty(list_check(&list, "Bad emptied list"))); - - return exit_status(); -} diff --git a/ccan/list/test/run-list_del_from-assert.c b/ccan/list/test/run-list_del_from-assert.c deleted file mode 100644 index 9404b71..0000000 --- a/ccan/list/test/run-list_del_from-assert.c +++ /dev/null @@ -1,36 +0,0 @@ -#define CCAN_LIST_DEBUG 1 -#include -#include -#include -#include -#include -#include -#include - -int main(void) -{ - struct list_head list1, list2; - struct list_node n1, n2, n3; - pid_t child; - int status; - - plan_tests(1); - list_head_init(&list1); - list_head_init(&list2); - list_add(&list1, &n1); - list_add(&list2, &n2); - list_add_tail(&list2, &n3); - - child = fork(); - if (child) { - wait(&status); - } else { - /* This should abort. */ - list_del_from(&list1, &n3); - exit(0); - } - - ok1(WIFSIGNALED(status) && WTERMSIG(status) == SIGABRT); - list_del_from(&list2, &n3); - return exit_status(); -} diff --git a/ccan/list/test/run-list_prev-list_next.c b/ccan/list/test/run-list_prev-list_next.c deleted file mode 100644 index cc61e03..0000000 --- a/ccan/list/test/run-list_prev-list_next.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include -#include "helper.h" - -struct parent { - const char *name; - unsigned int num_children; - struct list_head children; -}; - -struct child { - const char *name; - struct list_node list; -}; - -int main(void) -{ - struct parent parent; - struct child c1, c2, c3; - const struct parent *p; - const struct child *c; - - plan_tests(20); - parent.num_children = 0; - list_head_init(&parent.children); - - c1.name = "c1"; - list_add(&parent.children, &c1.list); - - ok1(list_next(&parent.children, &c1, list) == NULL); - ok1(list_prev(&parent.children, &c1, list) == NULL); - - c2.name = "c2"; - list_add_tail(&parent.children, &c2.list); - - ok1(list_next(&parent.children, &c1, list) == &c2); - ok1(list_prev(&parent.children, &c1, list) == NULL); - ok1(list_next(&parent.children, &c2, list) == NULL); - ok1(list_prev(&parent.children, &c2, list) == &c1); - - c3.name = "c3"; - list_add_tail(&parent.children, &c3.list); - - ok1(list_next(&parent.children, &c1, list) == &c2); - ok1(list_prev(&parent.children, &c1, list) == NULL); - ok1(list_next(&parent.children, &c2, list) == &c3); - ok1(list_prev(&parent.children, &c2, list) == &c1); - ok1(list_next(&parent.children, &c3, list) == NULL); - ok1(list_prev(&parent.children, &c3, list) == &c2); - - /* Const variants */ - p = &parent; - c = &c2; - ok1(list_next(&p->children, &c1, list) == &c2); - ok1(list_prev(&p->children, &c1, list) == NULL); - ok1(list_next(&p->children, c, list) == &c3); - ok1(list_prev(&p->children, c, list) == &c1); - ok1(list_next(&parent.children, c, list) == &c3); - ok1(list_prev(&parent.children, c, list) == &c1); - ok1(list_next(&p->children, &c3, list) == NULL); - ok1(list_prev(&p->children, &c3, list) == &c2); - - return exit_status(); -} diff --git a/ccan/list/test/run-prepend_list.c b/ccan/list/test/run-prepend_list.c deleted file mode 100644 index fecd419..0000000 --- a/ccan/list/test/run-prepend_list.c +++ /dev/null @@ -1,111 +0,0 @@ -#include -#include -#include -#include - -static bool list_expect(struct list_head *h, ...) -{ - va_list ap; - struct list_node *n = &h->n, *expected; - - va_start(ap, h); - while ((expected = va_arg(ap, struct list_node *)) != NULL) { - n = n->next; - if (n != expected) - return false; - } - return (n->next == &h->n); -} - -int main(void) -{ - struct list_head h1, h2; - struct list_node n[4]; - - plan_tests(40); - - list_head_init(&h1); - list_head_init(&h2); - - /* Append an empty list to an empty list. */ - list_append_list(&h1, &h2); - ok1(list_empty(&h1)); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - - /* Prepend an empty list to an empty list. */ - list_prepend_list(&h1, &h2); - ok1(list_empty(&h1)); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - - /* Append an empty list to a non-empty list */ - list_add(&h1, &n[0]); - list_append_list(&h1, &h2); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - ok1(list_expect(&h1, &n[0], NULL)); - - /* Prepend an empty list to a non-empty list */ - list_prepend_list(&h1, &h2); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - ok1(list_expect(&h1, &n[0], NULL)); - - /* Append a non-empty list to an empty list. */ - list_append_list(&h2, &h1); - ok1(list_empty(&h1)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - ok1(list_expect(&h2, &n[0], NULL)); - - /* Prepend a non-empty list to an empty list. */ - list_prepend_list(&h1, &h2); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - ok1(list_expect(&h1, &n[0], NULL)); - - /* Prepend a non-empty list to non-empty list. */ - list_add(&h2, &n[1]); - list_prepend_list(&h1, &h2); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - ok1(list_expect(&h1, &n[1], &n[0], NULL)); - - /* Append a non-empty list to non-empty list. */ - list_add(&h2, &n[2]); - list_append_list(&h1, &h2); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - ok1(list_expect(&h1, &n[1], &n[0], &n[2], NULL)); - - /* Prepend a 2-entry list to a 2-entry list. */ - list_del_from(&h1, &n[2]); - list_add(&h2, &n[2]); - list_add_tail(&h2, &n[3]); - list_prepend_list(&h1, &h2); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - ok1(list_expect(&h1, &n[2], &n[3], &n[1], &n[0], NULL)); - - /* Append a 2-entry list to a 2-entry list. */ - list_del_from(&h1, &n[2]); - list_del_from(&h1, &n[3]); - list_add(&h2, &n[2]); - list_add_tail(&h2, &n[3]); - list_append_list(&h1, &h2); - ok1(list_empty(&h2)); - ok1(list_check(&h1, NULL)); - ok1(list_check(&h2, NULL)); - ok1(list_expect(&h1, &n[1], &n[0], &n[2], &n[3], NULL)); - - return exit_status(); -} diff --git a/ccan/list/test/run-single-eval.c b/ccan/list/test/run-single-eval.c deleted file mode 100644 index db0bffd..0000000 --- a/ccan/list/test/run-single-eval.c +++ /dev/null @@ -1,168 +0,0 @@ -/* Make sure macros only evaluate their args once. */ -#include -#include -#include - -struct parent { - const char *name; - struct list_head children; - unsigned int num_children; - int eval_count; -}; - -struct child { - const char *name; - struct list_node list; -}; - -static LIST_HEAD(static_list); - -#define ref(obj, counter) ((counter)++, (obj)) - -int main(void) -{ - struct parent parent; - struct child c1, c2, c3, *c, *n; - unsigned int i; - unsigned int static_count = 0, parent_count = 0, list_count = 0, - node_count = 0; - struct list_head list = LIST_HEAD_INIT(list); - - plan_tests(74); - /* Test LIST_HEAD, LIST_HEAD_INIT, list_empty and check_list */ - ok1(list_empty(ref(&static_list, static_count))); - ok1(static_count == 1); - ok1(list_check(ref(&static_list, static_count), NULL)); - ok1(static_count == 2); - ok1(list_empty(ref(&list, list_count))); - ok1(list_count == 1); - ok1(list_check(ref(&list, list_count), NULL)); - ok1(list_count == 2); - - parent.num_children = 0; - list_head_init(ref(&parent.children, parent_count)); - ok1(parent_count == 1); - /* Test list_head_init */ - ok1(list_empty(ref(&parent.children, parent_count))); - ok1(parent_count == 2); - ok1(list_check(ref(&parent.children, parent_count), NULL)); - ok1(parent_count == 3); - - c2.name = "c2"; - list_add(ref(&parent.children, parent_count), &c2.list); - ok1(parent_count == 4); - /* Test list_add and !list_empty. */ - ok1(!list_empty(ref(&parent.children, parent_count))); - ok1(parent_count == 5); - ok1(c2.list.next == &parent.children.n); - ok1(c2.list.prev == &parent.children.n); - ok1(parent.children.n.next == &c2.list); - ok1(parent.children.n.prev == &c2.list); - /* Test list_check */ - ok1(list_check(ref(&parent.children, parent_count), NULL)); - ok1(parent_count == 6); - - c1.name = "c1"; - list_add(ref(&parent.children, parent_count), &c1.list); - ok1(parent_count == 7); - /* Test list_add and !list_empty. */ - ok1(!list_empty(ref(&parent.children, parent_count))); - ok1(parent_count == 8); - ok1(c2.list.next == &parent.children.n); - ok1(c2.list.prev == &c1.list); - ok1(parent.children.n.next == &c1.list); - ok1(parent.children.n.prev == &c2.list); - ok1(c1.list.next == &c2.list); - ok1(c1.list.prev == &parent.children.n); - /* Test list_check */ - ok1(list_check(ref(&parent.children, parent_count), NULL)); - ok1(parent_count == 9); - - c3.name = "c3"; - list_add_tail(ref(&parent.children, parent_count), &c3.list); - ok1(parent_count == 10); - /* Test list_add_tail and !list_empty. */ - ok1(!list_empty(ref(&parent.children, parent_count))); - ok1(parent_count == 11); - ok1(parent.children.n.next == &c1.list); - ok1(parent.children.n.prev == &c3.list); - ok1(c1.list.next == &c2.list); - ok1(c1.list.prev == &parent.children.n); - ok1(c2.list.next == &c3.list); - ok1(c2.list.prev == &c1.list); - ok1(c3.list.next == &parent.children.n); - ok1(c3.list.prev == &c2.list); - /* Test list_check */ - ok1(list_check(ref(&parent.children, parent_count), NULL)); - ok1(parent_count == 12); - - /* Test list_check_node */ - ok1(list_check_node(&c1.list, NULL)); - ok1(list_check_node(&c2.list, NULL)); - ok1(list_check_node(&c3.list, NULL)); - - /* Test list_top */ - ok1(list_top(ref(&parent.children, parent_count), struct child, list) == &c1); - ok1(parent_count == 13); - - /* Test list_tail */ - ok1(list_tail(ref(&parent.children, parent_count), struct child, list) == &c3); - ok1(parent_count == 14); - - /* Test list_for_each. */ - i = 0; - list_for_each(&parent.children, c, list) { - switch (i++) { - case 0: - ok1(c == &c1); - break; - case 1: - ok1(c == &c2); - break; - case 2: - ok1(c == &c3); - break; - } - if (i > 2) - break; - } - ok1(i == 3); - - /* Test list_for_each_safe, list_del and list_del_from. */ - i = 0; - list_for_each_safe(&parent.children, c, n, list) { - switch (i++) { - case 0: - ok1(c == &c1); - list_del(ref(&c->list, node_count)); - ok1(node_count == 1); - break; - case 1: - ok1(c == &c2); - list_del_from(ref(&parent.children, parent_count), - ref(&c->list, node_count)); - ok1(node_count == 2); - break; - case 2: - ok1(c == &c3); - list_del_from(ref(&parent.children, parent_count), - ref(&c->list, node_count)); - ok1(node_count == 3); - break; - } - ok1(list_check(ref(&parent.children, parent_count), NULL)); - if (i > 2) - break; - } - ok1(i == 3); - ok1(parent_count == 19); - ok1(list_empty(ref(&parent.children, parent_count))); - ok1(parent_count == 20); - - /* Test list_top/list_tail on empty list. */ - ok1(list_top(ref(&parent.children, parent_count), struct child, list) == NULL); - ok1(parent_count == 21); - ok1(list_tail(ref(&parent.children, parent_count), struct child, list) == NULL); - ok1(parent_count == 22); - return exit_status(); -} diff --git a/ccan/list/test/run-with-debug.c b/ccan/list/test/run-with-debug.c deleted file mode 100644 index d090242..0000000 --- a/ccan/list/test/run-with-debug.c +++ /dev/null @@ -1,3 +0,0 @@ -/* Just like run.c, but with all debug checks enabled. */ -#define CCAN_LIST_DEBUG 1 -#include diff --git a/ccan/list/test/run.c b/ccan/list/test/run.c deleted file mode 100644 index 5787e45..0000000 --- a/ccan/list/test/run.c +++ /dev/null @@ -1,305 +0,0 @@ -#include -#include -#include -#include "helper.h" - -struct parent { - const char *name; - struct list_head children; - unsigned int num_children; -}; - -struct child { - const char *name; - struct list_node list; -}; - -static LIST_HEAD(static_list); - -int main(void) -{ - struct parent parent; - struct child c1, c2, c3, x1, *c, *n; - unsigned int i; - struct list_head list = LIST_HEAD_INIT(list); - opaque_t *q, *nq; - struct list_head opaque_list = LIST_HEAD_INIT(opaque_list); - LIST_HEAD(rev); - - plan_tests(92); - /* Test LIST_HEAD, LIST_HEAD_INIT, list_empty and check_list */ - ok1(list_empty(&static_list)); - ok1(list_check(&static_list, NULL)); - ok1(list_empty(&list)); - ok1(list_check(&list, NULL)); - - parent.num_children = 0; - list_head_init(&parent.children); - /* Test list_head_init */ - ok1(list_empty(&parent.children)); - ok1(list_check(&parent.children, NULL)); - - c2.name = "c2"; - list_add(&parent.children, &c2.list); - /* Test list_add and !list_empty. */ - ok1(!list_empty(&parent.children)); - ok1(c2.list.next == &parent.children.n); - ok1(c2.list.prev == &parent.children.n); - ok1(parent.children.n.next == &c2.list); - ok1(parent.children.n.prev == &c2.list); - /* Test list_check */ - ok1(list_check(&parent.children, NULL)); - - c1.name = "c1"; - list_add(&parent.children, &c1.list); - /* Test list_add and !list_empty. */ - ok1(!list_empty(&parent.children)); - ok1(c2.list.next == &parent.children.n); - ok1(c2.list.prev == &c1.list); - ok1(parent.children.n.next == &c1.list); - ok1(parent.children.n.prev == &c2.list); - ok1(c1.list.next == &c2.list); - ok1(c1.list.prev == &parent.children.n); - /* Test list_check */ - ok1(list_check(&parent.children, NULL)); - - c3.name = "c3"; - list_add_tail(&parent.children, &c3.list); - /* Test list_add_tail and !list_empty. */ - ok1(!list_empty(&parent.children)); - ok1(parent.children.n.next == &c1.list); - ok1(parent.children.n.prev == &c3.list); - ok1(c1.list.next == &c2.list); - ok1(c1.list.prev == &parent.children.n); - ok1(c2.list.next == &c3.list); - ok1(c2.list.prev == &c1.list); - ok1(c3.list.next == &parent.children.n); - ok1(c3.list.prev == &c2.list); - /* Test list_check */ - ok1(list_check(&parent.children, NULL)); - - /* Test list_check_node */ - ok1(list_check_node(&c1.list, NULL)); - ok1(list_check_node(&c2.list, NULL)); - ok1(list_check_node(&c3.list, NULL)); - - /* Test list_top */ - ok1(list_top(&parent.children, struct child, list) == &c1); - - /* Test list_pop */ - ok1(list_pop(&parent.children, struct child, list) == &c1); - ok1(list_top(&parent.children, struct child, list) == &c2); - list_add(&parent.children, &c1.list); - - /* Test list_tail */ - ok1(list_tail(&parent.children, struct child, list) == &c3); - - /* Test list_for_each. */ - i = 0; - list_for_each(&parent.children, c, list) { - switch (i++) { - case 0: - ok1(c == &c1); - break; - case 1: - ok1(c == &c2); - break; - case 2: - ok1(c == &c3); - break; - } - if (i > 2) - break; - } - ok1(i == 3); - - /* Test list_for_each_rev. */ - i = 0; - list_for_each_rev(&parent.children, c, list) { - switch (i++) { - case 0: - ok1(c == &c3); - break; - case 1: - ok1(c == &c2); - break; - case 2: - ok1(c == &c1); - break; - } - if (i > 2) - break; - } - ok1(i == 3); - - /* Test list_for_each_safe, list_del and list_del_from. */ - i = 0; - list_for_each_safe(&parent.children, c, n, list) { - switch (i++) { - case 0: - ok1(c == &c1); - list_del(&c->list); - break; - case 1: - ok1(c == &c2); - list_del_from(&parent.children, &c->list); - break; - case 2: - ok1(c == &c3); - list_del_from(&parent.children, &c->list); - break; - } - - /* prepare for list_for_each_rev_safe test */ - list_add(&rev, &c->list); - - ok1(list_check(&parent.children, NULL)); - if (i > 2) - break; - } - ok1(i == 3); - ok1(list_empty(&parent.children)); - - /* Test list_for_each_rev_safe, list_del and list_del_from. */ - i = 0; - list_for_each_rev_safe(&rev, c, n, list) { - switch (i++) { - case 0: - ok1(c == &c1); - list_del(&c->list); - break; - case 1: - ok1(c == &c2); - list_del_from(&rev, &c->list); - break; - case 2: - ok1(c == &c3); - list_del_from(&rev, &c->list); - break; - } - ok1(list_check(&rev, NULL)); - if (i > 2) - break; - } - ok1(i == 3); - ok1(list_empty(&rev)); - - /* Test list_node_init: safe to list_del after this. */ - list_node_init(&c->list); - list_del(&c->list); - - /* Test list_del_init */ - list_add(&parent.children, &c->list); - ok1(!list_empty(&parent.children)); - list_del_init(&c->list); - ok1(list_empty(&parent.children)); - /* We can call this as many times as we like. */ - list_del_init(&c->list); - list_del_init(&c->list); - - /* Test list_for_each_off. */ - list_add_tail(&opaque_list, - (struct list_node *)create_opaque_blob()); - list_add_tail(&opaque_list, - (struct list_node *)create_opaque_blob()); - list_add_tail(&opaque_list, - (struct list_node *)create_opaque_blob()); - - i = 0; - - list_for_each_off(&opaque_list, q, 0) { - i++; - ok1(if_blobs_know_the_secret(q)); - } - ok1(i == 3); - - /* Test list_for_each_safe_off, list_del_off and list_del_from_off. */ - i = 0; - list_for_each_safe_off(&opaque_list, q, nq, 0) { - switch (i++) { - case 0: - ok1(if_blobs_know_the_secret(q)); - list_del_off(q, 0); - destroy_opaque_blob(q); - break; - case 1: - ok1(if_blobs_know_the_secret(q)); - list_del_from_off(&opaque_list, q, 0); - destroy_opaque_blob(q); - break; - case 2: - ok1(c == &c3); - list_del_from_off(&opaque_list, q, 0); - destroy_opaque_blob(q); - break; - } - ok1(list_check(&opaque_list, NULL)); - if (i > 2) - break; - } - ok1(i == 3); - ok1(list_empty(&opaque_list)); - - /* Test list_top/list_tail/list_pop on empty list. */ - ok1(list_top(&parent.children, struct child, list) == NULL); - ok1(list_tail(&parent.children, struct child, list) == NULL); - ok1(list_pop(&parent.children, struct child, list) == NULL); - - /* Test list_add_before and list_add_after */ - list_add(&parent.children, &c1.list); - list_add_after(&parent.children, &c1.list, &c2.list); - ok1(list_check(&parent.children, "list_add_after")); - - i = 0; - list_for_each(&parent.children, c, list) { - switch (i++) { - case 0: - ok1(c == &c1); - break; - case 1: - ok1(c == &c2); - break; - } - } - ok1(i == 2); - - list_add_before(&parent.children, &c2.list, &c3.list); - ok1(list_check(&parent.children, "list_add_before")); - - i = 0; - list_for_each(&parent.children, c, list) { - switch (i++) { - case 0: - ok1(c == &c1); - break; - case 1: - ok1(c == &c3); - break; - case 2: - ok1(c == &c2); - break; - } - } - ok1(i == 3); - - /* test list_swap */ - list_swap(&c3.list, &x1.list); - ok1(list_check(&parent.children, "list_swap")); - i = 0; - list_for_each(&parent.children, c, list) { - switch (i++) { - case 0: - ok1(c == &c1); - break; - case 1: - ok1(c == &x1); - break; - case 2: - ok1(c == &c2); - break; - } - } - ok1(i == 3); - - return exit_status(); -} -- cgit v1.2.3