Added silc_dlist_init_static and silc_dlist_uninit_static
[runtime.git] / lib / silcutil / silcdlist.h
index 9c951e49e6cb89be237f4d7f1e2160efb2716099..a6b2b8c2484ff76b9787a206a76f311ff040472a 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2000 - 2007 Pekka Riikonen
+  Copyright (C) 2000 - 2008 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
 
 #include "silclist.h"
 
-/****h* silcutil/SILC Dynamic List Interface
+/****h* silcutil/Dynamic List Interface
  *
  * DESCRIPTION
  *
  * SILC Dynamic List API can be used to add opaque contexts to list that
- * will automatically allocate list entries.  Normal SILC List API cannot
+ * will automatically allocate list entries.  The simpler SilcList cannot
  * be used for this purpose because in that case the context passed to the
  * list must be defined as list structure already.  This is not the case in
  * SilcDList.  But SilcDList is a bit slower than SilcList because it
  *
  ***/
 
-/****s* silcutil/SilcDListAPI/SilcDList
+/****s* silcutil/SilcDList
  *
  * NAME
  *
- *    typedef struct { ... } *SilcDList;
+ *    typedef struct { ... } *SilcDList, SilcDListStruct;
  *
  * DESCRIPTION
  *
  *    Dynamic List Interface functions.
  *
  ***/
-typedef struct SilcDListStruct {
+typedef struct SilcDListObject {
   SilcStack stack;
   SilcList list;
   void *current;
   void *prev;
-} *SilcDList;
+} *SilcDList, SilcDListStruct;
 
 /* SilcDListEntry structure, one entry in the list. This MUST NOT be used
    directly by the application. */
@@ -81,7 +81,7 @@ typedef struct SilcDListEntryStruct {
   struct SilcDListEntryStruct *prev;
 } *SilcDListEntry;
 
-/****f* silcutil/SilcDListAPI/silc_dlist_init
+/****f* silcutil/silc_dlist_init
  *
  * SYNOPSIS
  *
@@ -90,7 +90,8 @@ typedef struct SilcDListEntryStruct {
  *
  * DESCRIPTION
  *
- *    Initializes SilcDList.  Returns the SilcDList context or NULL on error.
+ *    Initializes SilcDList.  Returns the SilcDList context or NULL if system
+ *    is out of memory.
  *
  ***/
 
@@ -108,7 +109,7 @@ SilcDList silc_dlist_init(void)
   return list;
 }
 
-/****f* silcutil/SilcDListAPI/silc_dlist_sinit
+/****f* silcutil/silc_dlist_sinit
  *
  * SYNOPSIS
  *
@@ -142,7 +143,27 @@ SilcDList silc_dlist_sinit(SilcStack stack)
   return list;
 }
 
-/****f* silcutil/SilcDListAPI/silc_dlist_uninit
+/****f* silcutil/silc_dlist_init_static
+ *
+ * SYNOPSIS
+ *
+ *    static inline
+ *    void silc_dlist_init_static(SilcDlist list);
+ *
+ * DESCRIPTION
+ *
+ *    Initialize a pre-allocated allocated SilcDList.
+ *
+ ***/
+
+static inline
+void silc_dlist_init_static(SilcDList list)
+{
+  list->stack = list->current = list->prev = NULL;
+  silc_list_init_prev(list->list, struct SilcDListEntryStruct, next, prev);
+}
+
+/****f* silcutil/silc_dlist_uninit
  *
  * SYNOPSIS
  *
@@ -174,7 +195,35 @@ void silc_dlist_uninit(SilcDList list)
   }
 }
 
-/****f* silcutil/SilcDListAPI/silc_dlist_count
+/****f* silcutil/silc_dlist_uninit_static
+ *
+ * SYNOPSIS
+ *
+ *    static inline
+ *    void silc_dlist_uninit_static(SilcDList list);
+ *
+ * DESCRIPTION
+ *
+ *    Uninits and frees all memory. Must be called to free memory. Does NOT
+ *    free the contexts saved by caller.  Used to uninit a list initialized
+ *    with silc_dlist_init_static.
+ *
+ ***/
+
+static inline
+void silc_dlist_uninit_static(SilcDList list)
+{
+  if (list) {
+    SilcDListEntry e;
+    silc_list_start(list->list);
+    while ((e = (SilcDListEntry)silc_list_get(list->list)) != SILC_LIST_END) {
+      silc_list_del(list->list, e);
+      silc_free(e);
+    }
+  }
+}
+
+/****f* silcutil/silc_dlist_count
  *
  * SYNOPSIS
  *
@@ -193,7 +242,7 @@ int silc_dlist_count(SilcDList list)
   return silc_list_count(list->list);
 }
 
-/****f* silcutil/SilcDListAPI/silc_dlist_start
+/****f* silcutil/silc_dlist_start
  *
  * SYNOPSIS
  *
@@ -214,7 +263,7 @@ void silc_dlist_start(SilcDList list)
   list->current = list->prev = NULL;
 }
 
-/****f* silcutil/SilcDListAPI/silc_dlist_end
+/****f* silcutil/silc_dlist_end
  *
  * SYNOPSIS
  *
@@ -235,7 +284,7 @@ void silc_dlist_end(SilcDList list)
   list->current = list->prev = NULL;
 }
 
-/****f* silcutil/SilcDListAPI/silc_dlist_add
+/****f* silcutil/silc_dlist_add
  *
  * SYNOPSIS
  *
@@ -260,7 +309,7 @@ SilcBool silc_dlist_add(SilcDList list, void *context)
   return TRUE;
 }
 
-/****f* silcutil/SilcDList/silc_dlist_insert
+/****f* silcutil/silc_dlist_insert
  *
  * SYNOPSIS
  *
@@ -286,7 +335,7 @@ SilcBool silc_dlist_insert(SilcDList list, void *context)
   return TRUE;
 }
 
-/****f* silcutil/SilcDListAPI/silc_dlist_del
+/****f* silcutil/silc_dlist_del
  *
  * SYNOPSIS
  *
@@ -321,7 +370,7 @@ void silc_dlist_del(SilcDList list, void *entry)
   }
 }
 
-/****f* silcutil/SilcDListAPI/silc_dlist_get
+/****f* silcutil/silc_dlist_get
  *
  * SYNOPSIS
  *