* EINA_LIST_FOREACH(list, l, data)
* free(data);
* @endcode
+ *
+ * @warning do not delete list nodes, specially the current node, while
+ * iterating. If you wish to do so, use EINA_LIST_FOREACH_SAFE().
*/
#define EINA_LIST_FOREACH(list, l, data) for (l = list, data = eina_list_data_get(l); l; l = eina_list_next(l), data = eina_list_data_get(l))
+/**
+ * @def EINA_LIST_FOREACH_SAFE
+ * @brief Macro to iterate over a list easily, supporting deletion.
+ *
+ * @param list The list to iterate over.
+ * @param l A list that is used as loop index.
+ * @param l_next A second list that is used as loop next index.
+ * @param data The data.
+ *
+ * This macro allow the iteration over @p list in an easy way. It
+ * iterates from the first element to the last one. @p data is the
+ * data of each element of the list. @p l is an #Eina_List that is
+ * used as counter.
+ *
+ * This is the safe version, which stores the next pointer in @p l_next
+ * before proceeding, so deletion of @b current node is safe. If you wish
+ * to remove anything else, remember to set @p l_next accordingly.
+ *
+ * This macro can be used for freeing list nodes, like in
+ * the following example:
+ *
+ * @code
+ * Eina_List *list;
+ * Eina_List *l;
+ * Eina_List *l_next;
+ * char *data;
+ *
+ * // list is already filled,
+ * // its elements are just duplicated strings,
+ * // EINA_LIST_FOREACH_SAFE will be used to free elements that match "key".
+ *
+ * EINA_LIST_FOREACH_SAFE(list, l, l_next, data)
+ * if (strcmp(data, "key") == 0) {
+ * free(data);
+ * list = eina_list_remove_list(list, l);
+ * }
+ * @endcode
+ */
+#define EINA_LIST_FOREACH_SAFE(list, l, l_next, data) for (l = list, l_next = eina_list_next(l), data = eina_list_data_get(l); l; l = l_next, l_next = eina_list_next(l), data = eina_list_data_get(l))
+
+
#include "eina_inline_list.x"
/**