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-2003 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 */
54 * Append an item to the list
56 void dlist::prepend(void *item)
58 ((dlink *)((char *)item+loffset))->next = head;
59 ((dlink *)((char *)item+loffset))->prev = NULL;
61 ((dlink *)((char *)head+loffset))->prev = item;
64 if (tail == NULL) { /* if empty list, */
65 tail = item; /* item is tail too */
69 void dlist::remove(void *item)
72 dlink *ilink = (dlink *)((char *)item+loffset); /* item's link */
75 ((dlink *)((char *)head+loffset))->prev = NULL;
76 } else if (item == tail) {
78 ((dlink *)((char *)tail+loffset))->next = NULL;
81 ((dlink *)((char *)xitem+loffset))->prev = ilink->prev;
83 ((dlink *)((char *)xitem+loffset))->next = ilink->next;
88 void * dlist::next(void *item)
93 return ((dlink *)((char *)item+loffset))->next;
96 /* Destroy the list and its contents */
99 for (void *n=head; n; ) {
100 void *ni = ((dlink *)((char *)n+loffset))->next;
119 MYJCR *save_jcr = NULL;
121 jcr_chain = (dlist *)malloc(sizeof(dlist));
122 jcr_chain->init((int)&MYJCR::link);
124 printf("Prepend 20 items 0-19\n");
125 for (int i=0; i<20; i++) {
127 sprintf(buf, "This is dlist item %d", i);
128 jcr = (MYJCR *)malloc(sizeof(MYJCR));
129 jcr->buf = bstrdup(buf);
130 jcr_chain->prepend(jcr);
136 printf("Remove 10th item\n");
138 jcr_chain->remove(save_jcr);
140 printf("Print remaining list.\n");
141 for (MYJCR *jcr=NULL; (jcr=(MYJCR *)jcr_chain->next(jcr)); ) {
142 printf("Dlist item = %s\n", jcr->buf);
145 jcr_chain->destroy();