1 /* list.h -- list headers */
13 #define L_NO_NEXT_ELEMENT -2
14 #define L_NO_SUCH_ELEMENT -3
15 #define L_INVALID_ELEMENT -4
16 #define L_EMPTY_LIST -5
17 #define L_ELEMENT_IN_LIST -6
20 typedef struct s_list_element {
21 struct s_list_element *prev;
22 struct s_list_element *next;
27 typedef struct s_list {
29 t_list_element *start;
30 t_list_element *current;
33 /* function prototypes */
34 int list_init(t_list *list,int outfd);
35 int list_shutdown(t_list *list);
36 int list_reset(t_list *list);
37 int list_next(t_list *list);
38 int list_del_element(t_list *list,t_list_element *element);
39 int list_del_current(t_list *list);
40 int list_destroy(t_list *list);
41 int list_search_data(t_list *list,void *data,int first_bytes);
42 int list_add_immediate_ptr(t_list *list,void *ptr);
43 int list_add_immediate(t_list *list,void *data,int data_len);
44 int list_add_element(t_list *list,void *data,int data_len);
45 int list_count(t_list *list);
48 * fast linked list routines to be inlined
53 static inline int list_init_f(t_list *list) __attribute__((always_inline));
54 static inline int list_reset_f(t_list *list) __attribute__((always_inline));
55 static inline int list_destroy_f(t_list *list) __attribute__((always_inline));
56 static inline int list_add_immediate_f(t_list *list,void *ptr) __attribute__((always_inline));
57 static inline int list_next_f(t_list *list) __attribute__((always_inline));
61 static inline int list_init_f(t_list *list) {
64 list->current=list->start;
69 static inline int list_reset_f(t_list *list) {
71 list->current=list->start;
76 static inline int list_destroy_f(t_list *list) {
80 /* destroying the list from the very beginning */
81 list->current=list->start;
83 while(list->current!=NULL) {
85 list->current=this->next;
94 static inline int list_add_immediate_f(t_list *list,void *ptr) {
97 if(list->start==NULL) {
98 list->start=malloc(sizeof(t_list_element));
99 list->start->data=ptr;
100 list->start->next=NULL;
101 list->start->prev=NULL;
102 list->current=list->start;
107 list->current->next=malloc(sizeof(t_list_element));
108 list->current->next->prev=list->current;
109 list->current->next->next=NULL;
110 list->current->next->data=ptr;
111 list->current=list->current->next;
116 static inline int list_next_f(t_list *list) {
118 if(list->current->next==NULL)
119 return L_NO_NEXT_ELEMENT;
121 list->current=list->current->next;