On Wed, 9 Sep 2009, Enlightenment SVN wrote:

Modified: trunk/eina/src/include/eina_inlist.h
===================================================================
--- trunk/eina/src/include/eina_inlist.h        2009-09-09 10:44:25 UTC (rev 
42365)
+++ trunk/eina/src/include/eina_inlist.h        2009-09-09 14:05:31 UTC (rev 
42366)
@@ -52,7 +52,7 @@

#define EINA_INLIST Eina_Inlist __in_list
#define EINA_INLIST_GET(Inlist) (&((Inlist)->__in_list))
-#define EINA_INLIST_CONTAINER_GET(ptr, type) ((type *) ((Eina_Inlist *) ptr - 
offsetof(type, __in_list)))
+#define EINA_INLIST_CONTAINER_GET(ptr, type) ((type *) ((char *) ptr - 
offsetof(type, __in_list)))

Iirc, i have already said that offsetof does not exist on Windows CE

Also, I don't know if it is important or not, but on OpenSolaris with suncc, char is a signed type (-128...127)

Vincent


EAPI Eina_Inlist * eina_inlist_append(Eina_Inlist *in_list, Eina_Inlist 
*in_item) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT;
EAPI Eina_Inlist * eina_inlist_prepend(Eina_Inlist *in_list, Eina_Inlist 
*in_item) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT;
@@ -67,9 +67,14 @@
EAPI Eina_Iterator *eina_inlist_iterator_new(const Eina_Inlist *in_list) 
EINA_MALLOC EINA_WARN_UNUSED_RESULT;
EAPI Eina_Accessor *eina_inlist_accessor_new(const Eina_Inlist *in_list) 
EINA_MALLOC EINA_WARN_UNUSED_RESULT;

-#define EINA_INLIST_FOREACH(list, l) for (l = (void*)list; l; l = 
(void*)(l->__in_list.next))
-#define EINA_INLIST_REVERSE_FOREACH(list, l) for (l = (list ? (void*)(list->last) 
: NULL); l; l = (void*)(l->__in_list.prev))
+/* This two macros are helpers for the _FOREACH ones, don't use them */
+#define INLIST_OFFSET(ref) ((char*)&(ref)->__in_list - (char*)(ref))
+#define INLIST_CONTAINER(ref, ptr) (void*)((char*)(ptr) - INLIST_OFFSET(ref))

+#define EINA_INLIST_FOREACH(list, l) for (l = (list ? INLIST_CONTAINER(l, list) : 
NULL); l; l = (EINA_INLIST_GET(l)->next ? INLIST_CONTAINER(l, 
EINA_INLIST_GET(l)->next) : NULL))
+#define EINA_INLIST_REVERSE_FOREACH(list, l) for (l = (list ? INLIST_CONTAINER(l, 
list->last) : NULL); l; l = (EINA_INLIST_GET(l)->prev ? INLIST_CONTAINER(l, 
EINA_INLIST_GET(l)->prev) : NULL))
+
+
/**
 * @}
 */

Modified: trunk/eina/src/tests/eina_test_inlist.c
===================================================================
--- trunk/eina/src/tests/eina_test_inlist.c     2009-09-09 10:44:25 UTC (rev 
42365)
+++ trunk/eina/src/tests/eina_test_inlist.c     2009-09-09 14:05:31 UTC (rev 
42366)
@@ -30,8 +30,8 @@
typedef struct _Eina_Test_Inlist Eina_Test_Inlist;
struct _Eina_Test_Inlist
{
+   int i;
   EINA_INLIST;
-   int i;
};

static Eina_Test_Inlist*
@@ -63,13 +63,13 @@
   tmp = _eina_test_inlist_build(1664);
   lst = eina_inlist_append_relative(lst, EINA_INLIST_GET(tmp), lst);
   fail_if(!lst);
-   fail_if(((Eina_Test_Inlist*)lst)->i != 42);
+   fail_if(EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist)->i != 42);

   prev = tmp;
   tmp = _eina_test_inlist_build(3227);
   lst = eina_inlist_prepend_relative(lst, EINA_INLIST_GET(tmp), 
EINA_INLIST_GET(prev));
   fail_if(!lst);
-   fail_if(((Eina_Test_Inlist*)lst)->i != 42);
+   fail_if(EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist)->i != 42);

   lst = eina_inlist_remove(lst, EINA_INLIST_GET(tmp));

@@ -111,16 +111,17 @@
   fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
#endif

-   tmp = (Eina_Test_Inlist*) lst;
+   tmp = EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist);
   lst = eina_inlist_demote(lst, lst);
-   fail_if(lst == (Eina_Inlist*) tmp);
+   fail_if(EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist) == tmp);

   lst = eina_inlist_promote(lst, EINA_INLIST_GET(tmp));
-   fail_if(lst != (Eina_Inlist*) tmp);
+   fail_if(lst != EINA_INLIST_GET(tmp));

-   tmp = (Eina_Test_Inlist*) eina_inlist_find(lst, EINA_INLIST_GET(prev));
+   tmp = EINA_INLIST_CONTAINER_GET(eina_inlist_find(lst, 
EINA_INLIST_GET(prev)), Eina_Test_Inlist);
   lst = eina_inlist_remove(lst, EINA_INLIST_GET(tmp));
-   tmp = (Eina_Test_Inlist*) eina_inlist_find(lst, EINA_INLIST_GET(tmp));
+   prev = eina_inlist_find(lst, EINA_INLIST_GET(tmp));
+   tmp = prev ? EINA_INLIST_CONTAINER_GET(prev, Eina_Test_Inlist) : NULL;
   fail_if(tmp != NULL);

   while (lst)


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
enlightenment-svn mailing list
enlightenment-...@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-svn

--
Ce message a été vérifié par MailScanner
pour des virus ou des polluriels et rien de
suspect n'a été trouvé.
Message délivré par le serveur de messagerie de l'Université d'Evry.

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to