From a969b7096fc8e8f2519851ab5023da3854191287 Mon Sep 17 00:00:00 2001 From: armink Date: Tue, 11 Sep 2018 20:05:08 +0800 Subject: [PATCH] [slist] Add rt_slist_tail and rt_slist_tail_entry for slist. --- include/rtservice.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/rtservice.h b/include/rtservice.h index 0bfa424338..77a21d1f97 100644 --- a/include/rtservice.h +++ b/include/rtservice.h @@ -253,6 +253,13 @@ rt_inline rt_slist_t *rt_slist_first(rt_slist_t *l) return l->next; } +rt_inline rt_slist_t *rt_slist_tail(rt_slist_t *l) +{ + while (l->next) l = l->next; + + return l; +} + rt_inline rt_slist_t *rt_slist_next(rt_slist_t *n) { return n->next; @@ -302,6 +309,17 @@ rt_inline int rt_slist_isempty(rt_slist_t *l) #define rt_slist_first_entry(ptr, type, member) \ rt_slist_entry((ptr)->next, type, member) +/** + * rt_slist_tail_entry - get the tail element from a slist + * @ptr: the slist head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the slist_struct within the struct. + * + * Note, that slist is expected to be not empty. + */ +#define rt_slist_tail_entry(ptr, type, member) \ + rt_slist_entry(rt_slist_tail(ptr), type, member) + /*@}*/ #ifdef __cplusplus