{
int i;
struct ll *curll = NULL;
- struct ll *nextll = NULL;
for (i = 0; i < HASHSIZE; i++) {
curll = hashtable[i];
- while (curll != NULL) {
- nextll = curll->next;
- /*
- * TODO: The problem is the object has pointers that
- * need freed too.
- */
- free(curll->object);
- free(curll);
- curll = nextll;
- }
+ /*
+ * TODO: The problem is the object has pointers that
+ * need freed too.
+ */
+ llfree(curll, free);
hashtable[i] = NULL;
}
elements = 0;
return count;
}
+
+/**
+ * llfree - Frees a linked list.
+ * @curll: The list to free.
+ * @objectfree: A pointer to a free function for the object.
+ *
+ * Walks through a list and free it. If a function is provided for
+ * objectfree then it's called for each element to free them, if it's NULL
+ * just the list is freed.
+ */
+struct ll *llfree(struct ll *curll,
+ void (*objectfree) (void *object))
+{
+ struct ll *nextll;
+
+ while (curll != NULL) {
+ nextll = curll->next;
+ if (curll->object != NULL && objectfree != NULL) {
+ objectfree(curll->object);
+ curll->object = NULL;
+ }
+ free(curll);
+ curll = nextll;
+ }
+ return NULL;
+}
struct ll *lladd(struct ll *curll, void *object);
/**
+ * lldel - Remove an item from a linked list.
+ * @curll: The list to remove the item from.
+ * @object: The object to remove.
+ * @objectcmp: A pointer to a comparision function for the object type.
*
+ * Trawls through the list looking for the object. If it's found then it
+ * is removed from the list. Only one occurance is searched for. Returns
+ * a pointer to the head of the new list.
*/
struct ll *lldel(struct ll *curll, void *object,
int (*objectcmp) (const void *object1, const void *object2));
/**
+ * llfind - Find an item in a linked list.
+ * @curll: The list to look in.
+ * @object: The object to look for.
+ * @objectcmp: A pointer to a comparision function for the object type.
*
+ * Searches through a list for an object. Returns a pointer to the object
+ * if it's found, otherwise NULL.
*/
struct ll *llfind(struct ll *curll, void *object,
int (*objectcmp) (const void *object1, const void *object2));
*/
unsigned long llsize(struct ll *curll);
+/**
+ * llfree - Frees a linked list.
+ * @curll: The list to free.
+ * @objectfree: A pointer to a free function for the object.
+ *
+ * Walks through a list and free it. If a function is provided for
+ * objectfree then it's called for each element to free them, if it's NULL
+ * just the list is freed.
+ */
+struct ll *llfree(struct ll *curll,
+ void (*objectfree) (void *object));
+
#endif /* __LL_H__ */