From: Jonathan McDowell <noodles@earth.li>
Date: Mon, 31 May 2004 23:47:03 +0000 (+0000)
Subject: cscvs to tla changeset 20
X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/commitdiff_plain/e01d2e2d07392eb03e4268fdc4f0f1339a9a9461

cscvs to tla changeset 20
Author: noodles
Date: 2002/11/09 13:04:17
Addition of llfree function to cleanup linked lists.
---

diff --git a/hash.c b/hash.c
index e29017c..f07017a 100644
--- a/hash.c
+++ b/hash.c
@@ -48,20 +48,14 @@ void destroyhash(void)
 {
 	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;
diff --git a/ll.c b/ll.c
index 7110378..5936bf6 100644
--- a/ll.c
+++ b/ll.c
@@ -81,3 +81,29 @@ unsigned long llsize(struct ll *curll)
 
 	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;
+}
diff --git a/ll.h b/ll.h
index 3890ca9..15bc64d 100644
--- a/ll.h
+++ b/ll.h
@@ -50,13 +50,26 @@ struct ll {
 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));
@@ -69,4 +82,16 @@ struct ll *llfind(struct ll *curll, void *object,
  */
 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__ */