1
2
3
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
44
45
46
47
48
49
51
52
53
58
59
60
64
65
66
72
73
74
79
80
81
85
86
87
91
92
93
100
101
102
107
108
109
110
117
118
119
124
125
126
127
129
130
132
133
135
136
138
139
141
142
144
145
147
148
150
151
154
155
159
160
163
164
167
168
172
173
176
177
181
182
185
186
187
188
191
192
193
197
198
199
203
204
205
210
211
212
217
218
219
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
258
259
260
264
265
266
271
272
273
278
279
283
284
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
320
321
322
326
327
328
329
330
331
332
333
334
337
338
339
340
341
345
346
347
348
355
359
360
364
373
374
375
376
/* ... */
/* ... */
#ifndef OPENOCD_HELPER_LIST_H
#define OPENOCD_HELPER_LIST_H
#include <stddef.h>
struct list_head {
struct list_head *next;
struct list_head *prev;
...};
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)...
static inline void
INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}{ ... }
static inline int
list_empty(const struct list_head *head)
{
return (head->next == head);
}{ ... }
static inline int
list_empty_careful(const struct list_head *head)
{
struct list_head *next = head->next;
return ((next == head) && (next == head->prev));
}{ ... }
static inline void
__list_del(struct list_head *prev, struct list_head *next)
{
next->prev = prev;
prev->next = next;
}{ ... }
static inline void
__list_del_entry(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
}{ ... }
static inline void
list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
}{ ... }
static inline void
list_replace(struct list_head *old, struct list_head *new)
{
new->next = old->next;
new->next->prev = new;
new->prev = old->prev;
new->prev->next = new;
}{ ... }
static inline void
list_replace_init(struct list_head *old, struct list_head *new)
{
list_replace(old, new);
INIT_LIST_HEAD(old);
}{ ... }
static inline void
linux_list_add(struct list_head *new, struct list_head *prev,
struct list_head *next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}{ ... }
static inline void
list_del_init(struct list_head *entry)
{
list_del(entry);
INIT_LIST_HEAD(entry);
}{ ... }
#define list_entry(ptr, type, field) container_of(ptr, type, field)
#define list_first_entry(ptr, type, member) \
list_entry((ptr)->next, type, member)...
#define list_last_entry(ptr, type, member) \
list_entry((ptr)->prev, type, member)...
#define list_first_entry_or_null(ptr, type, member) \
(!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL)...
#define list_next_entry(ptr, member) \
list_entry(((ptr)->member.next), typeof(*(ptr)), member)...
#define list_safe_reset_next(ptr, n, member) \
(n) = list_next_entry(ptr, member)...
#define list_prev_entry(ptr, member) \
list_entry(((ptr)->member.prev), typeof(*(ptr)), member)...
#define list_for_each(p, head) \
for (p = (head)->next; p != (head); p = (p)->next)...
#define list_for_each_safe(p, n, head) \
for (p = (head)->next, n = (p)->next; p != (head); p = n, n = (p)->next)...
#define list_for_each_entry(p, h, field) \
for (p = list_entry((h)->next, typeof(*p), field); &(p)->field != (h); \
p = list_entry((p)->field.next, typeof(*p), field))...
#define list_for_each_entry_safe(p, n, h, field) \
for (p = list_entry((h)->next, typeof(*p), field), \
n = list_entry((p)->field.next, typeof(*p), field); &(p)->field != (h);\
p = n, n = list_entry(n->field.next, typeof(*n), field))...
#define list_for_each_entry_from(p, h, field) \
for ( ; &(p)->field != (h); \
p = list_entry((p)->field.next, typeof(*p), field))...
#define list_for_each_entry_continue(p, h, field) \
for (p = list_next_entry((p), field); &(p)->field != (h); \
p = list_next_entry((p), field))...
#define list_for_each_entry_safe_from(pos, n, head, member) \
for (n = list_entry((pos)->member.next, typeof(*pos), member); \
&(pos)->member != (head); \
pos = n, n = list_entry(n->member.next, typeof(*n), member))...
#define list_for_each_entry_reverse(p, h, field) \
for (p = list_entry((h)->prev, typeof(*p), field); &(p)->field != (h); \
p = list_entry((p)->field.prev, typeof(*p), field))...
#define list_for_each_entry_safe_reverse(p, n, h, field) \
for (p = list_entry((h)->prev, typeof(*p), field), \
n = list_entry((p)->field.prev, typeof(*p), field); &(p)->field != (h); \
p = n, n = list_entry(n->field.prev, typeof(*n), field))...
#define list_for_each_entry_continue_reverse(p, h, field) \
for (p = list_entry((p)->field.prev, typeof(*p), field); &(p)->field != (h); \
p = list_entry((p)->field.prev, typeof(*p), field))...
#define list_for_each_prev(p, h) for (p = (h)->prev; p != (h); p = (p)->prev)
#define list_for_each_entry_from_reverse(p, h, field) \
for (; &p->field != (h); \
p = list_prev_entry(p, field))...
19 defines
static inline void
list_add(struct list_head *new, struct list_head *head)
{
linux_list_add(new, head, head->next);
}{ ... }
static inline void
list_add_tail(struct list_head *new, struct list_head *head)
{
linux_list_add(new, head->prev, head);
}{ ... }
static inline void
list_move(struct list_head *list, struct list_head *head)
{
list_del(list);
list_add(list, head);
}{ ... }
static inline void
list_move_tail(struct list_head *entry, struct list_head *head)
{
list_del(entry);
list_add_tail(entry, head);
}{ ... }
static inline void
list_rotate_to_front(struct list_head *entry, struct list_head *head)
{
list_move_tail(entry, head);
}{ ... }
static inline void
list_bulk_move_tail(struct list_head *head, struct list_head *first,
struct list_head *last)
{
first->prev->next = last->next;
last->next->prev = first->prev;
head->prev->next = first;
first->prev = head->prev;
last->next = head;
head->prev = last;
}{ ... }
static inline void
linux_list_splice(const struct list_head *list, struct list_head *prev,
struct list_head *next)
{
struct list_head *first;
struct list_head *last;
if (list_empty(list))
return;
first = list->next;
last = list->prev;
first->prev = prev;
prev->next = first;
last->next = next;
next->prev = last;
}{ ... }
static inline void
list_splice(const struct list_head *list, struct list_head *head)
{
linux_list_splice(list, head, head->next);
}{ ... }
static inline void
list_splice_tail(struct list_head *list, struct list_head *head)
{
linux_list_splice(list, head->prev, head);
}{ ... }
static inline void
list_splice_init(struct list_head *list, struct list_head *head)
{
linux_list_splice(list, head, head->next);
INIT_LIST_HEAD(list);
}{ ... }
static inline void
list_splice_tail_init(struct list_head *list, struct list_head *head)
{
linux_list_splice(list, head->prev, head);
INIT_LIST_HEAD(list);
}{ ... }
/* ... */
static inline int list_is_singular(const struct list_head *head)
{
return !list_empty(head) && (head->next == head->prev);
}{ ... }
static inline void __list_cut_position(struct list_head *list,
struct list_head *head, struct list_head *entry)
{
struct list_head *new_first = entry->next;
list->next = head->next;
list->next->prev = list;
list->prev = entry;
entry->next = list;
head->next = new_first;
new_first->prev = head;
}{ ... }
static inline void list_cut_position(struct list_head *list,
struct list_head *head, struct list_head *entry)
{
if (list_empty(head))
return;
if (list_is_singular(head) &&
(head->next != entry && head != entry))
return;
if (entry == head)
INIT_LIST_HEAD(list);
else
__list_cut_position(list, head, entry);
}{ ... }
static inline int list_is_first(const struct list_head *list,
const struct list_head *head)
{
return (list->prev == head);
}{ ... }
static inline int list_is_last(const struct list_head *list,
const struct list_head *head)
{
return list->next == head;
}{ ... }
static inline size_t
list_count_nodes(const struct list_head *list)
{
const struct list_head *lh;
size_t count;
count = 0;
list_for_each(lh, list) {
count++;
}list_for_each (lh, list) { ... }
return (count);
}{ ... }
/* ... */
/* ... */
#define list_for_each_entry_direction(is_fwd, p, h, field) \
for (p = list_entry(is_fwd ? (h)->next : (h)->prev, typeof(*p), field); \
&(p)->field != (h); \
p = list_entry(is_fwd ? (p)->field.next : (p)->field.prev, typeof(*p), field))...
/* ... */
static inline void list_rotate_left(struct list_head *h)
{
struct list_head *first;
if (!list_empty(h)) {
first = h->next;
list_move_tail(first, h);
}if (!list_empty(h)) { ... }
}{ ... }
/* ... */
#endif