Added silc_dlist_init_static and silc_dlist_uninit_static
authorPekka Riikonen <priikone@silcnet.org>
Wed, 27 Feb 2008 17:20:44 +0000 (19:20 +0200)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 27 Feb 2008 17:20:44 +0000 (19:20 +0200)
lib/silcutil/silcdlist.h

index e20cdb38f6b0e5615be1aae76c7187f67abea0e1..a6b2b8c2484ff76b9787a206a76f311ff040472a 100644 (file)
@@ -57,7 +57,7 @@
  *
  * 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. */
@@ -143,6 +143,26 @@ SilcDList silc_dlist_sinit(SilcStack stack)
   return list;
 }
 
+/****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
@@ -175,6 +195,34 @@ void silc_dlist_uninit(SilcDList list)
   }
 }
 
+/****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