/*
- * Version $Id$
- */
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2004-2010 Free Software Foundation Europe e.V.
+
+ The main author of Bacula is Kern Sibbald, with contributions from
+ many others, a complete list can be found in the file AUTHORS.
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version three of the GNU Affero General Public
+ License as published by the Free Software Foundation and included
+ in the file LICENSE.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Bacula® is a registered trademark of Kern Sibbald.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
/*
- Copyright (C) 2004-2006 Kern Sibbald
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as amended with additional clauses defined in the
- file LICENSE in the main source directory.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- the file LICENSE for additional details.
-
+ * Written by Kern Sibbald MMIV
+ *
*/
/* ========================================================================
*
* Doubly linked list -- dlist
+ *
+ * See the end of the file for the dlistString class which
+ * facilitates storing strings in a dlist.
*
- * Kern Sibbald, MMIV
+ * Kern Sibbald, MMIV and MMVII
*
*/
*
* Loop var through each member of list
*/
-#if defined(__GNUC__)
+#ifdef HAVE_TYPEOF
#define foreach_dlist(var, list) \
for((var)=NULL; ((var)=(typeof(var))(list)->next(var)); )
#else
for((var)=NULL; (*((void **)&(var))=(void*)((list)->next(var))); )
#endif
-
-
struct dlink {
void *next;
void *prev;
dlist(void);
~dlist() { destroy(); }
void init(void *item, dlink *link);
+ void init();
void prepend(void *item);
void append(void *item);
+ void set_prev(void *item, void *prev);
+ void set_next(void *item, void *next);
+ void *get_prev(void *item);
+ void *get_next(void *item);
+ dlink *get_link(void *item);
void insert_before(void *item, void *where);
void insert_after(void *item, void *where);
void *binary_insert(void *item, int compare(void *item1, void *item2));
void remove(void *item);
bool empty() const;
int size() const;
- void *next(const void *item) const;
- void *prev(const void *item) const;
+ void *next(void *item);
+ void *prev(void *item);
void destroy();
void *first() const;
void *last() const;
num_items = 0;
}
+inline void dlist::init()
+{
+ head = tail = NULL;
+ loffset = 0;
+ num_items = 0;
+}
+
+
/*
* Constructor called with the address of a
* member of the list (not the list head), and
{
}
+inline void dlist::set_prev(void *item, void *prev)
+{
+ ((dlink *)(((char *)item)+loffset))->prev = prev;
+}
+
+inline void dlist::set_next(void *item, void *next)
+{
+ ((dlink *)(((char *)item)+loffset))->next = next;
+}
+
+inline void *dlist::get_prev(void *item)
+{
+ return ((dlink *)(((char *)item)+loffset))->prev;
+}
+
+inline void *dlist::get_next(void *item)
+{
+ return ((dlink *)(((char *)item)+loffset))->next;
+}
+
+
+inline dlink *dlist::get_link(void *item)
+{
+ return (dlink *)(((char *)item)+loffset);
+}
+
+
+
inline bool dlist::empty() const
{
return head == NULL;
{
return tail;
}
+
+/*
+ * C string helper routines for dlist
+ * The string (char *) is kept in the node
+ *
+ * Kern Sibbald, February 2007
+ *
+ */
+class dlistString
+{
+public:
+ char *c_str() { return m_str; };
+
+private:
+ dlink m_link;
+ char m_str[1];
+ /* !!! Don't put anything after this as this space is used
+ * to hold the string in inline
+ */
+};
+
+extern dlistString *new_dlistString(const char *str, int len);
+extern dlistString *new_dlistString(const char *str);