Initial revision
[alioth/jupp.git] / queue.h
1 /* $MirOS: contrib/code/jupp/queue.h,v 1.2 2008/05/13 13:08:24 tg Exp $ */
2 /*
3  *      Doubly linked list primitives
4  *      Copyright
5  *              (C) 1992 Joseph H. Allen
6  *
7  *      This file is part of JOE (Joe's Own Editor)
8  */
9 #ifndef _JOE_QUEUE
10 #define _JOE_QUEUE 1 
11
12 #include "config.h"
13
14 extern void *ITEM;
15 extern void *QUEUE;
16 extern void *LAST;
17
18 #define izque(type,member,item) do { \
19         QUEUE = (void *)(item); \
20         ((type *)QUEUE)->member.prev = (type *)QUEUE; \
21         ((type *)QUEUE)->member.next = (type *)QUEUE; \
22         } while(0)
23
24 #define deque(type,member,item) do { \
25         ITEM = (void *)(item); \
26         ((type *)ITEM)->member.prev->member.next = ((type *)ITEM)->member.next; \
27         ((type *)ITEM)->member.next->member.prev = ((type *)ITEM)->member.prev; \
28         } while(0)
29
30 #define deque_f(type,member,item) \
31         ( \
32         ITEM=(void *)(item), \
33         ((type *)ITEM)->member.prev->member.next=((type *)ITEM)->member.next, \
34         ((type *)ITEM)->member.next->member.prev=((type *)ITEM)->member.prev, \
35         (type *)ITEM \
36         )
37
38 #define qempty(type,member,item) \
39         ( \
40         QUEUE=(void *)(item), \
41         (type *)QUEUE==((type *)QUEUE)->member.next \
42         )
43
44 #define enquef(type,member,queue,item) do { \
45         ITEM = (void *)(item); \
46         QUEUE = (void *)(queue); \
47         ((type *)ITEM)->member.next = ((type *)QUEUE)->member.next; \
48         ((type *)ITEM)->member.prev = (type *)QUEUE; \
49         ((type *)QUEUE)->member.next->member.prev = (type *)ITEM; \
50         ((type *)QUEUE)->member.next = (type *)ITEM; \
51         } while(0)
52
53 #define enqueb(type,member,queue,item) do { \
54         ITEM = (void *)(item); \
55         QUEUE = (void *)(queue); \
56         ((type *)ITEM)->member.next = (type *)QUEUE; \
57         ((type *)ITEM)->member.prev = ((type *)QUEUE)->member.prev; \
58         ((type *)QUEUE)->member.prev->member.next = (type *)ITEM; \
59         ((type *)QUEUE)->member.prev = (type *)ITEM; \
60         } while(0)
61
62 #define enqueb_f(type,member,queue,item) \
63         ( \
64         ITEM=(void *)(item), \
65         QUEUE=(void *)(queue), \
66         ((type *)ITEM)->member.next=(type *)QUEUE, \
67         ((type *)ITEM)->member.prev=((type *)QUEUE)->member.prev, \
68         ((type *)QUEUE)->member.prev->member.next=(type *)ITEM, \
69         ((type *)QUEUE)->member.prev=(type *)ITEM, \
70         (type *)ITEM \
71         )
72
73 #define promote(type,member,queue,item) \
74         enquef(type,member,(queue),deque_f(type,member,(item)))
75
76 #define demote(type,member,queue,item) \
77         enqueb(type,member,(queue),deque_f(type,member,(item)))
78
79 #define splicef(type,member,queue,chain) do { \
80         ITEM = (void *)(chain); \
81         LAST = (void *)((type *)ITEM)->member.prev; \
82         QUEUE = (void *)(queue); \
83         ((type *)LAST)->member.next = ((type *)QUEUE)->member.next; \
84         ((type *)ITEM)->member.prev = (type *)QUEUE; \
85         ((type *)QUEUE)->member.next->member.prev = (type *)LAST; \
86         ((type *)QUEUE)->member.next = (type *)ITEM; \
87         } while(0)
88
89 #define spliceb(type,member,queue,chain) do { \
90         ITEM = (void *)(chain); \
91         LAST = (void *)((type *)ITEM)->member.prev; \
92         QUEUE = (void *)(queue); \
93         ((type *)LAST)->member.next = (type *)QUEUE; \
94         ((type *)ITEM)->member.prev = ((type *)QUEUE)->member.prev; \
95         ((type *)QUEUE)->member.prev->member.next = (type *)ITEM; \
96         ((type *)QUEUE)->member.prev = (type *)LAST; \
97         } while(0)
98
99 #define spliceb_f(type,member,queue,chain) \
100         ( \
101         ITEM=(void *)(chain), \
102         LAST=(void *)((type *)ITEM)->member.prev, \
103         QUEUE=(void *)(queue), \
104         ((type *)LAST)->member.next=(type *)QUEUE, \
105         ((type *)ITEM)->member.prev=((type *)QUEUE)->member.prev, \
106         ((type *)QUEUE)->member.prev->member.next=(type *)ITEM, \
107         ((type *)QUEUE)->member.prev=(type *)LAST, \
108         (type *)ITEM \
109         )
110
111 #define snip(type,member,first,last) \
112         ( \
113         ITEM=(void *)(first), \
114         LAST=(void *)(last), \
115         ((type *)LAST)->member.next->member.prev=((type *)ITEM)->member.prev, \
116         ((type *)ITEM)->member.prev->member.next=((type *)LAST)->member.next, \
117         ((type *)ITEM)->member.prev=(type *)LAST, \
118         ((type *)LAST)->member.next=(type *)ITEM, \
119         (type *)ITEM \
120         )
121
122 void *alitem PARAMS((void *list, int itemsize));
123 void frchn PARAMS((void *list, void *ch));
124
125 #endif