xref: /OK3568_Linux_fs/kernel/tools/firewire/list.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun struct list {
3*4882a593Smuzhiyun 	struct list *next, *prev;
4*4882a593Smuzhiyun };
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun static inline void
list_init(struct list * list)7*4882a593Smuzhiyun list_init(struct list *list)
8*4882a593Smuzhiyun {
9*4882a593Smuzhiyun 	list->next = list;
10*4882a593Smuzhiyun 	list->prev = list;
11*4882a593Smuzhiyun }
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun static inline int
list_empty(struct list * list)14*4882a593Smuzhiyun list_empty(struct list *list)
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun 	return list->next == list;
17*4882a593Smuzhiyun }
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun static inline void
list_insert(struct list * link,struct list * new_link)20*4882a593Smuzhiyun list_insert(struct list *link, struct list *new_link)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun 	new_link->prev		= link->prev;
23*4882a593Smuzhiyun 	new_link->next		= link;
24*4882a593Smuzhiyun 	new_link->prev->next	= new_link;
25*4882a593Smuzhiyun 	new_link->next->prev	= new_link;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun static inline void
list_append(struct list * list,struct list * new_link)29*4882a593Smuzhiyun list_append(struct list *list, struct list *new_link)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun 	list_insert((struct list *)list, new_link);
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun static inline void
list_prepend(struct list * list,struct list * new_link)35*4882a593Smuzhiyun list_prepend(struct list *list, struct list *new_link)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun 	list_insert(list->next, new_link);
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun static inline void
list_remove(struct list * link)41*4882a593Smuzhiyun list_remove(struct list *link)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	link->prev->next = link->next;
44*4882a593Smuzhiyun 	link->next->prev = link->prev;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define list_entry(link, type, member) \
48*4882a593Smuzhiyun 	((type *)((char *)(link)-(unsigned long)(&((type *)0)->member)))
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define list_head(list, type, member)		\
51*4882a593Smuzhiyun 	list_entry((list)->next, type, member)
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define list_tail(list, type, member)		\
54*4882a593Smuzhiyun 	list_entry((list)->prev, type, member)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define list_next(elm, member)					\
57*4882a593Smuzhiyun 	list_entry((elm)->member.next, typeof(*elm), member)
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define list_for_each_entry(pos, list, member)			\
60*4882a593Smuzhiyun 	for (pos = list_head(list, typeof(*pos), member);	\
61*4882a593Smuzhiyun 	     &pos->member != (list);				\
62*4882a593Smuzhiyun 	     pos = list_next(pos, member))
63*4882a593Smuzhiyun 
64