|
|
|
@ -229,21 +229,23 @@ struct { \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
\brief Inserts a list entry at the tail of a list.
|
|
|
|
|
\brief Appends a list entry to the tail of a list.
|
|
|
|
|
\param head This is a pointer to the list head structure
|
|
|
|
|
\param elm This is a pointer to the entry to be inserted.
|
|
|
|
|
\param elm This is a pointer to the entry to be appended.
|
|
|
|
|
\param field This is the name of the field (declared using AST_LIST_ENTRY())
|
|
|
|
|
used to link entries of this list together.
|
|
|
|
|
|
|
|
|
|
Note: The link field in the appended entry is \b not modified, so if it is
|
|
|
|
|
actually the head of a list itself, the entire list will be appended.
|
|
|
|
|
*/
|
|
|
|
|
#define AST_LIST_INSERT_TAIL(head, elm, field) do { \
|
|
|
|
|
typeof(elm) curelm = (head)->first; \
|
|
|
|
|
if (!curelm) { \
|
|
|
|
|
AST_LIST_INSERT_HEAD(head, elm, field); \
|
|
|
|
|
if (!(head)->first) { \
|
|
|
|
|
(head)->first = (elm); \
|
|
|
|
|
} else { \
|
|
|
|
|
while (curelm->field.next!=NULL) { \
|
|
|
|
|
typeof(elm) curelm = (head)->first; \
|
|
|
|
|
while (curelm->field.next != NULL) \
|
|
|
|
|
curelm = curelm->field.next; \
|
|
|
|
|
} \
|
|
|
|
|
AST_LIST_INSERT_AFTER(curelm, elm, field); \
|
|
|
|
|
curelm->field.next = (elm); \
|
|
|
|
|
} \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
@ -272,14 +274,13 @@ struct { \
|
|
|
|
|
*/
|
|
|
|
|
#define AST_LIST_REMOVE(head, elm, field) do { \
|
|
|
|
|
if ((head)->first == (elm)) { \
|
|
|
|
|
AST_LIST_REMOVE_HEAD((head), field); \
|
|
|
|
|
(head)->first = (elm)->field.next; \
|
|
|
|
|
} \
|
|
|
|
|
else { \
|
|
|
|
|
typeof(elm) curelm = (head)->first; \
|
|
|
|
|
while (curelm->field.next != (elm)) \
|
|
|
|
|
curelm = curelm->field.next; \
|
|
|
|
|
curelm->field.next = \
|
|
|
|
|
curelm->field.next->field.next; \
|
|
|
|
|
curelm->field.next = (elm)->field.next; \
|
|
|
|
|
} \
|
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|