[ekg2-commit] ekg2: dynstuff.c (HEAD) dynstuff.h (HEAD) [darkjames]

CVS commit cvs w toxygen.net
Czw, 22 Lis 2007, 17:16:20 CET


Module name:	ekg2
Changes by:	darkjames	2007-11-22 17:16:18

Modified files:
	dynstuff.c dynstuff.h

Log message:
Ok, so let's add some stuff to list_t
Use LIST_REMOVE(list, data, func) to remove one item from list, and free data with func.
Use LIST_DESTROY(list, func) to destroy whole list, and free data with func.
Use LIST_FREE_ITEM() to declare function.
These macros are introduced to cleanup code.
We do:
	for (l = list; l; l = l->next) {
		cos_t cosik = l->data;
		/* free cosik */
	}
	list_destroy(list, 0);	list = NULL;
We go through list twice, first when we clear data.
Second in list_destroy() when we destroy list.
And quite often we've also have:
	void remove_smth_from_list(void *cosik) {
		if (!cosik)
			return;
		/* free cosik */
		list_remove(&list, cosik, 0);
	}
So we'd also duplicated /* free cosik */ code.
It's all folks.

Index: dynstuff.c
===================================================================
RCS file: /home/cvs/ekg2/ekg/dynstuff.c,v
diff -d -u -r1.45 -r1.46
--- dynstuff.c	1 Aug 2007 08:04:21 -0000	1.45
+++ dynstuff.c	22 Nov 2007 16:16:18 -0000	1.46
@@ -208,23 +208,7 @@
 	}
 }
 
-/**
- * list_remove()
- *
- * Remove item @a data from list_t pointed by @a list
- *
- * @param list - pointer to list_t
- * @param data - data to remove from @a list
- * @param free_data - if set and item was found it'll call xfree() on it.
- * @sa list_destroy() - to remove whole list
- *
- * @return 	 0 if item was founded, and was removed from list_t pointed by @a list<br>
- * 		-1 and errno set to EFAULT, if @a list was NULL<br>
- * 		-1 and errno set to ENOENT, if item was not found
- */
-
-int list_remove(list_t *list, void *data, int free_data)
-{
+int list_remove2(list_t *list, void *data, void (*func)(void *data)) {
 	list_t tmp, last = NULL;
 
 	if (!list) {
@@ -245,14 +229,33 @@
 		last->next = tmp->next;
 	}
 
-	if (free_data)
-		xfree(tmp->data);
+	if (func && tmp->data)
+		func(tmp->data);
 	xfree(tmp);
 
 	return 0;
 }
 
 /**
+ * list_remove()
+ *
+ * Remove item @a data from list_t pointed by @a list
+ *
+ * @param list - pointer to list_t
+ * @param data - data to remove from @a list
+ * @param free_data - if set and item was found it'll call xfree() on it.
+ * @sa list_destroy() - to remove whole list
+ *
+ * @return 	 0 if item was founded, and was removed from list_t pointed by @a list<br>
+ * 		-1 and errno set to EFAULT, if @a list was NULL<br>
+ * 		-1 and errno set to ENOENT, if item was not found
+ */
+
+int list_remove(list_t *list, void *data, int free_data) {
+	return list_remove2(list, data, free_data ? xfree : NULL);
+}
+
+/**
  * list_count()
  *
  * @param list - list_t
@@ -270,6 +273,23 @@
 	return count;
 }
 
+int list_destroy2(list_t list, void (*func)(void *)) {
+	list_t tmp;
+	
+	while (list) {
+		if (func && list->data)
+			func(list->data);
+
+		tmp = list->next;
+
+		xfree(list);
+
+		list = tmp;
+	}
+
+	return 0;
+}
+
 /**
  * list_destroy()
  *
@@ -290,22 +310,8 @@
  * @return 0
  */
 
-int list_destroy(list_t list, int free_data)
-{
-	list_t tmp;
-	
-	while (list) {
-		if (free_data)
-			xfree(list->data);
-
-		tmp = list->next;
-
-		xfree(list);
-
-		list = tmp;
-	}
-
-	return 0;
+int list_destroy(list_t list, int free_data) {
+	return list_destroy2(list, free_data ? xfree : NULL);
 }
 
 /*

Index: dynstuff.h
===================================================================
RCS file: /home/cvs/ekg2/ekg/dynstuff.h,v
diff -d -u -r1.28 -r1.29
--- dynstuff.h	1 Aug 2007 08:04:21 -0000	1.28
+++ dynstuff.h	22 Nov 2007 16:16:18 -0000	1.29
@@ -54,12 +54,22 @@
 #define LIST_ADD_COMPARE(x, type)			int x(const type data1, const type data2)
 #define LIST_ADD_SORTED(list, data, alloc_size, comp)	list_add_sorted(list, data, alloc_size, (void *) comp)
 
+#define LIST_REMOVE(list, data, func)			list_remove2(list, data, (void *) func)
+#define LIST_FREE_ITEM(x, type)				void x(type data)
+
+#define LIST_DESTROY(list, func)			list_destroy2(list, (void *) func)
+
 void *list_add(list_t *list, void *data, int alloc_size);
 void *list_add_beginning(list_t *list, void *data, int alloc_size);
 void *list_add_sorted(list_t *list, void *data, int alloc_size, int (*comparision)(void *, void *));
-int list_remove(list_t *list, void *data, int free_data);
+
 int list_count(list_t list);
+
+int list_remove(list_t *list, void *data, int free_data);
+int list_remove2(list_t *list, void *data, void (*func)(void *));
+
 int list_destroy(list_t list, int free_data);
+int list_destroy2(list_t list, void (*func)(void *));
 
 void list_cleanup(list_t *list);
 int list_remove_safe(list_t *list, void *data, int free_data);


Więcej informacji o liście dyskusyjnej ekg2-commit