int list_init(t_list *list,int outfd) {
- dprintf(outfd,"[list] list initilaization ...\n");
+ dprintf(outfd,"[list] list initialization ...\n");
list->outfd=outfd;
list->start=NULL;
- list->current=NULL;
+ list_reset(list);
return L_SUCCESS;
}
-int list_del_next(t_list *list,t_list_element *element) {
+int list_shutdown(t_list *list) {
- t_list_element *tmp;
+ if(list->start!=NULL) list_destroy(list);
+
+ dprintf(list->outfd,"[list] shutdown\n");
+
+ return L_SUCCESS;
+}
+
+int list_next(t_list *list) {
+
+ list->current=list->current->next;
+
+ return L_SUCCESS;
+}
+
+int list_reset(t_list *list) {
+
+ list->current=list->start;
+
+ return L_SUCCESS;
+}
+
+int list_del_element(t_list *list,t_list_element *element) {
if(element==NULL) {
dprintf(list->outfd,"[list] empty element\n");
return L_INVALID_ELEMENT;
}
- if(element->next!=NULL) {
- dprintf(list->outfd,"[list] destroying element number %d\n"
- tmp=element->next->next;
- if(element->next->data!=NULL) free(element->next->data);
- free(element->next);
- element->next=tmp;
- }
- else {
- dprintf(list->outfd,"[list] no next element\n");
- return L_NO_NEXT_ELEMENT;
- }
+ if(element->next!=NULL) element->next->prev=element->prev;
+ if(element->prev!=NULL) element->prev->next=element->next;
+ if(element==list->start) list->start=element->next;
+ list_reset(list);
+ if(element->data!=NULL) free(element->data);
+ free(element);
+ dprintf(list->outfd,"[list] element deleted\n");
return L_SUCCESS;
}
return L_EMPTY_LIST;
}
- list->current=list->start;
+ list_reset(list);
- while(list->current->next!=NULL)
- list_del_next(list,list->current);
+ while(list->current!=NULL) list_del_element(list,list->current);
return L_SUCCESS;
}
-int list_del_nr(t_list *list,int nr) {
-
- if(list->start==NULL) {
- dprintf(list->outfd,"[list] empty list\n");
- return L_EMPTY_LIST;
- }
-
- if(list->start->number==nr) {
+int list_search_data(t_list *list,void *data,int first_bytes) {
- }
+ list_reset(list);
- list->current=&(list->start);
-
- while(list->current->next!=NULL) {
- if(list->current->next->number==nr) {
- list_del_next(list,list->current);
- return L_SUCCESS;
- }
- list->current=list->current->next;
+ while(list->current!=NULL) {
+ if(first_bytes<=list->current->data_len)
+ if(!(memcmp(list->current->data,data,first_bytes))) return L_SUCCESS;
+ list_next(list);
}
return L_NO_SUCH_ELEMENT;
}
-int list_search_data(t_list *list,void *data,int data_len) {
+int list_add_element(t_list *list,void *data,int data_len) {
- t_element *help;
+ list_reset(list);
- help=&(list->start);
-
- while(help->next!=NULL) {
- if(help->next->data_len==data_len) {
- if(!(memcmp(help->next->data,data,data_len)) {
- list->current=help->next;
- return L_SUCCESS;
+ while(list->current!=NULL) {
+ if(data_len==list->current->data_len) {
+ if(!memcmp(list->current->data,data,data_len)) {
+ dprintf(list->outfd,"[list] element already in list\n");
+ return L_ELEMENT_IN_LIST;
}
}
- list->current=list->current->next;
- }
-
- return L_NO_SUCH_ELEMENT;
-}
-
-int list_search_nr(t_list *list,int nr) {
+ if(list->current->next==NULL) {
+ list->current->next=(t_list_element *)malloc(sizeof(t_list_element));
+ if(list->current->next==NULL) {
+ dprintf(list->outfd,"[list] unable to allocate element memory\n");
+ return L_E_MEM;
+ }
+ list->current->next->prev=list->current;
+ list->current->next->next=NULL;
+ if((list->current->next->data=malloc(data_len))==NULL) {
+ dprintf(list->outfd,"[list] unable to allocate data memory\n");
+ return L_E_MEM;
+ }
+ memcpy(list->current->next->data,data,data_len);
+ list->current->next->data_len=data_len;
- list->current=&(list->start);
+ dprintf(list->outfd,"[list] element added\n");
- while(list->current->next!=NULL) {
- if(list->current->next->number==nr) {
- list->current=list->current->next;
return L_SUCCESS;
}
- list->current=list->current->next;
+ else list_next(list);
}
- return L_NO_SUCH_ELEMENT;
+ /* if this is the first element */
+ list->start=(t_list_element *)malloc(sizeof(t_list_element));
+ if(list->start==NULL) {
+ dprintf(list->outfd,"[list] unable to allocate list element memory\n");
+ return L_E_MEM;
+ }
+ if((list->start->data=malloc(data_len))==NULL) {
+ dprintf(list->outfd,"[list] unable to allocate data memory\n");
+ return L_E_MEM;
+ }
+ memcpy(list->start->data,data,data_len);
+ list->start->data_len=data_len;
+ list->start->next=NULL;
+ list->start->prev=NULL;
+
+ dprintf(list->outfd,"[list] added initial element\n");
+
+ return L_SUCCESS;
}
-int list_append_element(t_list *list,t_list_element *element) {
+int list_count(t_list *list) {
- list->current=&(list->start);
+ int count;
+
+ count=0;
+
+ list_reset(list);
+
+ while(list->current!=NULL) {
+ list_next(list);
+ ++count;
+ }
+
+ return count;
+}
/* list.h -- list headers */
+#define _GNU_SOURCE
#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
#define L_SUCCESS 1
#define L_ERROR -1
#define L_NO_SUCH_ELEMENT -3
#define L_INVALID_ELEMENT -4
#define L_EMPTY_LIST -5
+#define L_ELEMENT_IN_LIST -6
+#define L_E_MEM -7
typedef struct s_list_element {
+ struct s_list_element *prev;
struct s_list_element *next;
void *data;
int data_len;
- int number;
} t_list_element;
typedef struct s_list {
+ int outfd;
t_list_element *start;
t_list_element *current;
} t_list;
/* function prototypes */
-int list_init(t_list *list);
+int list_init(t_list *list,int outfd);
+int list_shutdown(t_list *list);
+int list_reset(t_list *list);
+int list_next(t_list *list);
+int list_del_element(t_list *list,t_list_element *element);
+int list_destroy(t_list *list);
+int list_search_data(t_list *list,void *data,int first_bytes);
+int list_add_element(t_list *list,void *data,int data_len);
+int list_count(t_list *list);