sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
list.h
Go to the documentation of this file.
1
5#ifndef LIST_H_
6#define LIST_H_
7
8#include <stddef.h>
9
10#define container_of(ptr, type, member) ({ \
11 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
12 (type *)( (char *)__mptr - offsetof(type,member) ); })
13
15{
16 struct list_head *next, *prev;
17};
18
19static inline void list_init(struct list_head *list)
20{
21 list->next = list;
22 list->prev = list;
23}
24
25static inline void list_insert(struct list_head *list, struct list_head *node)
26{
27 struct list_head *prev = list->prev;
28
29 node->next = list;
30 node->prev = list->prev;
31 list->prev = node;
32 prev->next = node;
33}
34
35static inline int list_empty(struct list_head *list)
36{
37 return list == list->next;
38}
39
40static inline void list_join(struct list_head *prev, struct list_head *next)
41{
42 prev->next = next;
43 next->prev = prev;
44}
45
46static inline void list_remove(struct list_head *node)
47{
48 list_join(node->prev, node->next);
49 node->next = NULL;
50 node->prev = NULL;
51}
52
53static inline int list_node_is_last(struct list_head *list)
54{
55 return list->next == list->prev;
56}
57
58static inline int list_same_node(struct list_head *node1, struct list_head *node2)
59{
60 return node1 == node2;
61}
62
63#define list_first_entry(ptr, type, member) \
64 container_of((ptr)->next, type, member)
65
66#define list_next_entry(pos, member) \
67 container_of((pos)->member.next, typeof(*(pos)), member)
68
69#define list_entry_is_head(pos, head, member) \
70 (&(pos)->member == (head))
71
72#define list_for_each_it(var, list) \
73 for ((var) = (list)->next; \
74 !list_same_node((var), list); \
75 (var) = (var)->next)
76
77#define list_for_each(var, head, member) \
78 for ((var) = list_first_entry(head, typeof(*(var)), member); \
79 !list_entry_is_head(var, head, member); \
80 (var) = list_next_entry(var, member))
81
82#define list_for_each_safe_it(var, n, list) \
83 for ((var) = (list)->next, (n) = (var)->next; \
84 !list_same_node((var), list); \
85 (var) = (n), (n) = (var)->next)
86
87#define list_for_each_safe(var, head, member) \
88 typeof((var)) var##__safe; \
89 for ((var) = list_first_entry(head, typeof(*(var)), member), \
90 (var##__safe) = list_next_entry(var, member); \
91 !list_entry_is_head(var, head, member); \
92 (var) = (var##__safe), (var##__safe) = list_next_entry(var##__safe, member))
93
94static inline int list_length(struct list_head *list)
95{
96 struct list_head *i;
97 int len = 0;
98
99 list_for_each_it(i, list)
100 {
101 len++;
102 }
103
104 return len;
105}
106
107
108#endif // LIST_H_