[ekg2-commit] r3902 - trunk/ekg: trunk/ekg/dynstuff.c trunk/ekg/dynstuff.h
SVN commit
svn w toxygen.net
Sob, 15 Mar 2008, 09:28:19 CET
Author: peres
Date: 2008-03-15 09:28:19 +0100 (Sat, 15 Mar 2008)
New Revision: 3902
Modified:
trunk/ekg/dynstuff.c
trunk/ekg/dynstuff.h
Log:
For all those, who hate stupid strict-aliasing gcc warnings.
We now use void* everywhere, and fsckin casting macro to avoid useless
warnings about recasting structs.
Are you happy now?!
Modified: trunk/ekg/dynstuff.c
===================================================================
--- trunk/ekg/dynstuff.c 2008-03-14 18:54:13 UTC (rev 3901)
+++ trunk/ekg/dynstuff.c 2008-03-15 08:28:19 UTC (rev 3902)
@@ -131,65 +131,6 @@
return list_add_sorted(list, data, NULL);
}
-void *list_add_sorted3(list_t *list, list_t new, int (*comparision)(void *, void *))
-{
- list_t tmp;
-
- if (!list) {
- errno = EFAULT;
- return NULL;
- }
-
- new->next = NULL;
- if (!(tmp = *list)) {
- *list = new;
- } else {
- if (!comparision) {
- while (tmp->next)
- tmp = tmp->next;
- tmp->next = new;
- } else {
- list_t prev = NULL;
-
- while (comparision(new, tmp) > 0) {
- prev = tmp;
- tmp = tmp->next;
- if (!tmp)
- break;
- }
-
- if (!prev) {
- new->next = *list;
- *list = new;
- } else {
- prev->next = new;
- new->next = tmp;
- }
- }
- }
-
- return new;
-}
-
-void *list_add_beginning3(list_t *list, list_t new)
-{
- if (!list) {
- errno = EFAULT;
- return NULL;
- }
-
- new->next = *list;
- *list = new;
-
- return new;
-
-}
-
-void *list_add3(list_t *list, list_t new)
-{
- return list_add_sorted3(list, new, NULL);
-}
-
/**
* list_remove_safe()
*
@@ -287,60 +228,6 @@
return 0;
}
-list_t list_remove3(list_t *list, list_t elem, void (*func)(list_t data)) {
- list_t tmp, last = NULL;
- void *ret = NULL;
-
- if (!list) {
- errno = EFAULT;
- return ret;
- }
-
- tmp = *list;
- if (tmp && tmp == elem) {
- *list = ret = tmp->next;
- } else {
- for (; tmp && tmp != elem; tmp = tmp->next)
- last = tmp;
- if (!tmp) {
- errno = ENOENT;
- return ret;
- }
- last->next = ret = tmp->next;
- }
-
- if (func)
- func(tmp);
- xfree(tmp);
-
- return ret;
-}
-
-list_t list_unlink3(list_t *list, list_t elem) {
- list_t tmp, last = NULL;
- void *ret = NULL;
-
- if (!list) {
- errno = EFAULT;
- return ret;
- }
-
- tmp = *list;
- if (tmp && tmp == elem) {
- *list = ret = tmp->next;
- } else {
- for (; tmp && tmp != elem; tmp = tmp->next)
- last = tmp;
- if (!tmp) {
- errno = ENOENT;
- return ret;
- }
- last->next = ret = tmp->next;
- }
-
- return ret;
-}
-
/**
* list_remove()
*
@@ -385,18 +272,6 @@
return NULL;
}
-void *list_get_nth3(list_t list, int id) {
- while (list) {
- if ((--id) == 0)
- return list;
-
- list = list->next;
- }
-
- errno = ENOENT;
- return NULL;
-}
-
void list_resort(list_t *list, int (*comparision)(void *, void *)) {
list_t tmplist = NULL;
list_t l = *list;
@@ -414,21 +289,6 @@
*list = tmplist;
}
-void list_resort3(list_t *list, int (*comparision)(void *, void *)) {
- list_t tmplist = NULL;
- list_t l = *list;
-
- while (l) {
- list_t cur = l;
-
- l = l->next;
-
- list_add_sorted3(&tmplist, cur, comparision);
- }
-
- *list = tmplist;
-}
-
/**
* list_count()
*
@@ -464,23 +324,6 @@
return 0;
}
-int list_destroy3(list_t list, void (*func)(void *)) {
- list_t tmp;
-
- while (list) {
- if (func)
- func(list);
-
- tmp = list->next;
-
- xfree(list);
-
- list = tmp;
- }
-
- return 0;
-}
-
/**
* list_destroy()
*
@@ -505,7 +348,177 @@
return list_destroy2(list, free_data ? xfree : NULL);
}
+/** lists3 **/
+#define NEXT(a) *((void **) a) /* like l->next */
+#define FIRST(a) *((void **) a) /* like *l with list_t* */
+
+void *list_add_sorted3(void *list, void *new, int (*comparison)(void *, void *))
+{
+ void *tmp;
+
+ if (!list) {
+ errno = EFAULT;
+ return NULL;
+ }
+
+ NEXT(new) = NULL;
+ if (!(tmp = FIRST(list))) {
+ FIRST(list) = new;
+ } else {
+ if (!comparison) {
+ while (NEXT(tmp))
+ tmp = NEXT(tmp);
+ NEXT(tmp) = new;
+ } else {
+ void *prev = NULL;
+
+ while (comparison(new, tmp) > 0) {
+ prev = tmp;
+ tmp = NEXT(tmp);
+ if (!tmp)
+ break;
+ }
+
+ if (!prev) {
+ NEXT(new) = FIRST(list);
+ FIRST(list) = new;
+ } else {
+ NEXT(prev) = new;
+ NEXT(new) = tmp;
+ }
+ }
+ }
+
+ return new;
+}
+
+void *list_add_beginning3(void *list, void *new)
+{
+ if (!list) {
+ errno = EFAULT;
+ return NULL;
+ }
+
+ NEXT(new) = FIRST(list);
+ FIRST(list) = new;
+
+ return new;
+
+}
+
+void *list_add3(void *list, void *new)
+{
+ return list_add_sorted3(list, new, NULL);
+}
+
+void *list_remove3(void *list, void *elem, void (*func)(list_t data)) {
+ void *tmp, *last = NULL;
+ void *ret = NULL;
+
+ if (!list) {
+ errno = EFAULT;
+ return ret;
+ }
+
+ tmp = FIRST(list);
+ if (tmp && tmp == elem) {
+ FIRST(list) = ret = NEXT(tmp);
+ } else {
+ for (; tmp && tmp != elem; tmp = NEXT(tmp))
+ last = tmp;
+ if (!tmp) {
+ errno = ENOENT;
+ return ret;
+ }
+ NEXT(last) = ret = NEXT(tmp);
+ }
+
+ if (func)
+ func(tmp);
+ xfree(tmp);
+
+ return ret;
+}
+
+void *list_unlink3(void *list, void *elem) {
+ void *tmp, *last = NULL;
+ void *ret = NULL;
+
+ if (!list) {
+ errno = EFAULT;
+ return ret;
+ }
+
+ tmp = FIRST(list);
+ if (tmp && tmp == elem) {
+ FIRST(list) = ret = NEXT(tmp);
+ } else {
+ for (; tmp && tmp != elem; tmp = NEXT(tmp))
+ last = tmp;
+ if (!tmp) {
+ errno = ENOENT;
+ return ret;
+ }
+ NEXT(last) = ret = NEXT(tmp);
+ }
+
+ return ret;
+}
+
+int list_count3(void *first) {
+ int count = 0;
+
+ for (; first; first = NEXT(first))
+ count++;
+
+ return count;
+}
+
+void *list_get_nth3(void *first, int id) {
+ while (first) {
+ if ((--id) == 0)
+ return first;
+
+ first = NEXT(first);
+ }
+
+ errno = ENOENT;
+ return NULL;
+}
+
+void list_resort3(void *list, int (*comparision)(void *, void *)) {
+ void *tmplist = NULL;
+ void *l = FIRST(list);
+
+ while (l) {
+ void *cur = l;
+
+ l = NEXT(l);
+
+ list_add_sorted3(&tmplist, cur, comparision);
+ }
+
+ FIRST(list) = tmplist;
+}
+
+int list_destroy3(void *first, void (*func)(void *)) {
+ void *tmp;
+
+ while (first) {
+ if (func)
+ func(first);
+
+ tmp = NEXT(first);
+
+ xfree(first);
+
+ first = tmp;
+ }
+
+ return 0;
+}
+
/* list_t compatibility toolkit ( ; */
/* helper handler for using list_remove3() w/ list_t
Modified: trunk/ekg/dynstuff.h
===================================================================
--- trunk/ekg/dynstuff.h 2008-03-14 18:54:13 UTC (rev 3901)
+++ trunk/ekg/dynstuff.h 2008-03-15 08:28:19 UTC (rev 3902)
@@ -74,50 +74,60 @@
#ifndef EKG2_WIN32_NOFUNCTION
#define LIST_ADD_COMPARE(x, type) int x(const type data1, const type data2)
#define LIST_ADD_SORTED(list, data, comp) list_add_sorted(list, data, (void *) comp)
-#define LIST_ADD_SORTED2(list, data, comp) list_add_sorted3((list_t *) list, (list_t) data, (void *) comp)
-#define LIST_ADD_BEGINNING2(list, data) list_add_beginning3((list_t *) list, (list_t) data)
-#define LIST_ADD2(list, data) list_add3((list_t *) list, (list_t) data)
-#define LIST_COUNT2(list) list_count((list_t) list)
-#define LIST_GET_NTH2(list, id) list_get_nth3((list_t) list, id)
#define LIST_RESORT(list, comp) list_resort(list, (void *) comp)
-#define LIST_RESORT2(list, comp) list_resort3((list_t *) list, (void *) comp)
-
#define LIST_REMOVE(list, data, func) list_remove2(list, data, (void *) func)
-#define LIST_REMOVE2(list, elem, func) list_remove3((list_t *) list, (list_t) elem, (void *) func)
-#define LIST_UNLINK2(list, elem) list_unlink3((list_t *) list, (list_t) elem)
#define LIST_FREE_ITEM(x, type) void x(type data)
#define LIST_DESTROY(list, func) list_destroy2(list, (void *) func)
-#define LIST_DESTROY2(list, func) list_destroy3((list_t) list, (void *) func)
void *list_add(list_t *list, void *data);
void *list_add_beginning(list_t *list, void *data);
void *list_add_sorted(list_t *list, void *data, int (*comparision)(void *, void *));
-void *list_add3(list_t *list, list_t new);
-void *list_add_beginning3(list_t *list, list_t new);
-void *list_add_sorted3(list_t *list, list_t new, int (*comparision)(void *, void *));
-
-
int list_count(list_t list);
void *list_get_nth(list_t list, int id);
-void *list_get_nth3(list_t list, int id);
void list_resort(list_t *list, int (*comparision)(void *, void *));
-void list_resort3(list_t *list, int (*comparision)(void *, void *));
int list_remove(list_t *list, void *data, int free_data);
int list_remove2(list_t *list, void *data, void (*func)(void *));
-list_t list_remove3(list_t *list, list_t elem, void (*func)(list_t));
-list_t list_unlink3(list_t *list, list_t elem);
int list_destroy(list_t list, int free_data);
int list_destroy2(list_t list, void (*func)(void *));
-int list_destroy3(list_t list, void (*func)(void *));
void list_cleanup(list_t *list);
int list_remove_safe(list_t *list, void *data, int free_data);
+/** lists3 **/
+
+#define LIST_ADD_SORTED2(list, data, comp) list_add_sorted3(list, data, (void *) comp)
+#define LIST_ADD_BEGINNING2(list, data) list_add_beginning3(list, data)
+#define LIST_ADD2(list, data) list_add3(list, data)
+
+#define LIST_COUNT2(list) list_count3(list)
+#define LIST_GET_NTH2(first, id) list_get_nth3(first, id)
+#define LIST_RESORT2(list, comp) list_resort3(list, (void *) comp)
+
+#define LIST_REMOVE2(list, elem, func) list_remove3(list, elem, (void *) func)
+#define LIST_UNLINK2(list, elem) list_unlink3(list, elem)
+#define LIST_DESTROY2(first, func) list_destroy3(first, (void *) func)
+
+/* This is pretty fscked up, but some ppl like no-stupid-warnings more than readable types,
+ * so here we use void* for almost everything; *list shall be pointer to pointer to var
+ * pointing on first elem (like list_t*), *first only ptr to first element (like list_t). */
+
+void *list_add3(void *list, void *new);
+void *list_add_beginning3(void *list, void *new);
+void *list_add_sorted3(void *list, void *new, int (*comparison)(void *, void *));
+
+int list_count3(void *first);
+void *list_get_nth3(void *first, int id);
+void list_resort3(void *list, int (*comparison)(void *, void *));
+
+void *list_remove3(void *list, void *elem, void (*func)(list_t));
+void *list_unlink3(void *list, void *elem);
+int list_destroy3(void *first, void (*func)(void *));
+
LIST_FREE_ITEM(list_t_free_item, list_t);
list_t list_t_new(void *data);
#endif
Więcej informacji o liście dyskusyjnej ekg2-commit