• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Simple list implementation mostly take from the Linux Kernel
4  */
5 
6 #include <stdlib.h>
7 #include "list.h"
8 
INIT_LIST_HEAD(struct list_head * list)9 void INIT_LIST_HEAD(struct list_head *list)
10 {
11 	list->next = list;
12 	list->prev = list;
13 }
14 
__list_add(struct list_head * new,struct list_head * prev,struct list_head * next)15 void __list_add(struct list_head *new,
16 		struct list_head *prev, struct list_head *next)
17 {
18 	next->prev = new;
19 	new->next = next;
20 	new->prev = prev;
21 	prev->next = new;
22 }
23 
__list_del(struct list_head * prev,struct list_head * next)24 void __list_del(struct list_head *prev, struct list_head *next)
25 {
26 	next->prev = prev;
27 	prev->next = next;
28 }
29 
list_add(struct list_head * new,struct list_head * head)30 void list_add(struct list_head *new, struct list_head *head)
31 {
32 	__list_add(new, head, head->next);
33 }
34 
list_add_tail(struct list_head * new,struct list_head * head)35 void list_add_tail(struct list_head *new, struct list_head *head)
36 {
37 	__list_add(new, head->prev, head);
38 }
39 
list_del(struct list_head * entry)40 void list_del(struct list_head *entry)
41 {
42 	__list_del(entry->prev, entry->next);
43 	entry->next = NULL;
44 	entry->prev = NULL;
45 }
46 
list_replace(struct list_head * old,struct list_head * new)47 void list_replace(struct list_head *old, struct list_head *new)
48 {
49 	new->next = old->next;
50 	new->next->prev = new;
51 	new->prev = old->prev;
52 	new->prev->next = new;
53 }
54