eina: Fix EINA_INLIST_FOREACH_SAFE macro
authorlucas <lucas>
Tue, 4 Sep 2012 22:20:25 +0000 (22:20 +0000)
committerlucas <lucas@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 4 Sep 2012 22:20:25 +0000 (22:20 +0000)
EINA_INLIST_FOREACH_SAFE is very broken and it only works by luck, depending on
the __inlist field being the first one in the struct. Until now.

This commit makes the following snippet to work:

#include <Eina.h>

typedef struct _data {
   char *name;
   EINA_INLIST;
} data;

int
main()
{
   Eina_Inlist *inlist = NULL, *inlist_safe;
   data *reg, *d;

   reg = malloc(sizeof(data));
   inlist = eina_inlist_append(inlist, EINA_INLIST_GET(reg));

   EINA_INLIST_FOREACH_SAFE(inlist, inlist_safe, d)
     {
printf("%p\n", d);
inlist = eina_inlist_remove(inlist, EINA_INLIST_GET(d));
free(d);
     }

   return 0;
}

Patch-by: José Roberto de Souza <zehortigoza@profusion.mobi>
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@76150 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/include/eina_inlist.h

index e4de689..c1c94df 100644 (file)
@@ -803,7 +803,7 @@ EAPI Eina_Inlist *eina_inlist_sort(Eina_Inlist *head, Eina_Compare_Cb func);
 #define EINA_INLIST_FOREACH_SAFE(list, list2, l) \
    for (l = (list ? _EINA_INLIST_CONTAINER(l, list) : NULL), list2 = l ? ((EINA_INLIST_GET(l) ? EINA_INLIST_GET(l)->next : NULL)) : NULL; \
         l; \
-        l = _EINA_INLIST_CONTAINER(l, list2), list2 = list2 ? list2->next : NULL)
+        l = list2 ? _EINA_INLIST_CONTAINER(l, list2) : NULL, list2 = list2 ? list2->next : NULL)
 /**
  * @def EINA_INLIST_REVERSE_FOREACH
  * @param list The list to be reversed.