2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <afsconfig.h>
19 #include <afs/bubasics.h>
21 int dlqEmpty(dlqlinkP );
22 int dlqInit(dlqlinkP headptr);
23 int dlqLinkf(dlqlinkP, dlqlinkP );
24 int dlqLinkb(dlqlinkP, dlqlinkP );
25 void dlqUnlink( dlqlinkP );
26 int dlqTraverseQueue(dlqlinkP, int *(), int *());
27 int dlqCount(dlqlinkP );
28 void dlqMoveb( dlqlinkP, dlqlinkP);
29 dlqlinkP dlqUnlinkb(dlqlinkP );
30 dlqlinkP dlqUnlinkf(dlqlinkP );
31 dlqlinkP dlqFront(dlqlinkP headptr);
33 #define DLQ_ASSERT_HEAD(headptr) \
34 if ( (headptr)->dlq_type != DLQ_HEAD ) \
36 printf("file %s line %d, invalid queue head\n", \
37 __FILE__, __LINE__); \
48 int dlqEmpty(dlqlinkP headptr )
50 DLQ_ASSERT_HEAD(headptr);
51 if (headptr->dlq_next == headptr)
56 int dlqInit(dlqlinkP headptr)
58 headptr->dlq_next = headptr;
59 headptr->dlq_prev = headptr;
60 headptr->dlq_type = DLQ_HEAD;
61 headptr->dlq_structPtr = NULL;
66 * link item to front of chain
68 int dlqLinkf(dlqlinkP headptr, dlqlinkP entryptr)
70 DLQ_ASSERT_HEAD(headptr);
71 /* link in as first item in chain */
72 entryptr->dlq_next = headptr->dlq_next;
73 headptr->dlq_next->dlq_prev = entryptr;
74 entryptr->dlq_prev = headptr;
75 headptr->dlq_next = entryptr;
80 * link item to end of chain
83 int dlqLinkb(dlqlinkP headptr, dlqlinkP entryptr)
85 DLQ_ASSERT_HEAD(headptr);
86 entryptr->dlq_next = headptr;
87 entryptr->dlq_prev = headptr->dlq_prev;
89 headptr->dlq_prev = entryptr;
90 entryptr->dlq_prev->dlq_next = entryptr;
95 * move all the items on the fromptr and append to the toptr's list
98 void dlqMoveb( dlqlinkP fromptr, dlqlinkP toptr)
102 DLQ_ASSERT_HEAD(fromptr);
103 DLQ_ASSERT_HEAD(toptr);
105 if (dlqEmpty(fromptr))
108 tailptr = toptr->dlq_prev;
110 tailptr->dlq_next = fromptr->dlq_next;
111 tailptr->dlq_next->dlq_prev = tailptr;
113 /* now fix up the last item in the new chain */
114 tailptr = fromptr->dlq_prev;
116 tailptr->dlq_next = toptr;
117 toptr->dlq_prev = tailptr;
119 fromptr->dlq_next = fromptr;
120 fromptr->dlq_prev = fromptr;
125 * unlink the last item on the queue
128 dlqlinkP dlqUnlinkb(dlqlinkP headptr)
131 DLQ_ASSERT_HEAD(headptr);
133 if (dlqEmpty(headptr))
136 ptr = headptr->dlq_prev;
137 ptr->dlq_prev->dlq_next = headptr;
138 headptr->dlq_prev = ptr->dlq_prev;
146 * unlink the item on the front of the queue
149 dlqlinkP dlqUnlinkf(dlqlinkP headptr)
152 DLQ_ASSERT_HEAD(headptr);
154 if (dlqEmpty(headptr))
157 ptr = headptr->dlq_next;
159 headptr->dlq_next = ptr->dlq_next;
160 ptr->dlq_next->dlq_prev = headptr;
168 * unlink the specified item from the queue.
171 void dlqUnlink( dlqlinkP ptr)
173 /* must not be the queue head */
174 if (ptr->dlq_type == DLQ_HEAD) {
175 printf("dlqUnlink: invalid unlink\n");
179 ptr->dlq_prev->dlq_next = ptr->dlq_next;
180 ptr->dlq_next->dlq_prev = ptr->dlq_prev;
187 * return point to item at front of queuen
190 dlqlinkP dlqFront(dlqlinkP headptr)
192 DLQ_ASSERT_HEAD(headptr);
194 if (dlqEmpty(headptr))
197 return (headptr->dlq_next);
200 int dlqCount(dlqlinkP headptr)
205 DLQ_ASSERT_HEAD(headptr);
207 ptr = headptr->dlq_next;
208 while (ptr != headptr) {
215 int dlqTraverseQueue(dlqlinkP headptr, int (*fn1()), int (*fn2()))
217 dlqlinkP ptr, oldPtr;
219 DLQ_ASSERT_HEAD(headptr);
221 ptr = headptr->dlq_next;
222 while (ptr != headptr) {
223 if (fn2 && ptr->dlq_structPtr)
224 (*fn2) (ptr->dlq_structPtr);