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