#ifndef ZLIST_H #define ZLIST_H #include #include #ifdef __cplusplus extern "C" { #endif #ifndef WARN_UNUSED_RESULT #define WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) #endif #pragma GCC poison new_zlist free_zlist remove_zlist_entry #ifndef append_zlist_entry #define append_zlist_entry(X, Y) zlist_append(X, Y) #endif #ifndef prepend_zlist_entry #define prepend_zlist_entry(X, Y) zlist_prepend(X, Y) #endif #ifndef find_zlist_head #define find_zlist_head(X) zlist_head(X) #endif #ifndef find_zlist_tail #define find_zlist_tail(X) zlist_tail(X) #endif #ifndef insert_zlist_entry #define insert_zlist_entry(X, Y, Z) zlist_insert(X, Y, Z) #endif /** * Iterate over a list, allowing data interaction during each loop. * * @param list The list to iterate over, starting at znode @p list * @param l A zlist pointer to use as an iterator * @param data The pointer that zlist znode data will be set to * * @ingroup zlist */ #define ZLIST_FOR(list, l, data) \ for (l = list, data = zlist_data_get(l); l; l = zlist_next(l), data = zlist_data_get(l)) /** * Iterate over a list, allowing data interaction during each loop but storing an extra pointer to allow for node deletion. * * @param list The list to iterate over, starting at znode @p list * @param l A zlist pointer to use as an iterator * @param n The next list node after l; do not free this. * @param data The pointer that zlist znode data will be set to * * @ingroup zlist */ #define ZLIST_FOR_SAFE(list, l, n, data) \ for (l = list, n = zlist_next(l), data = zlist_data_get(l); l; l = n, n = zlist_next(l), data = zlist_data_get(l)) /** * Iterate over a list backwards, allowing data interaction during each loop. * * @param list The list to iterate over, starting at znode @p list * @param l A zlist pointer to use as an iterator * @param data The pointer that zlist znode data will be set to * * @ingroup zlist */ #define ZLIST_FOR_REVERSE(list, l, data) \ for (l = list, data = zlist_data_get(l); l; l = zlist_prev(l), data = zlist_data_get(l)) /** * Iterate over a list, unlinking nodes and allowing data interaction during each loop. * * @param list The list to iterate over, starting at znode @p list * @param data The pointer that zlist znode data will be set to * * @ingroup zlist */ #define ZLIST_FREE(list, data) \ for (data = zlist_data_get(list); list; list = zlist_list_remove(list), data = zlist_data_get(list)) typedef int zlist_magic; struct _zlist_data; typedef struct _zlist_data zlist_data; struct _zlist { zlist_data *zdata; struct _zlist *prev; struct _zlist *next; void *data; }; typedef struct _zlist zlist; int zlist_init(); int zlist_shutdown(); void *zlist_data_get(const zlist *znode) WARN_UNUSED_RESULT; zlist *zlist_next(const zlist *znode) WARN_UNUSED_RESULT; zlist *zlist_prev(const zlist *znode) WARN_UNUSED_RESULT; zlist *zlist_append(zlist *list, void *data) WARN_UNUSED_RESULT; zlist *zlist_prepend(zlist *list, void *data) WARN_UNUSED_RESULT; zlist *zlist_head(const zlist *znode) WARN_UNUSED_RESULT; zlist *zlist_tail(const zlist *znode) WARN_UNUSED_RESULT; zlist *zlist_data_remove(zlist *list, void *data) WARN_UNUSED_RESULT; zlist *zlist_list_remove(zlist *entry) WARN_UNUSED_RESULT; zlist *zlist_insert(zlist *prev, zlist *next, void *data) WARN_UNUSED_RESULT; void *zlist_data_find(zlist *list, void *data); zlist *zlist_list_find(zlist *list, zlist *znode); zlist *zlist_Nth(zlist *list, int list_number); int zlist_count(zlist *list); void zlist_free(zlist *znode); #ifdef __cplusplus } #endif #endif // ZLIST_H