Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2002 - 2007 Pekka Riikonen
+ Copyright (C) 2002 - 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
*/
-/****h* silcutil/SILC List Interface
+/****h* silcutil/List Interface
*
* DESCRIPTION
*
- * Implementation of the SilcList interface. This interface provides
- * simple linked list. This interface does not allocate any memory.
+ * Generic list interface that can turn any structure with list pointers
+ * into a SilcList. The interface can provide both singly and doubly linked
+ * lists. The interface does not allocate any memory.
*
* SILC List is not thread-safe. If the same list context must be used
* in multithreaded environment concurrency control must be employed.
*
+ * EXAMPLE
+ *
+ * struct EntryStruct {
+ * char *dummy;
+ * struct EntryStruct *next; // The list member pointer
+ * };
+ *
+ * SilcList list;
+ *
+ * // Initialize list
+ * silc_list_init(list, struct EntryStruct, next);
+ *
***/
#ifndef SILCLIST_H
#define SILCLIST_H
-/****s* silcutil/SilcList/SilcList
+/****s* silcutil/SilcList
*
* NAME
*
* function silc_list_init.
*
***/
-typedef struct {
+typedef struct SilcListStruct {
void *head; /* Start of the list */
void *tail; /* End of the list */
void *current; /* Current pointer in list */
unsigned int count : 30; /* Number of entries in the list */
} SilcList;
-/****d* silcutil/SilcList/SILC_LIST_END
+/****d* silcutil/SILC_LIST_END
*
* NAME
*
- * #define SILC_LIST_END ...
+ * #define SILC_LIST_END NULL
*
* DESCRIPTION
*
#define SILC_LIST_END NULL
/***/
-/****f* silcutil/SilcList/silc_list_init
+/****f* silcutil/silc_list_init
*
* SYNOPSIS
*
(list).next_offset = silc_offsetof(type, nextfield); \
(list).prev_set = 0; \
(list).prev_offset = 0; \
+ (list).end_set = 0; \
(list).head = (list).tail = (list).current = NULL; \
} while(0)
-/****f* silcutil/SilcList/silc_list_init_prev
+/****f* silcutil/silc_list_init_prev
*
* SYNOPSIS
*
(list).next_offset = silc_offsetof(type, nextfield); \
(list).prev_offset = silc_offsetof(type, prevfield); \
(list).prev_set = 1; \
+ (list).end_set = 0; \
(list).head = (list).tail = (list).current = NULL; \
} while(0)
-/****f* silcutil/SilcList/silc_list_count
+/****f* silcutil/silc_list_count
*
* SYNOPSIS
*
***/
#define silc_list_count(list) (list).count
-/****f* silcutil/SilcList/silc_list_start
+/****f* silcutil/silc_list_start
*
* SYNOPSIS
*
#define silc_list_start(list) \
((list).current = (list).head, (list).end_set = 0)
-/****f* silcutil/SilcList/silc_list_end
+/****f* silcutil/silc_list_end
*
* SYNOPSIS
*
#define __silc_list_prev(list, pos) \
((void **)((unsigned char *)(pos) + (list).prev_offset))
-/****f* silcutil/SilcList/silc_list_add
+/****f* silcutil/silc_list_add
*
* SYNOPSIS
*
(list).count++; \
} while(0)
-/****f* silcutil/SilcList/silc_list_insert
+/****f* silcutil/silc_list_insert
*
* SYNOPSIS
*
(list).count++; \
} while(0)
-/****f* silcutil/SilcList/silc_list_del
+/****f* silcutil/silc_list_del
*
* SYNOPSIS
*
(list).tail = prev; \
} while(0)
-/****f* silcutil/SilcList/silc_list_get
+/****f* silcutil/silc_list_get
*
* SYNOPSIS
*