2 * Bacula doubly linked list routines.
4 * dlist is a doubly linked list with the links being in the
7 * Kern Sibbald, July MMIII
13 Copyright (C) 2000-2004 Kern Sibbald and John Walker
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License as
17 published by the Free Software Foundation; either version 2 of
18 the License, or (at your option) any later version.
20 This program is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
25 You should have received a copy of the GNU General Public
26 License along with this program; if not, write to the Free
27 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
34 /* ===================================================================
38 * Append an item to the list
40 void dlist::append(void *item)
42 ((dlink *)(((char *)item)+loffset))->next = NULL;
43 ((dlink *)(((char *)item)+loffset))->prev = tail;
45 ((dlink *)(((char *)tail)+loffset))->next = item;
48 if (head == NULL) { /* if empty list, */
49 head = item; /* item is head as well */
55 * Append an item to the list
57 void dlist::prepend(void *item)
59 ((dlink *)(((char *)item)+loffset))->next = head;
60 ((dlink *)(((char *)item)+loffset))->prev = NULL;
62 ((dlink *)(((char *)head)+loffset))->prev = item;
65 if (tail == NULL) { /* if empty list, */
66 tail = item; /* item is tail too */
71 void dlist::insert_before(void *item, void *where)
73 dlink *where_link = (dlink *)((char *)where+loffset);
75 ((dlink *)(((char *)item)+loffset))->next = where;
76 ((dlink *)(((char *)item)+loffset))->prev = where_link->prev;
78 if (where_link->prev) {
79 ((dlink *)(((char *)(where_link->prev))+loffset))->next = item;
81 where_link->prev = item;
88 void dlist::insert_after(void *item, void *where)
90 dlink *where_link = (dlink *)((char *)where+loffset);
92 ((dlink *)(((char *)item)+loffset))->next = where_link->next;
93 ((dlink *)(((char *)item)+loffset))->prev = where;
95 if (where_link->next) {
96 ((dlink *)(((char *)(where_link->next))+loffset))->prev = item;
98 where_link->next = item;
106 void dlist::remove(void *item)
109 dlink *ilink = (dlink *)(((char *)item)+loffset); /* item's link */
113 ((dlink *)(((char *)head)+loffset))->prev = NULL;
118 } else if (item == tail) {
121 ((dlink *)(((char *)tail)+loffset))->next = NULL;
125 ((dlink *)(((char *)xitem)+loffset))->prev = ilink->prev;
127 ((dlink *)(((char *)xitem)+loffset))->next = ilink->next;
130 if (num_items == 0) {
135 void * dlist::next(void *item)
140 return ((dlink *)(((char *)item)+loffset))->next;
143 void * dlist::prev(void *item)
148 return ((dlink *)(((char *)item)+loffset))->prev;
152 /* Destroy the list contents */
153 void dlist::destroy()
155 for (void *n=head; n; ) {
156 void *ni = ((dlink *)(((char *)n)+loffset))->next;
178 MYJCR *save_jcr = NULL;
181 jcr_chain = (dlist *)malloc(sizeof(dlist));
182 jcr_chain->init(jcr, &jcr->link);
184 printf("Prepend 20 items 0-19\n");
185 for (int i=0; i<20; i++) {
186 sprintf(buf, "This is dlist item %d", i);
187 jcr = (MYJCR *)malloc(sizeof(MYJCR));
188 jcr->buf = bstrdup(buf);
189 jcr_chain->prepend(jcr);
195 next_jcr = (MYJCR *)jcr_chain->next(save_jcr);
196 printf("11th item=%s\n", next_jcr->buf);
197 jcr = (MYJCR *)malloc(sizeof(MYJCR));
198 jcr->buf = save_jcr->buf;
199 printf("Remove 10th item\n");
200 jcr_chain->remove(save_jcr);
201 printf("Re-insert 10th item\n");
202 jcr_chain->insert_before(jcr, next_jcr);
204 printf("Print remaining list.\n");
205 foreach_dlist (jcr, jcr_chain) {
206 printf("Dlist item = %s\n", jcr->buf);
209 jcr_chain->destroy();
212 jcr_chain = new dlist(jcr, &jcr->link);
213 printf("append 20 items 0-19\n");
214 for (int i=0; i<20; i++) {
215 sprintf(buf, "This is dlist item %d", i);
216 jcr = (MYJCR *)malloc(sizeof(MYJCR));
217 jcr->buf = bstrdup(buf);
218 jcr_chain->append(jcr);
224 next_jcr = (MYJCR *)jcr_chain->next(save_jcr);
225 printf("11th item=%s\n", next_jcr->buf);
226 jcr = (MYJCR *)malloc(sizeof(MYJCR));
227 jcr->buf = save_jcr->buf;
228 printf("Remove 10th item\n");
229 jcr_chain->remove(save_jcr);
230 printf("Re-insert 10th item\n");
231 jcr_chain->insert_before(jcr, next_jcr);
233 printf("Print remaining list.\n");
234 foreach_dlist (jcr, jcr_chain) {
235 printf("Dlist item = %s\n", jcr->buf);