added fast(er) list to be included (just in header) + small bug fix
[my-code/api.git] / list / list.h
index c500c1a..8f5328a 100644 (file)
 /* list.h -- list headers */
 
-#include <stdio.h>
+#ifndef LIST_H
+#define LIST_H
 
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
 
-#define SINGLE 'S'
-#define DOUBLE 'D'
+#define L_SUCCESS 1
+#define L_ERROR -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;
+  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