mcabber/src/list.h
author Mikael Berthe <mikael@lilotux.net>
Sat, 27 Aug 2005 11:21:27 +0200
changeset 403 17aa60c6dc63
parent 393 f8f3c7493457
permissions -rw-r--r--
Allow a different server name than the jid domain name Sync libjabber with upstream (centericq). The libjabber patch is from Ian Johannesen. This allows connecting to Google Talk, for example.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     1
#ifndef _LINUX_LIST_H
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     2
#define _LINUX_LIST_H
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     3
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     4
/*
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     5
 * Simple doubly linked list implementation.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     6
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     7
 * Some of the internal functions ("__xxx") are useful when
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     8
 * manipulating whole lists rather than single entries, as
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     9
 * sometimes we already know the next/prev entries and we can
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    10
 * generate better code by using them directly rather than
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    11
 * using the generic single-entry routines.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    12
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    13
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    14
struct list_head {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    15
  struct list_head *next, *prev;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    16
};
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    17
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    18
#define LIST_HEAD_INIT(name) { &(name), &(name) }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    19
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    20
#define LIST_HEAD(name) \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    21
	struct list_head name = LIST_HEAD_INIT(name)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    22
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    23
#define INIT_LIST_HEAD(ptr) do { \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    24
	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    25
} while (0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    26
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    27
/*
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 28
diff changeset
    28
 * Insert a new entry between two known consecutive entries.
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    29
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    30
 * This is only for internal list manipulation where we know
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    31
 * the prev/next entries already!
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    32
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    33
static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    34
__list_add(struct list_head *new,
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    35
	   struct list_head *prev, struct list_head *next)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    36
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    37
  next->prev = new;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    38
  new->next = next;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    39
  new->prev = prev;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    40
  prev->next = new;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    41
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    42
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    43
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    44
 * list_add - add a new entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    45
 * @new: new entry to be added
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    46
 * @head: list head to add it after
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    47
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    48
 * Insert a new entry after the specified head.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    49
 * This is good for implementing stacks.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    50
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    51
static inline void list_add(struct list_head *new, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    52
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    53
  __list_add(new, head, head->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    54
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    55
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    56
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    57
 * list_add_tail - add a new entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    58
 * @new: new entry to be added
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    59
 * @head: list head to add it before
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    60
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    61
 * Insert a new entry before the specified head.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    62
 * This is useful for implementing queues.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    63
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    64
static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    65
list_add_tail(struct list_head *new, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    66
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    67
  __list_add(new, head->prev, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    68
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    69
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    70
/*
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    71
 * Delete a list entry by making the prev/next entries
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    72
 * point to each other.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    73
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    74
 * This is only for internal list manipulation where we know
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    75
 * the prev/next entries already!
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    76
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    77
static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    78
__list_del(struct list_head *prev, struct list_head *next)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    79
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    80
  next->prev = prev;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    81
  prev->next = next;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    82
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    83
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    84
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    85
 * list_del - deletes entry from list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    86
 * @entry: the element to delete from the list.
28
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
    87
 * Note: list_empty on entry does not return true after this, the entry is
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
    88
 *       in an undefined state.
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    89
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    90
static inline void list_del(struct list_head *entry)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    91
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    92
  __list_del(entry->prev, entry->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    93
  entry->next = (void *) 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    94
  entry->prev = (void *) 0;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    95
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    96
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    97
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    98
 * list_del_init - deletes entry from list and reinitialize it.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    99
 * @entry: the element to delete from the list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   100
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   101
static inline void list_del_init(struct list_head *entry)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   102
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   103
  __list_del(entry->prev, entry->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   104
  INIT_LIST_HEAD(entry);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   105
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   106
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   107
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   108
 * list_move - delete from one list and add as another's head
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   109
 * @list: the entry to move
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   110
 * @head: the head that will precede our entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   111
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   112
static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   113
list_move(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   114
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   115
  __list_del(list->prev, list->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   116
  list_add(list, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   117
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   118
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   119
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   120
 * list_move_tail - delete from one list and add as another's tail
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   121
 * @list: the entry to move
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   122
 * @head: the head that will follow our entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   123
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   124
static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   125
list_move_tail(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   126
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   127
  __list_del(list->prev, list->next);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   128
  list_add_tail(list, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   129
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   130
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   131
/**
28
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
   132
 * list_empty - test whether a list is empty
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   133
 * @head: the list to test.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   134
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   135
static inline int list_empty(struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   136
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   137
  return head->next == head;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   138
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   139
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   140
static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   141
__list_splice(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   142
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   143
  struct list_head *first = list->next;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   144
  struct list_head *last = list->prev;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   145
  struct list_head *at = head->next;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   146
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   147
  first->prev = head;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   148
  head->next = first;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   149
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   150
  last->next = at;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   151
  at->prev = last;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   152
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   153
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   154
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   155
 * list_splice - join two lists
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   156
 * @list: the new list to add.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   157
 * @head: the place to add it in the first list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   158
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   159
static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   160
list_splice(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   161
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   162
  if (!list_empty(list))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   163
    __list_splice(list, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   164
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   165
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   166
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   167
 * list_splice_init - join two lists and reinitialise the emptied list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   168
 * @list: the new list to add.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   169
 * @head: the place to add it in the first list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   170
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   171
 * The list at @list is reinitialised
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   172
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   173
static inline void
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   174
list_splice_init(struct list_head *list, struct list_head *head)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   175
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   176
  if (!list_empty(list)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   177
    __list_splice(list, head);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   178
    INIT_LIST_HEAD(list);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   179
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   180
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   181
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   182
/**
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   183
 * list_entry - get the struct for this entry
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   184
 * @ptr:	the &struct list_head pointer.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   185
 * @type:	the type of the struct this is embedded in.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   186
 * @member:	the name of the list_struct within the struct.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   187
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   188
#define list_entry(ptr, type, member) \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   189
	((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   190
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   191
/**
28
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
   192
 * list_for_each_safe - iterate over a list safe against removal of list entry
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   193
 * @pos:	the &struct list_head to use as a loop counter.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   194
 * @n:		another &struct list_head to use as temporary storage
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   195
 * @head:	the head for your list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   196
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   197
#define list_for_each_safe(pos, n, head) \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   198
	for (pos = (head)->next, n = pos->next; pos != (head); \
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   199
		pos = n, n = pos->next)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   200
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   201
/**
28
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
   202
 * list_for_each_entry_safe - iterate over list of given type safe against
0cd8025eebee [/trunk] Changeset 44 by mikael
mikael
parents: 24
diff changeset
   203
 *                            removal of list entry
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   204
 * @pos:	the type * to use as a loop counter.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   205
 * @n:		another type * to use as temporary storage
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   206
 * @head:	the head for your list.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   207
 * @member:	the name of the list_struct within the struct.
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   208
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   209
#define list_for_each_entry_safe(pos, n, head, member)			\
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   210
	for (pos = list_entry((head)->next, typeof(*pos), member),	\
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   211
		n = list_entry(pos->member.next, typeof(*pos), member);	\
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   212
	     &pos->member != (head); 					\
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   213
	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   214
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
   215
#endif