mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
67 lines
2.0 KiB
C
67 lines
2.0 KiB
C
|
#pragma once
|
||
|
|
||
|
/* Implementation from BSD headers*/
|
||
|
#define QMD_SAVELINK(name, link) void **name = (void *)&(link)
|
||
|
#define TRASHIT(x) do {(x) = (void *)-1;} while (0)
|
||
|
#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
|
||
|
|
||
|
#define STAILQ_FIRST(head) ((head)->stqh_first)
|
||
|
|
||
|
#define STAILQ_HEAD(name, type) \
|
||
|
struct name { \
|
||
|
struct type *stqh_first;/* first element */ \
|
||
|
struct type **stqh_last;/* addr of last next element */ \
|
||
|
}
|
||
|
|
||
|
#define STAILQ_ENTRY(type) \
|
||
|
struct { \
|
||
|
struct type *stqe_next; /* next element */ \
|
||
|
}
|
||
|
|
||
|
#define STAILQ_INSERT_TAIL(head, elm, field) do { \
|
||
|
STAILQ_NEXT((elm), field) = NULL; \
|
||
|
*(head)->stqh_last = (elm); \
|
||
|
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||
|
} while (0)
|
||
|
|
||
|
#define STAILQ_INIT(head) do { \
|
||
|
STAILQ_FIRST((head)) = NULL; \
|
||
|
(head)->stqh_last = &STAILQ_FIRST((head)); \
|
||
|
} while (0)
|
||
|
|
||
|
#define STAILQ_FOREACH(var, head, field) \
|
||
|
for((var) = STAILQ_FIRST((head)); \
|
||
|
(var); \
|
||
|
(var) = STAILQ_NEXT((var), field))
|
||
|
|
||
|
#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \
|
||
|
for ((var) = STAILQ_FIRST((head)); \
|
||
|
(var) && ((tvar) = STAILQ_NEXT((var), field), 1); \
|
||
|
(var) = (tvar))
|
||
|
|
||
|
#define STAILQ_REMOVE_AFTER(head, elm, field) do { \
|
||
|
if ((STAILQ_NEXT(elm, field) = \
|
||
|
STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \
|
||
|
(head)->stqh_last = &STAILQ_NEXT((elm), field); \
|
||
|
} while (0)
|
||
|
|
||
|
#define STAILQ_REMOVE_HEAD(head, field) do { \
|
||
|
if ((STAILQ_FIRST((head)) = \
|
||
|
STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \
|
||
|
(head)->stqh_last = &STAILQ_FIRST((head)); \
|
||
|
} while (0)
|
||
|
|
||
|
#define STAILQ_REMOVE(head, elm, type, field) do { \
|
||
|
QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \
|
||
|
if (STAILQ_FIRST((head)) == (elm)) { \
|
||
|
STAILQ_REMOVE_HEAD((head), field); \
|
||
|
} \
|
||
|
else { \
|
||
|
struct type *curelm = STAILQ_FIRST((head)); \
|
||
|
while (STAILQ_NEXT(curelm, field) != (elm)) \
|
||
|
curelm = STAILQ_NEXT(curelm, field); \
|
||
|
STAILQ_REMOVE_AFTER(head, curelm, field); \
|
||
|
} \
|
||
|
TRASHIT(*oldnext); \
|
||
|
} while (0)
|