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
#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.