#include <stdlib.h>
#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)
{
for (p = node, n = node->next; n != node; p = n, n = n->next) {
count++;
- if (n->prev != p) {
- if (!abortstr)
- return NULL;
- fprintf(stderr,
- "%s: prev corrupt in node %p (%u) of %p\n",
- abortstr, n, count, node);
- abort();
- }
+ 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 (h->n.next == &h->n) {
- if (h->n.prev != &h->n) {
- if (!abortstr)
- return NULL;
- fprintf(stderr, "%s: prev corrupt in empty %p\n",
- abortstr, h);
- abort();
- }
- return (struct list_head *)h;
- }
-
if (!list_check_node(&h->n, abortstr))
return NULL;
return (struct list_head *)h;