1 /* $MirOS: contrib/code/jupp/queue.h,v 1.2 2008/05/13 13:08:24 tg Exp $ */
3 * Doubly linked list primitives
5 * (C) 1992 Joseph H. Allen
7 * This file is part of JOE (Joe's Own Editor)
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; \
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; \
30 #define deque_f(type,member,item) \
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, \
38 #define qempty(type,member,item) \
40 QUEUE=(void *)(item), \
41 (type *)QUEUE==((type *)QUEUE)->member.next \
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; \
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; \
62 #define enqueb_f(type,member,queue,item) \
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, \
73 #define promote(type,member,queue,item) \
74 enquef(type,member,(queue),deque_f(type,member,(item)))
76 #define demote(type,member,queue,item) \
77 enqueb(type,member,(queue),deque_f(type,member,(item)))
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; \
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; \
99 #define spliceb_f(type,member,queue,chain) \
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, \
111 #define snip(type,member,first,last) \
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, \
122 void *alitem PARAMS((void *list, int itemsize));
123 void frchn PARAMS((void *list, void *ch));