From: Pekka Riikonen Date: Wed, 27 Feb 2008 17:20:44 +0000 (+0200) Subject: Added silc_dlist_init_static and silc_dlist_uninit_static X-Git-Tag: 1.2.beta2~9 X-Git-Url: http://git.silcnet.org/gitweb/?p=runtime.git;a=commitdiff_plain;h=8eeb9ea5a9819773084c782d10c693b341c6903e Added silc_dlist_init_static and silc_dlist_uninit_static --- diff --git a/lib/silcutil/silcdlist.h b/lib/silcutil/silcdlist.h index e20cdb38..a6b2b8c2 100644 --- a/lib/silcutil/silcdlist.h +++ b/lib/silcutil/silcdlist.h @@ -57,7 +57,7 @@ * * NAME * - * typedef struct { ... } *SilcDList; + * typedef struct { ... } *SilcDList, SilcDListStruct; * * DESCRIPTION * @@ -66,12 +66,12 @@ * 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