eina: Fix EINA_INLIST_FOREACH_SAFE macro

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>



SVN revision: 76150
This commit is contained in:
Lucas De Marchi 2012-09-04 22:20:25 +00:00
parent 7457f675ff
commit 45a791dfa1
1 changed files with 1 additions and 1 deletions

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