list system updates for moldyn api, gets changed soon again (clean up)!
[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) return L_NO_NEXT_ELEMENT;
32
33   list->current=list->current->next;
34
35   return L_SUCCESS;
36 }
37
38 int list_reset(t_list *list) {
39
40   list->current=list->start;
41
42   return L_SUCCESS;
43 }
44
45 int list_del_element(t_list *list,t_list_element *element) {
46
47   if(element==NULL) {
48     dprintf(list->outfd,"[list] empty element\n");
49     return L_INVALID_ELEMENT;
50   }
51
52   if(element->next!=NULL) element->next->prev=element->prev;
53   if(element->prev!=NULL) element->prev->next=element->next;
54   if(element==list->start) list->start=element->next;
55   list_reset(list);
56   if((element->data!=NULL)&&(element->data_len)) free(element->data);
57   free(element);
58   dprintf(list->outfd,"[list] element deleted\n");
59
60   return L_SUCCESS;
61 }
62
63 int list_del_current(t_list *list) {
64
65   return(list_del_element(list,list->current));
66 }
67
68 int list_destroy(t_list *list) {
69
70   if(list->start==NULL) {
71     dprintf(list->outfd,"[list] empty list\n");
72     return L_EMPTY_LIST;
73   }
74
75   list_reset(list);
76
77   while(list->current!=NULL) list_del_element(list,list->current);
78
79   return L_SUCCESS;
80 }
81
82 int list_search_data(t_list *list,void *data,int first_bytes) {
83
84   list_reset(list);
85
86   if(list->start==NULL) {
87     dprintf(list->outfd,"[list] empty list\n");
88     return L_EMPTY_LIST;
89   }
90
91   do {
92     if(list->current!=NULL)
93       if(first_bytes<=list->current->data_len)
94         if(!(memcmp(list->current->data,data,first_bytes))) return L_SUCCESS;
95   } while(list_next(list)!=L_NO_NEXT_ELEMENT);
96
97   return L_NO_SUCH_ELEMENT;
98 }
99
100 int list_add_immediate_ptr(t_list *list,void *ptr) {
101
102   /* if this is the first element */
103   if(list->start==NULL) {
104     list->start=(t_list_element *)malloc(sizeof(t_list_element));
105     if(list->start==NULL) {
106       dprintf(list->outfd,"[list] unable to allocate list element memory\n");
107       return L_E_MEM;
108     }
109     list->start->data=ptr;
110     list->start->data_len=0;
111     list->start->next=NULL;
112     list->start->prev=NULL;
113     list->current=list->start;
114     dprintf(list->outfd,"[list] added initial element\n");
115     return L_SUCCESS;
116   }
117
118   list->current->next=(t_list_element *)malloc(sizeof(t_list_element));
119   if(list->current->next==NULL) {
120     dprintf(list->outfd,"[list] unable to allocate element memory\n");
121     return L_E_MEM;
122   }
123   list->current->next->prev=list->current;
124   list->current->next->next=NULL;
125   list->current->next->data=ptr;
126   list->current->next->data_len=0;
127
128   list->current=list->current->next;
129
130   return L_SUCCESS;
131
132 }
133
134 int list_add_immediate(t_list *list,void *data,int data_len) {
135
136   /* if this is the first element */
137   if(list->start==NULL) {
138     list->start=(t_list_element *)malloc(sizeof(t_list_element));
139     if(list->start==NULL) {
140       dprintf(list->outfd,"[list] unable to allocate list element memory\n");
141       return L_E_MEM;
142     }
143     if((list->start->data=malloc(data_len))==NULL) {
144       dprintf(list->outfd,"[list] unable to allocate data memory\n");
145       return L_E_MEM;
146     }
147     memcpy(list->start->data,data,data_len);
148     list->start->data_len=data_len;
149     list->start->next=NULL;
150     list->start->prev=NULL;
151     list->current=list->start;
152     dprintf(list->outfd,"[list] added initial element\n");
153     return L_SUCCESS;
154   }
155
156   list->current->next=(t_list_element *)malloc(sizeof(t_list_element));
157   if(list->current->next==NULL) {
158     dprintf(list->outfd,"[list] unable to allocate element memory\n");
159     return L_E_MEM;
160   }
161   list->current->next->prev=list->current;
162   list->current->next->next=NULL;
163   if((list->current->next->data=malloc(data_len))==NULL) {
164     dprintf(list->outfd,"[list] unable to allocate data memory\n");
165     return L_E_MEM;
166   }
167   memcpy(list->current->next->data,data,data_len);
168   list->current->next->data_len=data_len;
169
170   list->current=list->current->next;
171
172   return L_SUCCESS;
173 }
174
175 int list_add_element(t_list *list,void *data,int data_len) {
176
177   list_reset(list);
178
179   while(list->current!=NULL) {
180     if(data_len==list->current->data_len) {
181       if(!memcmp(list->current->data,data,data_len)) {
182         dprintf(list->outfd,"[list] element already in list\n");
183         return L_ELEMENT_IN_LIST;
184       }
185     }
186     if(list->current->next==NULL) {
187       list->current->next=(t_list_element *)malloc(sizeof(t_list_element));
188       if(list->current->next==NULL) {
189         dprintf(list->outfd,"[list] unable to allocate element memory\n");
190         return L_E_MEM;
191       }
192       list->current->next->prev=list->current;
193       list->current->next->next=NULL;
194       if((list->current->next->data=malloc(data_len))==NULL) {
195         dprintf(list->outfd,"[list] unable to allocate data memory\n");
196         return L_E_MEM;
197       }
198       memcpy(list->current->next->data,data,data_len);
199       list->current->next->data_len=data_len;
200
201       list->current=list->current->next;
202
203       dprintf(list->outfd,"[list] element added\n");
204
205       return L_SUCCESS;
206     }
207     else list_next(list);
208   }
209
210   /* if this is the first element */
211   list->start=(t_list_element *)malloc(sizeof(t_list_element));
212   if(list->start==NULL) {
213     dprintf(list->outfd,"[list] unable to allocate list element memory\n");
214     return L_E_MEM;
215   }
216   if((list->start->data=malloc(data_len))==NULL) {
217     dprintf(list->outfd,"[list] unable to allocate data memory\n");
218     return L_E_MEM;
219   }
220   memcpy(list->start->data,data,data_len);
221   list->start->data_len=data_len;
222   list->start->next=NULL;
223   list->start->prev=NULL;
224
225   list->current=list->start;
226
227   dprintf(list->outfd,"[list] added initial element\n");
228
229   return L_SUCCESS;
230 }
231
232 int list_count(t_list *list) {
233
234   int count;
235
236   count=0;
237
238   list_reset(list);
239
240   if(list->current!=NULL) count++;
241   if(count) while(list_next(list)!=L_NO_NEXT_ELEMENT) count++;
242
243   return count;
244 }