]>
git.ipfire.org Git - thirdparty/kmod.git/blob - libkmod/libkmod-list.c
5b5899c5b886a7c1a1d6114e46bb29ce6fc4ad67
1 // SPDX-License-Identifier: LGPL-2.1-or-later
3 * Copyright (C) 2011-2013 ProFUSION embedded systems
9 #include "libkmod-internal.h"
11 static inline struct list_node
*list_node_init(struct list_node
*node
)
19 static inline void list_node_append(struct list_node
*list
, struct list_node
*node
)
26 node
->prev
= list
->prev
;
27 list
->prev
->next
= node
;
32 static inline struct list_node
*list_node_remove(struct list_node
*node
)
34 if (node
->prev
== node
|| node
->next
== node
)
37 node
->prev
->next
= node
->next
;
38 node
->next
->prev
= node
->prev
;
43 static inline void list_node_insert_after(struct list_node
*list
, struct list_node
*node
)
51 node
->next
= list
->next
;
52 list
->next
->prev
= node
;
56 static inline void list_node_insert_before(struct list_node
*list
, struct list_node
*node
)
64 node
->prev
= list
->prev
;
65 list
->prev
->next
= node
;
69 static inline void list_node_append_list(struct list_node
*list1
, struct list_node
*list2
)
71 struct list_node
*list1_last
;
74 list_node_init(list2
);
78 list1
->prev
->next
= list2
;
79 list2
->prev
->next
= list1
;
81 /* cache the last, because we will lose the pointer */
82 list1_last
= list1
->prev
;
84 list1
->prev
= list2
->prev
;
85 list2
->prev
= list1_last
;
88 struct kmod_list
*kmod_list_append(struct kmod_list
*list
, const void *data
)
90 struct kmod_list
*new;
92 new = malloc(sizeof(*new));
96 new->data
= (void *)data
;
97 list_node_append(list
? &list
->node
: NULL
, &new->node
);
99 return list
? list
: new;
102 struct kmod_list
*kmod_list_insert_after(struct kmod_list
*list
, const void *data
)
104 struct kmod_list
*new;
107 return kmod_list_append(list
, data
);
109 new = malloc(sizeof(*new));
113 new->data
= (void *)data
;
114 list_node_insert_after(&list
->node
, &new->node
);
119 struct kmod_list
*kmod_list_insert_before(struct kmod_list
*list
, const void *data
)
121 struct kmod_list
*new;
124 return kmod_list_append(list
, data
);
126 new = malloc(sizeof(*new));
130 new->data
= (void *)data
;
131 list_node_insert_before(&list
->node
, &new->node
);
136 struct kmod_list
*kmod_list_append_list(struct kmod_list
*list1
, struct kmod_list
*list2
)
144 list_node_append_list(&list1
->node
, &list2
->node
);
149 struct kmod_list
*kmod_list_prepend(struct kmod_list
*list
, const void *data
)
151 struct kmod_list
*new;
153 new = malloc(sizeof(*new));
157 new->data
= (void *)data
;
158 list_node_append(list
? &list
->node
: NULL
, &new->node
);
163 struct kmod_list
*kmod_list_remove(struct kmod_list
*list
)
165 struct list_node
*node
;
170 node
= list_node_remove(&list
->node
);
176 return container_of(node
, struct kmod_list
, node
);
179 struct kmod_list
*kmod_list_remove_data(struct kmod_list
*list
, const void *data
)
181 struct kmod_list
*itr
;
182 struct list_node
*node
;
184 for (itr
= list
; itr
!= NULL
; itr
= kmod_list_next(list
, itr
)) {
185 if (itr
->data
== data
)
192 node
= list_node_remove(&itr
->node
);
198 return container_of(node
, struct kmod_list
, node
);
201 KMOD_EXPORT
struct kmod_list
*kmod_list_prev(const struct kmod_list
*list
,
202 const struct kmod_list
*curr
)
204 if (list
== NULL
|| curr
== NULL
)
210 return container_of(curr
->node
.prev
, struct kmod_list
, node
);
213 KMOD_EXPORT
struct kmod_list
*kmod_list_next(const struct kmod_list
*list
,
214 const struct kmod_list
*curr
)
216 if (list
== NULL
|| curr
== NULL
)
219 if (curr
->node
.next
== &list
->node
)
222 return container_of(curr
->node
.next
, struct kmod_list
, node
);
225 KMOD_EXPORT
struct kmod_list
*kmod_list_last(const struct kmod_list
*list
)
229 return container_of(list
->node
.prev
, struct kmod_list
, node
);