155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/*
355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Simple list implementation mostly take from the Linux Kernel
455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */
555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <stdlib.h>
755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "list.h"
855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid INIT_LIST_HEAD(struct list_head *list)
1055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak{
1155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	list->next = list;
1255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	list->prev = list;
1355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak}
1455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
1555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid __list_add(struct list_head *new,
16354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		struct list_head *prev, struct list_head *next)
1755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak{
1855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	next->prev = new;
1955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	new->next = next;
2055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	new->prev = prev;
2155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	prev->next = new;
2255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak}
2355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
2455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid __list_del(struct list_head *prev, struct list_head *next)
2555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak{
2655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	next->prev = prev;
2755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	prev->next = next;
2855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak}
2955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
3055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid list_add(struct list_head *new, struct list_head *head)
3155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak{
3255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	__list_add(new, head, head->next);
3355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak}
3455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
3555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid list_add_tail(struct list_head *new, struct list_head *head)
3655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak{
3755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	__list_add(new, head->prev, head);
3855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak}
3955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
4055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid list_del(struct list_head *entry)
4155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak{
4255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	__list_del(entry->prev, entry->next);
4355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	entry->next = NULL;
4455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	entry->prev = NULL;
4555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak}
4655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
47354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid list_replace(struct list_head *old, struct list_head *new)
4855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak{
4955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	new->next = old->next;
5055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	new->next->prev = new;
5155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	new->prev = old->prev;
5255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	new->prev->next = new;
53ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
54