added fast(er) list to be included (just in header) + small bug fix
[my-code/api.git] / list / list.c
1 /* list.c -- list management szuff
2  *
3  * author: hackbard@hackdaworld.dyndns.org
4  *
5  */
6
7 #include "list.h"
8
9 int list_init(t_list *list,int outfd) {
10
11   dprintf(outfd,"[list] list initialization ...\n");
12
13   list->outfd=outfd;
14   list->start=NULL;
15   list_reset(list);
16
17   return L_SUCCESS;
18 }
19
20 int list_shutdown(t_list *list) {
21
22   if(list->start!=NULL) list_destroy(list);
23
24   dprintf(list->outfd,"[list] shutdown\n");
25
26   return L_SUCCESS;
27 }
28
29 int list_next(t_list *list) {
30
31   if(list->current->next==NULL)
32         return L_NO_NEXT_ELEMENT;
33
34   list->current=list->current->next;
35
36   return L_SUCCESS;
37 }
38
39 int list_reset(t_list *list) {
40
41   list->current=list->start;
42
43   return L_SUCCESS;
44 }
45
46 int list_del_element(t_list *list,t_list_element *element) {
47
48   if(element==NULL) {
49     dprintf(list->outfd,"[list] empty element\n");
50     return L_INVALID_ELEMENT;
51   }
52
53   if(element->next!=NULL) element->next->prev=element->prev;
54   if(element->prev!=NULL) element->prev->next=element->next;
55   if(element==list->start) list->start=element->next;
56   list_reset(list);
57   if((element->data!=NULL)&&(element->data_len)) free(element->data);
58   free(element);
59   dprintf(list->outfd,"[list] element deleted\n");
60
61   return L_SUCCESS;
62 }
63
64 int list_del_current(t_list *list) {
65
66   return(list_del_element(list,list->current));
67 }
68
69 int list_destroy(t_list *list) {
70
71   if(list->start==NULL) {
72     dprintf(list->outfd,"[list] empty list\n");
73     return L_EMPTY_LIST;
74   }
75
76   list_reset(list);
77
78   while(list->current!=NULL) list_del_element(list,list->current);
79   list->start=NULL;
80
81   return L_SUCCESS;
82 }
83
84 int list_search_data(t_list *list,void *data,int first_bytes) {
85
86   list_reset(list);
87
88   if(list->start==NULL) {
89     dprintf(list->outfd,"[list] empty list\n");
90     return L_EMPTY_LIST;
91   }
92
93   do {
94     if(list->current!=NULL)
95       if(first_bytes<=list->current->data_len)
96         if(!(memcmp(list->current->data,data,first_bytes))) return L_SUCCESS;
97   } while(list_next(list)!=L_NO_NEXT_ELEMENT);
98
99   return L_NO_SUCH_ELEMENT;
100 }
101
102 int list_add_immediate_ptr(t_list *list,void *ptr) {
103
104   /* if this is the first element */
105   if(list->start==NULL) {
106     list->start=(t_list_element *)malloc(sizeof(t_list_element));
107     if(list->start==NULL) {
108       dprintf(list->outfd,"[list] unable to allocate list element memory\n");
109       return L_E_MEM;
110     }
111     list->start->data=ptr;
112     list->start->data_len=0;
113     list->start->next=NULL;
114     list->start->prev=NULL;
115     list->current=list->start;
116     dprintf(list->outfd,"[list] added initial element\n");
117     return L_SUCCESS;
118   }
119
120   list->current->next=(t_list_element *)malloc(sizeof(t_list_element));
121   if(list->current->next==NULL) {
122     dprintf(list->outfd,"[list] unable to allocate element memory\n");
123     return L_E_MEM;
124   }
125   list->current->next->prev=list->current;
126   list->current->next->next=NULL;
127   list->current->next->data=ptr;
128   list->current->next->data_len=0;
129
130   list->current=list->current->next;
131
132   return L_SUCCESS;
133
134 }
135
136 int list_add_immediate(t_list *list,void *data,int data_len) {
137
138   /* if this is the first element */
139   if(list->start==NULL) {
140     list->start=(t_list_element *)malloc(sizeof(t_list_element));
141     if(list->start==NULL) {
142       dprintf(list->outfd,"[list] unable to allocate list element memory\n");
143       return L_E_MEM;
144     }
145     if((list->start->data=malloc(data_len))==NULL) {
146       dprintf(list->outfd,"[list] unable to allocate data memory\n");
147       return L_E_MEM;
148     }
149     memcpy(list->start->data,data,data_len);
150     list->start->data_len=data_len;
151     list->start->next=NULL;
152     list->start->prev=NULL;
153     list->current=list->start;
154     dprintf(list->outfd,"[list] added initial element\n");
155     return L_SUCCESS;
156   }
157
158   list->current->next=(t_list_element *)malloc(sizeof(t_list_element));
159   if(list->current->next==NULL) {
160     dprintf(list->outfd,"[list] unable to allocate element memory\n");
161     return L_E_MEM;
162   }
163   list->current->next->prev=list->current;
164   list->current->next->next=NULL;
165   if((list->current->next->data=malloc(data_len))==NULL) {
166     dprintf(list->outfd,"[list] unable to allocate data memory\n");
167     return L_E_MEM;
168   }
169   memcpy(list->current->next->data,data,data_len);
170   list->current->next->data_len=data_len;
171
172   list->current=list->current->next;
173
174   return L_SUCCESS;
175 }
176
177 int list_add_element(t_list *list,void *data,int data_len) {
178
179   list_reset(list);
180
181   while(list->current!=NULL) {
182     if(data_len==list->current->data_len) {
183       if(!memcmp(list->current->data,data,data_len)) {
184         dprintf(list->outfd,"[list] element already in list\n");
185         return L_ELEMENT_IN_LIST;
186       }
187     }
188     if(list->current->next==NULL) {
189       list->current->next=(t_list_element *)malloc(sizeof(t_list_element));
190       if(list->current->next==NULL) {
191         dprintf(list->outfd,"[list] unable to allocate element memory\n");
192         return L_E_MEM;
193       }
194       list->current->next->prev=list->current;
195       list->current->next->next=NULL;
196       if((list->current->next->data=malloc(data_len))==NULL) {
197         dprintf(list->outfd,"[list] unable to allocate data memory\n");
198         return L_E_MEM;
199       }
200       memcpy(list->current->next->data,data,data_len);
201       list->current->next->data_len=data_len;
202
203       list->current=list->current->next;
204
205       dprintf(list->outfd,"[list] element added\n");
206
207       return L_SUCCESS;
208     }
209     else list_next(list);
210   }
211
212   /* if this is the first element */
213   list->start=(t_list_element *)malloc(sizeof(t_list_element));
214   if(list->start==NULL) {
215     dprintf(list->outfd,"[list] unable to allocate list element memory\n");
216     return L_E_MEM;
217   }
218   if((list->start->data=malloc(data_len))==NULL) {
219     dprintf(list->outfd,"[list] unable to allocate data memory\n");
220     return L_E_MEM;
221   }
222   memcpy(list->start->data,data,data_len);
223   list->start->data_len=data_len;
224   list->start->next=NULL;
225   list->start->prev=NULL;
226
227   list->current=list->start;
228
229   dprintf(list->outfd,"[list] added initial element\n");
230
231   return L_SUCCESS;
232 }
233
234 int list_count(t_list *list) {
235
236   int count;
237
238   count=0;
239
240   list_reset(list);
241
242   if(list->current!=NULL) count++;
243   if(count) while(list_next(list)!=L_NO_NEXT_ELEMENT) count++;
244
245   return count;
246 }