[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