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 LIST_HEAD(name) \
     21 	struct list_head name = { &name, &name }
     22 
     23 #define INIT_LIST_HEAD(ptr) do { \
     24 	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
     25 } while (0)
     26 
     27 #if (!defined(__GNUC__) && !defined(__WATCOMC__))
     28 #define __inline__
     29 #endif
     30 
     31 /*
     32  * Insert a new entry between two known consecutive entries.
     33  *
     34  * This is only for internal list manipulation where we know
     35  * the prev/next entries already!
     36  */
     37 static __inline__ void __list_add(struct list_head * new,
     38 	struct list_head * prev,
     39 	struct list_head * next)
     40 {
     41 	next->prev = new;
     42 	new->next = next;
     43 	new->prev = prev;
     44 	prev->next = new;
     45 }
     46 
     47 /*
     48  * Insert a new entry after the specified head..
     49  */
     50 static __inline__ void list_add(struct list_head *new, struct list_head *head)
     51 {
     52 	__list_add(new, head, head->next);
     53 }
     54 
     55 /*
     56  * Insert a new entry at the tail
     57  */
     58 static __inline__ void list_add_tail(struct list_head *new, struct list_head *head)
     59 {
     60 	__list_add(new, head->prev, head);
     61 }
     62 
     63 /*
     64  * Delete a list entry by making the prev/next entries
     65  * point to each other.
     66  *
     67  * This is only for internal list manipulation where we know
     68  * the prev/next entries already!
     69  */
     70 static __inline__ void __list_del(struct list_head * prev,
     71 				  struct list_head * next)
     72 {
     73 	next->prev = prev;
     74 	prev->next = next;
     75 }
     76 
     77 static __inline__ void list_del(struct list_head *entry)
     78 {
     79 	__list_del(entry->prev, entry->next);
     80 }
     81 
     82 static __inline__ int list_empty(struct list_head *head)
     83 {
     84 	return head->next == head;
     85 }
     86 
     87 /*
     88  * Splice in "list" into "head"
     89  */
     90 static __inline__ void list_splice(struct list_head *list, struct list_head *head)
     91 {
     92 	struct list_head *first = list->next;
     93 
     94 	if (first != list) {
     95 		struct list_head *last = list->prev;
     96 		struct list_head *at = head->next;
     97 
     98 		first->prev = head;
     99 		head->next = first;
    100 
    101 		last->next = at;
    102 		at->prev = last;
    103 	}
    104 }
    105 
    106 #define list_entry(ptr, type, member) \
    107 	((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
    108 
    109 #define list_for_each(pos, head) \
    110         for (pos = (head)->next; pos != (head); pos = pos->next)
    111 
    112 #endif
    113