X-Git-Url: https://hackdaworld.org/gitweb/?p=my-code%2Fapi.git;a=blobdiff_plain;f=list%2Flist.c;h=79b41d2ff9cf4288c03c6e6feb48b04f62a8bde2;hp=221b2fb01fe0212348a6f62e6cfc5982721663f2;hb=5b7483c4678684b08837d5377646d1bd396e3cd7;hpb=7a01a093081adee6313dc0805f91fb84548e092e diff --git a/list/list.c b/list/list.c index 221b2fb..79b41d2 100644 --- a/list/list.c +++ b/list/list.c @@ -6,23 +6,241 @@ #include "list.h" -int list_init(t_list *list) { +int list_init(t_list *list,int outfd) { - list-> - list->current=&(list->start); + dprintf(outfd,"[list] list initialization ...\n"); + + list->outfd=outfd; + list->start=NULL; + list_reset(list); + + return L_SUCCESS; +} + +int list_shutdown(t_list *list) { + + if(list->start!=NULL) list_destroy(list); + + dprintf(list->outfd,"[list] shutdown\n"); + + return L_SUCCESS; +} + +int list_next(t_list *list) { + + if(list->current->next==NULL) + return L_NO_NEXT_ELEMENT; + + 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) 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)&&(element->data_len)) free(element->data); + free(element); + dprintf(list->outfd,"[list] element deleted\n"); return L_SUCCESS; } -int list_add_element(t_list *list,int nr,void *data,int len) { +int list_del_current(t_list *list) { + + return(list_del_element(list,list->current)); +} + +int list_destroy(t_list *list) { + + if(list->start==NULL) { + dprintf(list->outfd,"[list] empty list\n"); + return L_EMPTY_LIST; + } + + list_reset(list); - if(list->method&C_NUMBER) { - while(list->current->next!=NULL) { - if(list->current->number==nr) return L_EXISTS; - else list->current=list->current->next; + while(list->current!=NULL) list_del_element(list,list->current); + list->start=NULL; + + return L_SUCCESS; +} + +int list_search_data(t_list *list,void *data,int first_bytes) { + + list_reset(list); + + if(list->start==NULL) { + dprintf(list->outfd,"[list] empty list\n"); + return L_EMPTY_LIST; + } + + do { + if(list->current!=NULL) + if(first_bytes<=list->current->data_len) + if(!(memcmp(list->current->data,data,first_bytes))) return L_SUCCESS; + } while(list_next(list)!=L_NO_NEXT_ELEMENT); + + return L_NO_SUCH_ELEMENT; +} + +int list_add_immediate_ptr(t_list *list,void *ptr) { + + /* if this is the first element */ + if(list->start==NULL) { + 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->current->number==nr) return L_EXISTS; + list->start->data=ptr; + list->start->data_len=0; + list->start->next=NULL; + list->start->prev=NULL; + list->current=list->start; + dprintf(list->outfd,"[list] added initial element\n"); + return L_SUCCESS; + } + + 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; + list->current->next->data=ptr; + list->current->next->data_len=0; + + list->current=list->current->next; + + return L_SUCCESS; + +} + +int list_add_immediate(t_list *list,void *data,int data_len) { + + /* if this is the first element */ + if(list->start==NULL) { + 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; + list->current=list->start; + dprintf(list->outfd,"[list] added initial element\n"); + return L_SUCCESS; + } + + 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->current->next; + + return L_SUCCESS; +} + +int list_add_element(t_list *list,void *data,int data_len) { + + list_reset(list); - /* new element */ - if((list->current->next=(t_list *)malloc(sizeof(t_list)))==NULL) { - fprintf(stderr,"[list] + 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; + } + } + 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->current->next; + + dprintf(list->outfd,"[list] element added\n"); + + return L_SUCCESS; + } + else list_next(list); + } + + /* 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; + + list->current=list->start; + + dprintf(list->outfd,"[list] added initial element\n"); + + return L_SUCCESS; +} + +int list_count(t_list *list) { + + int count; + + count=0; + + list_reset(list); + + if(list->current!=NULL) count++; + if(count) while(list_next(list)!=L_NO_NEXT_ELEMENT) count++; + + return count; +}