X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=list%2Flist.h;h=8f5328a4f04ef45bf85a08f9ce9f5e930c7ae76e;hb=5b7483c4678684b08837d5377646d1bd396e3cd7;hp=b415f90ddc284e23fd624080920b994619a922ec;hpb=7a01a093081adee6313dc0805f91fb84548e092e;p=my-code%2Fapi.git diff --git a/list/list.h b/list/list.h index b415f90..8f5328a 100644 --- a/list/list.h +++ b/list/list.h @@ -1,21 +1,127 @@ /* list.h -- list headers */ +#ifndef LIST_H +#define LIST_H + +#define _GNU_SOURCE #include +#include +#include #define L_SUCCESS 1 #define L_ERROR -1 - -#define C_NUMBER (1<<0) -#define C_DATA (1<<1) +#define L_NO_NEXT_ELEMENT -2 +#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 *next; - void *data; - int number; + struct s_list_element *prev; + struct s_list_element *next; + void *data; + int data_len; } t_list_element; typedef struct s_list { - t_list_element start; - unsigned char method; - t_list_element *current; + int outfd; + t_list_element *start; + t_list_element *current; } t_list; + +/* function prototypes */ +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_del_current(t_list *list); +int list_destroy(t_list *list); +int list_search_data(t_list *list,void *data,int first_bytes); +int list_add_immediate_ptr(t_list *list,void *ptr); +int list_add_immediate(t_list *list,void *data,int data_len); +int list_add_element(t_list *list,void *data,int data_len); +int list_count(t_list *list); + +/* + * fast linked list routines to be inlined + */ + +/* prototypes */ + +static inline int list_init_f(t_list *list) __attribute__((always_inline)); +static inline int list_reset_f(t_list *list) __attribute__((always_inline)); +static inline int list_destroy_f(t_list *list) __attribute__((always_inline)); +static inline int list_add_immediate_f(t_list *list,void *ptr) __attribute__((always_inline)); +static inline int list_next_f(t_list *list) __attribute__((always_inline)); + +/* definitions */ + +static inline int list_init_f(t_list *list) { + + list->start=NULL; + list->current=list->start; + + return L_SUCCESS; +} + +static inline int list_reset_f(t_list *list) { + + list->current=list->start; + + return L_SUCCESS; +} + +static inline int list_destroy_f(t_list *list) { + + t_list_element *this; + + /* destroying the list from the very beginning */ + list->current=list->start; + + while(list->current!=NULL) { + this=list->current; + list->current=this->next; + free(this); + } + + list->start=NULL; + + return L_SUCCESS; +} + +static inline int list_add_immediate_f(t_list *list,void *ptr) { + + /* first element? */ + if(list->start==NULL) { + list->start=malloc(sizeof(t_list_element)); + list->start->data=ptr; + list->start->next=NULL; + list->start->prev=NULL; + list->current=list->start; + + return L_SUCCESS; + } + + list->current->next=malloc(sizeof(t_list_element)); + list->current->next->prev=list->current; + list->current->next->next=NULL; + list->current->next->data=ptr; + list->current=list->current->next; + + return L_SUCCESS; +} + +static inline int list_next_f(t_list *list) { + + if(list->current->next==NULL) + return L_NO_NEXT_ELEMENT; + + list->current=list->current->next; + + return L_SUCCESS; +} + + +#endif