[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