hopefully final bugfix to not et segfaulst using list_next
[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) 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_element(t_list *list,void *data,int data_len) {
101
102   list_reset(list);
103
104   while(list->current!=NULL) {
105     if(data_len==list->current->data_len) {
106       if(!memcmp(list->current->data,data,data_len)) {
107         dprintf(list->outfd,"[list] element already in list\n");
108         return L_ELEMENT_IN_LIST;
109       }
110     }
111     if(list->current->next==NULL) {
112       list->current->next=(t_list_element *)malloc(sizeof(t_list_element));
113       if(list->current->next==NULL) {
114         dprintf(list->outfd,"[list] unable to allocate element memory\n");
115         return L_E_MEM;
116       }
117       list->current->next->prev=list->current;
118       list->current->next->next=NULL;
119       if((list->current->next->data=malloc(data_len))==NULL) {
120         dprintf(list->outfd,"[list] unable to allocate data memory\n");
121         return L_E_MEM;
122       }
123       memcpy(list->current->next->data,data,data_len);
124       list->current->next->data_len=data_len;
125
126       dprintf(list->outfd,"[list] element added\n");
127
128       return L_SUCCESS;
129     }
130     else list_next(list);
131   }
132
133   /* if this is the first element */
134   list->start=(t_list_element *)malloc(sizeof(t_list_element));
135   if(list->start==NULL) {
136     dprintf(list->outfd,"[list] unable to allocate list element memory\n");
137     return L_E_MEM;
138   }
139   if((list->start->data=malloc(data_len))==NULL) {
140     dprintf(list->outfd,"[list] unable to allocate data memory\n");
141     return L_E_MEM;
142   }
143   memcpy(list->start->data,data,data_len);
144   list->start->data_len=data_len;
145   list->start->next=NULL;
146   list->start->prev=NULL;
147
148   dprintf(list->outfd,"[list] added initial element\n");
149
150   return L_SUCCESS;
151 }
152
153 int list_count(t_list *list) {
154
155   int count;
156
157   count=0;
158
159   list_reset(list);
160
161   if(list->current!=NULL) count++;
162   if(count) while(list_next(list)!=L_NO_NEXT_ELEMENT) count++;
163
164   return count;
165 }