Home | History | Annotate | Download | only in ext2fs
      1 #ifndef _LINUX_LIST_H
      2 #define _LINUX_LIST_H
      3 
      4 /*
      5  * Simple doubly linked list implementation.
      6  *
      7  * Some of the internal functions ("__xxx") are useful when
      8  * manipulating whole lists rather than single entries, as
      9  * sometimes we already know the next/prev entries and we can
     10  * generate better code by using them directly rather than
     11  * using the generic single-entry routines.
     12  */
     13 
     14 struct list_head {
     15 	struct list_head *next, *prev;
     16 };
     17 
     18 #define LIST_HEAD_INIT(name) { &(name), &(name) }
     19 
     20 #define INIT_LIST_HEAD(ptr) do { \
     21 	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
     22 } while (0)
     23 
     24 #if (!defined(__GNUC__) && !defined(__WATCOMC__))
     25 #define __inline__
     26 #endif
     27 
     28 /*
     29  * Insert a new entry between two known consecutive entries.
     30  *
     31  * This is only for internal list manipulation where we know
     32  * the prev/next entries already!
     33  */
     34 static __inline__ void __list_add(struct list_head * new,
     35 	struct list_head * prev,
     36 	struct list_head * next)
     37 {
     38 	next->prev = new;
     39 	new->next = next;
     40 	new->prev = prev;
     41 	prev->next = new;
     42 }
     43 
     44 /*
     45  * Insert a new entry after the specified head..
     46  */
     47 static __inline__ void list_add(struct list_head *new, struct list_head *head)
     48 {
     49 	__list_add(new, head, head->next);
     50 }
     51 
     52 /*
     53  * Insert a new entry at the tail
     54  */
     55 static __inline__ void list_add_tail(struct list_head *new, struct list_head *head)
     56 {
     57 	__list_add(new, head->prev, head);
     58 }
     59 
     60 /*
     61  * Delete a list entry by making the prev/next entries
     62  * point to each other.
     63  *
     64  * This is only for internal list manipulation where we know
     65  * the prev/next entries already!
     66  */
     67 static __inline__ void __list_del(struct list_head * prev,
     68 				  struct list_head * next)
     69 {
     70 	next->prev = prev;
     71 	prev->next = next;
     72 }
     73 
     74 static __inline__ void list_del(struct list_head *entry)
     75 {
     76 	__list_del(entry->prev, entry->next);
     77 }
     78 
     79 static __inline__ int list_empty(struct list_head *head)
     80 {
     81 	return head->next == head;
     82 }
     83 
     84 /*
     85  * Splice in "list" into "head"
     86  */
     87 static __inline__ void list_splice(struct list_head *list, struct list_head *head)
     88 {
     89 	struct list_head *first = list->next;
     90 
     91 	if (first != list) {
     92 		struct list_head *last = list->prev;
     93 		struct list_head *at = head->next;
     94 
     95 		first->prev = head;
     96 		head->next = first;
     97 
     98 		last->next = at;
     99 		at->prev = last;
    100 	}
    101 }
    102 
    103 #define list_entry(ptr, type, member) \
    104 	((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
    105 
    106 #define list_for_each(pos, head) \
    107         for (pos = (head)->next; pos != (head); pos = pos->next)
    108 
    109 #endif
    110