add archipelago-dbg package
[archipelago] / xseg / xtypes / xlist.c
1 #include <xq/xlist.h>
2
3 void __xlist_detach(struct xlist_node *node)
4 {
5         struct xlist_node *head, *tail;
6         head = XPTR(&node->head);
7         tail = XPTR(&node->tail);
8         if (head)
9                 XPTRSET(&head->tail, tail);
10         if (tail)
11                 XPTRSET(&tail->head, head);
12         XPTRSET(&node->pool, NULL);
13 }
14
15 void __xlist_attach(    struct xlist_node *head,
16                         struct xlist_node *tail,
17                         struct xlist_node *node )
18 {
19         struct xlist *list = XPTR(node->list);
20         xqindex nr = XPTRI(&list->node.list);
21
22         if (!list || !nr)
23                 return;
24
25         XPTRSET(&node->head, head);
26         XPTRSET(&node->tail, tail);
27         XPTRSET(&head->tail, node);
28         XPTRSET(&tail->head, node);
29         XPTRISET(&list->node.list, nr - 1);
30 }
31
32 xqindex xlist_add_head(struct xlist *list, struct xlist_node *node)
33 {
34         struct xlist_node *head;
35         xqindex nr = XPTRI(&list->node.list) + 1;
36
37         if (nr == Noneidx)
38                 goto out;
39
40         __xlist_detach(node);
41         head = XPTR(&node->head);
42         __xlist_attach(head, &list->node, node);
43
44         XPTRISET(&list->node.list, nr);
45 out:
46         return nr;
47 }
48
49 xqindex xlist_add_tail(struct xlist *list, struct xlist_node *node)
50 {
51         struct xlist_node *tail;
52         xqindex nr = XPTRI(&list->node.list) + 1;
53
54         if (nr == Noneidx)
55                 goto out;
56
57         __xlist_detach(node);
58         tail = XPTR(&node->tail);
59         __xlist_attach(&list->node, tail, node);
60
61         XPTRISET(&list->node.list, nr);
62 out:
63         return nr;
64 }
65
66 struct xlist *xlist_detach(struct xlist_node *node)
67 {
68         struct xlist *list = node->list;
69         __xlist_detach(node);
70         return list;
71 }
72
73 #endif