diff --git a/list_t/Makefile b/list_t/Makefile new file mode 100644 index 0000000..579f5d8 --- /dev/null +++ b/list_t/Makefile @@ -0,0 +1,55 @@ + +CC=gcc +TOOLDIR=$(PWD)/../ytools_t + +INCLUDE_DIR=$(TOOLDIR)/include +CFLAGS=-I$(INCLUDE_DIR) -I./src + +#SRC_DIR=$(ROOT_DIR)/src +#SRC=$(wildcard */*/*.c) +#HEADS=$(OBJS:.o=.h) + +LISTSRC=src/list_t/list_t.c +LISTSRC_O=$(LISTSRC:.c=.o) + +SETTSRC=src/set_theoric_t/set_theoric_t.c +SETTSRC_O=$(SETTSRC:.c=.o) + + +TOOLSRC_O=$(TOOLDIR)/src/tools_t/tools_t.o +#TOOLSRC=$(TOOLDIR)/src/tools_t/tools_t.c +#TOOLSRC_O=$(TOOLSRC:.c=.o) + +SRC=$(wildcard **/**/*.c) +OBJ=$(SRC:.c=.o) #$(TOOLSRC_O) + +TOPTARGETS := all clean +DEP=$(TOOLDIR) + +$(TOPTARGETS): $(DEP) + +all: $(LISTSRC_O) + + +$(LISTSRC_O): $(LISTSRC) $(TOOLSRC_O) + $(CC) -o $@ -c $< $(CFLAGS) + +#$(SETTSRC_O) : $(SETTSRC) $(TOOLSRC_O) +# $(CC) -o $@ -c $< $(CFLAGS) + +$(DEP): + $(MAKE) -C $@ $(MAKECMDGOALS) + +#$(TOOLSRC_O): $(TOOLSRC) +# $(CC) -o $@ -c $< $(CFLAGS) + +.PHONY: clean mrproper + +clean: + rm -f $(OBJ) + +mrproper: clean + rm -f $(EXEC) + +run: $(EXEC) + $(EXEC) -h diff --git a/list_t/src/list_t/list_t.c b/list_t/src/list_t/list_t.c new file mode 100644 index 0000000..0b5850b --- /dev/null +++ b/list_t/src/list_t/list_t.c @@ -0,0 +1,161 @@ + +#include "list_t/list_t.h" + +#define GEN_LIST_ALL(type)\ + /*struct list_##type {\ + type value;\ + struct list_##type *preview;\ + struct list_##type *next;\ + };\ + struct main_list_##type {\ + struct list_##type *begin_list;\ + struct list_##type *current_list;\ + size_t current_index;\ + struct list_##type *end_list;\ + size_t size;\ + };*/\ + struct main_list_##type *create_var_list_##type(){\ + struct main_list_##type *ret_var_list = malloc(sizeof(struct main_list_##type));\ + ret_var_list->begin_list = NULL;\ + ret_var_list->end_list = NULL;\ + ret_var_list->current_list = NULL;\ + ret_var_list->current_index = 0;\ + ret_var_list->size = 0;\ + return ret_var_list;\ + }\ + void push_back_list_##type(struct main_list_##type *var_list, type value){\ + struct list_##type * list_to_add = malloc(sizeof(struct list_##type));\ + list_to_add->value = value;\ + list_to_add->preview = var_list->end_list;\ + list_to_add->next = NULL;\ + if(var_list->end_list){\ + (var_list->end_list)->next = list_to_add;\ + }else {\ + var_list->begin_list = list_to_add;\ + var_list->current_list= list_to_add;\ + }\ + var_list->end_list = list_to_add;\ + ++(var_list->size);\ + }\ + void push_front_list_##type(struct main_list_##type *var_list, type value){\ + struct list_##type * list_to_add = malloc(sizeof(struct list_##type));\ + list_to_add->value = value;\ + list_to_add->preview = NULL;\ + list_to_add->next = var_list->begin_list;\ + if(var_list->begin_list){\ + (var_list->begin_list)->preview = list_to_add;\ + ++(var_list->current_index);\ + }else {\ + var_list->end_list = list_to_add;\ + var_list->current_list= list_to_add;\ + }\ + var_list->begin_list = list_to_add;\ + ++(var_list->size);\ + }\ + size_t move_current_to_index_list_##type(struct main_list_##type *var_list, size_t index){\ + if(index == var_list->current_index) return index;\ + if(var_list->begin_list == NULL) return 0;\ + if(index >= var_list->size){\ + var_list->current_list = var_list->end_list;\ + var_list->current_index = var_list->size - 1;\ + return var_list->size - 1;\ + }\ + if((var_list->current_index >= var_list->size) || !(var_list->current_list)){\ + var_list->current_list = var_list->end_list;\ + var_list->current_index = var_list->size - 1;\ + }\ + long from_current_index = var_list->current_index - index; \ + size_t abs_cur_diff = abs(from_current_index); \ + size_t array_diff_index[3] = {index, abs_cur_diff , var_list->size - 1 - index}; \ + size_t index_nearest = ARG_MIN_ARRAY_TYPE_SIZE_T(array_diff_index, 3);\ + if(index_nearest == 0){\ + var_list->current_list = var_list->begin_list;\ + for(size_t i=0; icurrent_list = (var_list->current_list)->next; \ + }\ + else if(index_nearest == 2){\ + var_list->current_list = var_list->end_list;\ + for(size_t i=0; i < array_diff_index[0]; ++i) var_list->current_list = (var_list->current_list)->preview; \ + }else if(from_current_index >= 0) \ + for(size_t i=0; i < array_diff_index[1]; ++i) var_list->current_list = (var_list->current_list)->preview; \ + else \ + for(size_t i=0; i < array_diff_index[1]; ++i) var_list->current_list = (var_list->current_list)->next; \ + \ + var_list->current_index = index;\ + return index;\ + }\ + void insert_into_list_##type(struct main_list_##type *var_list, size_t index, type value ){\ + struct list_##type * list_to_add = malloc(sizeof(struct list_##type));\ + list_to_add->value = value;\ + if(var_list->begin_list == NULL){\ + list_to_add->preview = NULL;\ + list_to_add->next = NULL;\ + var_list->begin_list = list_to_add;\ + var_list->end_list = list_to_add;\ + var_list->current_list = list_to_add;\ + var_list->current_index = 0;\ + \ + }else {\ + size_t ii = move_current_to_index_list_##type(var_list, index);\ + if(index > ii)\ + printf("%ld out of range, we put the value at %ld index of the list \n",index, ii);\ + if(var_list->current_list){\ + list_to_add->preview = (var_list->current_list)->preview;\ + list_to_add->next = var_list->current_list;\ + if(list_to_add->preview)\ + (list_to_add->preview)->next = list_to_add;\ + else var_list->begin_list = list_to_add;\ + (var_list->current_list)->preview = list_to_add;\ + var_list->current_list = list_to_add;\ + }\ + }\ + ++(var_list->size);\ + }\ + void remove_index_from_list_##type(struct main_list_##type *var_list, size_t index ){\ + if( index == move_current_to_index_list_##type(var_list, index)) {\ + struct list_##type * list_tmp_prev = (var_list->current_list)->preview;\ + struct list_##type * list_tmp_next = (var_list->current_list)->next;\ + if(list_tmp_prev){\ + list_tmp_prev->next = list_tmp_next;\ + if(list_tmp_next) list_tmp_next->preview = list_tmp_prev;\ + }\ + free(var_list->current_list);\ + var_list->current_list = list_tmp_next;\ + --(var_list->size);\ + \ + }\ + }\ + void free_all_var_list_##type(struct main_list_##type *var_list){\ + struct list_##type *tmp = var_list->begin_list;\ + while(tmp){\ + var_list->current_list = tmp;\ + tmp = tmp->next;\ + free(var_list->current_list);\ + }\ + free(var_list);\ + }\ + void increment_list_##type(struct main_list_##type * var_list){\ + var_list->current_list = (var_list->current_list)->next;\ + ++(var_list->current_index);\ + }\ + void decrement_list_##type(struct main_list_##type * var_list){\ + var_list->current_list = (var_list->current_list)->preview;\ + --(var_list->current_index);\ + }\ + + + +GEN_LIST_ALL(TYPE_CHAR) +GEN_LIST_ALL(TYPE_U_CHAR) +GEN_LIST_ALL(TYPE_INT) +GEN_LIST_ALL(TYPE_U_INT) +GEN_LIST_ALL(TYPE_L_INT) +GEN_LIST_ALL(TYPE_U_L_INT) +GEN_LIST_ALL(TYPE_SIZE_T) +GEN_LIST_ALL(TYPE_FLOAT) +GEN_LIST_ALL(TYPE_DOUBLE) +GEN_LIST_ALL(TYPE_L_DOUBLE) +GEN_LIST_ALL(TYPE_STRING) + +GEN_LIST_ALL(TYPE_PTR) + + diff --git a/list_t/src/list_t/list_t.h b/list_t/src/list_t/list_t.h new file mode 100644 index 0000000..d4f3ca6 --- /dev/null +++ b/list_t/src/list_t/list_t.h @@ -0,0 +1,47 @@ +#ifndef __LIST_T_C__H +#define __LIST_T_C__H + +#include "tools_t/tools_t.h" + +#define TYPE_PTR void* + +#define GENERATE_LIST_ALL(type)\ + struct list_##type {\ + type value;\ + struct list_##type *preview;\ + struct list_##type *next;\ + };\ + struct main_list_##type {\ + struct list_##type *begin_list;\ + struct list_##type *current_list;\ + size_t current_index;\ + struct list_##type *end_list;\ + size_t size;\ + };\ + struct main_list_##type *create_var_list_##type();\ + void push_back_list_##type(struct main_list_##type *var_list, type value);\ + void push_front_list_##type(struct main_list_##type *var_list, type value);\ + size_t move_current_to_index_list_##type(struct main_list_##type *var_list, size_t index);\ + void insert_into_list_##type(struct main_list_##type *var_list, size_t index, type value );\ + void remove_index_from_list_##type(struct main_list_##type *var_list, size_t index );\ + void free_all_var_list_##type(struct main_list_##type *var_list);\ + void increment_list_##type(struct main_list_##type * var_list);\ + void decrement_list_##type(struct main_list_##type * var_list);\ + + +GENERATE_LIST_ALL(TYPE_CHAR) +GENERATE_LIST_ALL(TYPE_U_CHAR) +GENERATE_LIST_ALL(TYPE_INT) +GENERATE_LIST_ALL(TYPE_U_INT) +GENERATE_LIST_ALL(TYPE_L_INT) +GENERATE_LIST_ALL(TYPE_U_L_INT) +GENERATE_LIST_ALL(TYPE_SIZE_T) +GENERATE_LIST_ALL(TYPE_FLOAT) +GENERATE_LIST_ALL(TYPE_DOUBLE) +GENERATE_LIST_ALL(TYPE_L_DOUBLE) +GENERATE_LIST_ALL(TYPE_STRING) + +GENERATE_LIST_ALL(TYPE_PTR) + + +#endif /* __LIST_T_C__H */ diff --git a/list_t/test/Makefile b/list_t/test/Makefile new file mode 100644 index 0000000..cedecc1 --- /dev/null +++ b/list_t/test/Makefile @@ -0,0 +1,60 @@ + + + + +NAME_TEST=is_good +CC=gcc +ROOT_DIR=$(PWD) +YTESTDIR=$(PWD)/../../ytest_t + +INCLUDE_DIR=$(PWD)/../src +CFLAGS=-I$(INCLUDE_DIR) -I$(YTESTDIR)/include_ytest/include +LDFLAGS=-L$(YTESTDIR) -lytest + +#SRC_DIR=$(ROOT_DIR)/src +#SRC=$(wildcard */*/*.c) +SRC=$(wildcard **/**/*.c) +#HEADS=$(OBJS:.o=.h) +TEST_DIR=$(PWD) +EXECSRC=$(NAME_TEST).c +EXEC=launch_$(NAME_TEST)_m + +LISTDIR=$(PWD)/.. + +LISTSRC_O=$(LISTDIR)/src/list_t/list_t.o + +TOPTARGETS := all clean + +DEPS=$(LISTDIR) $(YTESTDIR) + +$(TOPTARGETS): $(DEPS) + +$(DEPS): + $(MAKE) -C $@ $(MAKECMDGOALS) + + +#LISTSRC_O=$(LISTSRC:.c=.o) +#SETTSRC_O=$(PWD)/../src/set_theoric_t/set_theoric_t.o +#SETTSRC_O=$(SETTSRC:.c=.o) +#TOOLSRC=$(TOOLDIR)/src/tools_t/tools_t.c +#TOOLSRC_O=$(TOOLSRC:.c=.o) + +OBJ=$(SRC:.c=.o) $(LISTSRC_O) + +LIB_YTEST=$(YTESTDIR)/libytest.so + +all: $(EXEC) $(LIB_YTEST) + +$(EXEC): $(EXECSRC) $(OBJ) + $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) + +.PHONY: clean mrproper + +clean: + rm -f $(OBJ) + +mrproper: clean + rm -f $(EXEC) + +run: $(EXEC) + $(EXEC) -h diff --git a/list_t/test/compile.sh b/list_t/test/compile.sh new file mode 100644 index 0000000..91c319a --- /dev/null +++ b/list_t/test/compile.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +if [ "$#" -le 0 ] ; then + echo "Usage: $0 is_good.c" >&2 + echo "for example to compile: is_good.c" >&2 + exit 1 +fi +if [ "$#" -le 1 ] ; then + echo "Usage: $0 $1" >&2 + echo " we can add more option for example '-D DEBUG=1' to have debug print, '-D HK' to have gtest like prompt, od '-g' to gbd" >&2 + echo "for example: $0 $1 \"-D DEBUG=1 -D HK -g\"" +fi + +DIR_YTEST=$PWD/../../ytest_t +SRC=../src + +gcc -o launch_is_good_c $1 -L$DIR_YTEST $2 -lytest -I$DIR_YTEST/include_ytest/include $SRC/list_t/list_t.c -I$SRC +#gcc -o launch_is_good_c $1 $2 -lytest -I../include_ytest src/list_t/list_t.o src/set_theoric_t/set_theoric_t.o -I./src + +export LD_LIBRARY_PATH=$DIR_YTEST/:LD_LIBRARY_PATH + + +#gcc $1 src/ftest/ftest.c src/fmock/fmock.c src/tools_t/tools_t.c src/bar_progress/bar_progress.c src/list_t/list_t.c src/set_theoric_t/set_theoric_t.c -I./include $2 -o launch_is_good_c -lpthread diff --git a/list_t/test/is_good.c b/list_t/test/is_good.c new file mode 100644 index 0000000..b773adf --- /dev/null +++ b/list_t/test/is_good.c @@ -0,0 +1,84 @@ +#include "ftest/ftest.h" +#include "fmock/fmock.h" + + +#include "list_t/list_t.h" + + +TEST(list_create){ + struct main_list_TYPE_INT * var_list_int = create_var_list_TYPE_INT(); + + push_back_list_TYPE_INT(var_list_int, 9); + push_back_list_TYPE_INT(var_list_int, -9); + push_back_list_TYPE_INT(var_list_int, 19); + + move_current_to_index_list_TYPE_INT(var_list_int, 0); + while(var_list_int->current_list){ + LOG("cur %ld : %d : size :%ld \n", var_list_int->current_index, (var_list_int->current_list)->value, var_list_int->size); + increment_list_TYPE_INT(var_list_int); + } + + LOG("%s"," =============== \n"); + for(move_current_to_index_list_TYPE_INT(var_list_int, (var_list_int->size) - 1); var_list_int->current_list; decrement_list_TYPE_INT(var_list_int)) + LOG("cur %ld : %d : size :%ld \n", var_list_int->current_index, (var_list_int->current_list)->value, var_list_int->size); + + free_all_var_list_TYPE_INT(var_list_int); + +} + +TEST(insert){ + struct main_list_TYPE_INT * var_list_int = create_var_list_TYPE_INT(); + + for(int i=0; i<5; ++i) + push_back_list_TYPE_INT(var_list_int, i); + + for(int i=0; i<10; ++i) + insert_into_list_TYPE_INT(var_list_int, i, -2*i+1); + + for(int i=var_list_int->size; i< 25; ++i) + insert_into_list_TYPE_INT(var_list_int, i, 3*i+1); + + for(move_current_to_index_list_TYPE_INT(var_list_int, 0); var_list_int->current_list; increment_list_TYPE_INT(var_list_int)) + LOG("cur %ld : %d : size :%ld \n", var_list_int->current_index, (var_list_int->current_list)->value, var_list_int->size); + + free_all_var_list_TYPE_INT(var_list_int); + +} + + +TEST(remove){ + struct main_list_TYPE_INT * var_list_int = create_var_list_TYPE_INT(); + + for(int i=0; i<5; ++i) + push_back_list_TYPE_INT(var_list_int, i); + + for(int i=0; i<10; ++i) + insert_into_list_TYPE_INT(var_list_int, i, -2*i+1); + + for(int i=var_list_int->size; i< 25; ++i) + insert_into_list_TYPE_INT(var_list_int, i, 3*i+1); + + for(move_current_to_index_list_TYPE_INT(var_list_int, 0); var_list_int->current_list; increment_list_TYPE_INT(var_list_int)) + LOG("cur %ld : %d : size :%ld \n", var_list_int->current_index, (var_list_int->current_list)->value, var_list_int->size); + + + for(int i=1; isize; i+= 3) + remove_index_from_list_TYPE_INT(var_list_int, i); + + LOG("%s"," =============== \n"); + + for(move_current_to_index_list_TYPE_INT(var_list_int, 0); var_list_int->current_list; increment_list_TYPE_INT(var_list_int)) + LOG("cur %ld : %d : size :%ld \n", var_list_int->current_index, (var_list_int->current_list)->value, var_list_int->size); + + free_all_var_list_TYPE_INT(var_list_int); + +} + + +int main(int argc, char **argv){ + + + run_all_tests_args(argc, argv); + + return 0; +}