00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef __LIST_H
00031 #define __LIST_H
00032
00033
00034 struct list_head {
00035 struct list_head *next, *prev;
00036 };
00037
00038 typedef struct list_head list_head_t;
00039
00040 typedef struct list_s {
00041 void *data;
00042 list_head_t links;
00043 } list_t;
00044
00045
00046
00047 #define LIST_HEAD_INIT(name) { &(name), &(name) }
00048
00049 #define LIST_HEAD(name) \
00050 struct list_head name = LIST_HEAD_INIT(name)
00051
00052 #define INIT_LIST_HEAD(ptr) do { \
00053 (ptr)->next = (ptr); (ptr)->prev = (ptr); \
00054 } while (0)
00055
00056
00063 #define list_entry(ptr, type, member) \
00064 ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
00065
00071 #define list_for_each(pos, head) \
00072 for (pos = (head)->next; pos != (head); \
00073 pos = pos->next)
00074
00079 #define list_for_each_prev(pos, head) \
00080 for (pos = (head)->prev; pos != (head); \
00081 pos = pos->prev)
00082
00089 #define list_for_each_safe(pos, n, head) \
00090 for (pos = (head)->next, n = pos->next; pos != (head); \
00091 pos = n, n = pos->next)
00092
00099
00100
00101
00102
00103
00104
00105
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 void list_add(struct list_head *new_element, struct list_head *head);
00123 void list_add_tail(struct list_head *new_element, struct list_head *head);
00124 void list_del(struct list_head *entry);
00125 void list_del_init(struct list_head *entry);
00126 void list_move(struct list_head *list, struct list_head *head);
00127 void list_move_tail(struct list_head *list, struct list_head *head);
00128 void list_splice(struct list_head *list, struct list_head *head);
00129 void list_splice_init(struct list_head *list, struct list_head *head);
00130 int list_empty(struct list_head *head);
00131
00132
00133
00134
00135
00136 list_t* list_get_new_node(void* data);
00137 list_t* list_get_first_prev_node(list_t *list);
00138 list_t *list_get_next_node(list_t *list, list_t *previous_node, void **out_data);
00139 list_t* list_get_new_list();
00140 list_t* list_get_new_list_if_null(list_t *list);
00141
00142 void list_free(list_t *list);
00143 list_t* list_free_empty(list_t *list);
00144 void list_free_node(list_t *node, void (*free_data_func)(void *data));
00145 void list_free_with_nodes(list_t *list, void (*free_data_func)(void *data));
00146 void list_del_and_free_nodes_with_data(list_t *list, void *ref_to_data,
00147 void (*free_data_func)(void *data));
00148 void list_del_and_free_node(list_t *node, void (*free_data_func)(void *data));
00149
00150 void list_add_node(list_t *new_node, list_t *list);
00151 void list_add_data(void *data, list_t *list);
00152
00153 void list_add_list(list_t *list, list_t *node);
00154 list_t* list_copy_list(list_t *list);
00155
00156 int list_is_empty(list_t* list);
00157 int list_is_null_or_empty(list_t* list);
00158 int list_is_last_node(list_t *list, list_t *node);
00159
00160 int list_count_nodes_with_data(list_t *list, void *ref_to_data);
00161
00162 #endif
00163
00164