1 /* list.c -- list management szuff
3 * author: hackbard@hackdaworld.dyndns.org
9 int list_init(t_list *list,int outfd) {
11 dprintf(outfd,"[list] list initialization ...\n");
20 int list_shutdown(t_list *list) {
22 if(list->start!=NULL) list_destroy(list);
24 dprintf(list->outfd,"[list] shutdown\n");
29 int list_next(t_list *list) {
31 if(list->current->next==NULL)
32 return L_NO_NEXT_ELEMENT;
34 list->current=list->current->next;
39 int list_reset(t_list *list) {
41 list->current=list->start;
46 int list_del_element(t_list *list,t_list_element *element) {
49 dprintf(list->outfd,"[list] empty element\n");
50 return L_INVALID_ELEMENT;
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;
57 if((element->data!=NULL)&&(element->data_len)) free(element->data);
59 dprintf(list->outfd,"[list] element deleted\n");
64 int list_del_current(t_list *list) {
66 return(list_del_element(list,list->current));
69 int list_destroy(t_list *list) {
71 if(list->start==NULL) {
72 dprintf(list->outfd,"[list] empty list\n");
78 while(list->current!=NULL) list_del_element(list,list->current);
84 int list_search_data(t_list *list,void *data,int first_bytes) {
88 if(list->start==NULL) {
89 dprintf(list->outfd,"[list] empty list\n");
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);
99 return L_NO_SUCH_ELEMENT;
102 int list_add_immediate_ptr(t_list *list,void *ptr) {
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");
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");
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");
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;
130 list->current=list->current->next;
136 int list_add_immediate(t_list *list,void *data,int data_len) {
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");
145 if((list->start->data=malloc(data_len))==NULL) {
146 dprintf(list->outfd,"[list] unable to allocate data memory\n");
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");
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");
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");
169 memcpy(list->current->next->data,data,data_len);
170 list->current->next->data_len=data_len;
172 list->current=list->current->next;
177 int list_add_element(t_list *list,void *data,int data_len) {
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;
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");
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");
200 memcpy(list->current->next->data,data,data_len);
201 list->current->next->data_len=data_len;
203 list->current=list->current->next;
205 dprintf(list->outfd,"[list] element added\n");
209 else list_next(list);
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");
218 if((list->start->data=malloc(data_len))==NULL) {
219 dprintf(list->outfd,"[list] unable to allocate data memory\n");
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;
227 list->current=list->start;
229 dprintf(list->outfd,"[list] added initial element\n");
234 int list_count(t_list *list) {
242 if(list->current!=NULL) count++;
243 if(count) while(list_next(list)!=L_NO_NEXT_ELEMENT) count++;