From 26652ca5795073033f965acdb560504be7b03cc3 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Fri, 28 Oct 2016 21:23:13 +0200 Subject: [PATCH] new dlst for minishell project --- libft/includes/dlst.h | 15 ++++++++ libft/includes/ftprintf.h | 1 - libft/includes/getnextline.h | 4 ++- libft/includes/libft.h | 47 +++++-------------------- libft/includes/lst.h | 40 +++++++++++++++++++++ libft/src/dlst/ft_dlst_add_after.c | 16 +++++++++ libft/src/dlst/ft_dlst_add_before.c | 16 +++++++++ libft/src/dlst/ft_dlst_delone.c | 22 ++++++++++++ libft/src/dlst/ft_dlst_last.c | 8 +++++ libft/src/dlst/ft_dlst_new.c | 27 ++++++++++++++ libft/src/dlst/ft_dlst_size.c | 24 +++++++++++++ libft/src/dlst/ft_dlstrtostr.c | 20 +++++++++++ libft/src/get_next_line/get_next_line.c | 7 +--- libft/src/lst/ft_lstadd.c | 10 ------ libft/src/printing/ft_putchar.c | 3 +- libft/src/sstr/ft_sstrdel.c | 13 +++++++ libft/src/str/ft_split_whitespaces.c | 25 ++++++------- libft/src/str/ft_strcut.c | 12 +++++++ libft/src/str/ft_strdel.c | 3 +- libft/src/str/ft_strsplit.c | 2 ++ 20 files changed, 242 insertions(+), 73 deletions(-) create mode 100644 libft/includes/dlst.h create mode 100644 libft/includes/lst.h create mode 100644 libft/src/dlst/ft_dlst_add_after.c create mode 100644 libft/src/dlst/ft_dlst_add_before.c create mode 100644 libft/src/dlst/ft_dlst_delone.c create mode 100644 libft/src/dlst/ft_dlst_last.c create mode 100644 libft/src/dlst/ft_dlst_new.c create mode 100644 libft/src/dlst/ft_dlst_size.c create mode 100644 libft/src/dlst/ft_dlstrtostr.c delete mode 100644 libft/src/lst/ft_lstadd.c create mode 100644 libft/src/sstr/ft_sstrdel.c create mode 100644 libft/src/str/ft_strcut.c diff --git a/libft/includes/dlst.h b/libft/includes/dlst.h new file mode 100644 index 00000000..58c1e569 --- /dev/null +++ b/libft/includes/dlst.h @@ -0,0 +1,15 @@ +typedef struct s_dlist +{ + void *content; + size_t content_size; + struct s_dlist *next; + struct s_dlist *prev; +} t_dlist; + +void ft_dlst_add_after(t_dlist **alst, t_dlist *new); +void ft_dlst_add_before(t_dlist **alst, t_dlist *new); +void ft_dlst_delone(t_dlist **alst, void (*del)(void *, size_t)); +int ft_dlst_size(t_dlist *list); +t_dlist *ft_dlst_new(void const *content, size_t content_size); +t_dlist *ft_dlst_last(t_dlist *list); +char *ft_dlsttostr(t_dlist *list); diff --git a/libft/includes/ftprintf.h b/libft/includes/ftprintf.h index 9118f8a5..c89282c1 100644 --- a/libft/includes/ftprintf.h +++ b/libft/includes/ftprintf.h @@ -41,7 +41,6 @@ void ft_printf_parse_width(t_fmt *fmt, char **format, va_list ap); void ft_printf_parse_precision(t_fmt *fmt, char **format, va_list ap); void ft_printf_parse_modifiers(t_fmt *fmt, char **format); -int ft_printf(const char *format, ...); char *ft_transform(t_fmt *fmt, va_list ap); void ft_fmt_error_conv(char conv); diff --git a/libft/includes/getnextline.h b/libft/includes/getnextline.h index 57e83db7..254ff862 100644 --- a/libft/includes/getnextline.h +++ b/libft/includes/getnextline.h @@ -1,6 +1,8 @@ #ifndef GET_NEXT_LINE_H # define GET_NEXT_LINE_H -# define BUFF_SIZE 1 + +# include "libft.h" +# define BUFF_SIZE 10 int get_next_line(int const fd, char **line); diff --git a/libft/includes/libft.h b/libft/includes/libft.h index 1fcfdaea..ccbb5412 100644 --- a/libft/includes/libft.h +++ b/libft/includes/libft.h @@ -1,9 +1,9 @@ #ifndef LIBFT_H #define LIBFT_H -# include "ftprintf.h" # include "ftxattr.h" -# include "getnextline.h" +# include "lst.h" +# include "dlst.h" # include # include @@ -11,7 +11,7 @@ # include # include -# define FT_SEP(x) (x == ' ' || x == '\t' || x == '\n') +# define FT_WS(x) (x == ' ' || x == '\t' || x == '\n') # define FT_ABS(x) (((x) < 0) ? -(x) : (x)) # define FT_NEG(x) (((x) < 0) ? 1 : 0) # define FT_POS(x) (((x) > 0) ? 1 : 0) @@ -19,13 +19,6 @@ # define FT_MAX(a, b) ((a) > (b) ? (a) : (b)) # define FT_DIST(a, b) (FT_ABS((a) - (b))) -typedef struct s_list -{ - void *content; - size_t content_size; - struct s_list *next; -} t_list; - void ft_debug(void); void *ft_memset(void *b, int c, size_t len); @@ -73,7 +66,7 @@ char *ft_strjoin(char const *s1, char const *s2); char *ft_strtrim(char const *s); char **ft_strsplit(char const *s, char c); char *ft_itoa(int n); -void ft_putchar(char c); +int ft_putchar(int c); void ft_putstr(char const *s); void ft_putendl(char const *s); void ft_putnbr(int n); @@ -82,37 +75,10 @@ void ft_putstr_fd(char const *s, int fd); void ft_putendl_fd(char const *s, int fd); void ft_putnbr_fd(int n, int fd); -t_list *ft_lstnew(void const *content, size_t content_size); -void ft_lstdelone(t_list **alst, void (*del)(void *, size_t)); -void ft_lstadd(t_list **alst, t_list *new); -void ft_lstiter(t_list *lst, void (*f)(t_list *elem)); -t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)); - -void ft_lst_sort(t_list **begin_list, int (*cmp)()); -void ft_lst_print(t_list *list, void (*printer)()); -int ft_lstsize(t_list *lst); -void ft_lsteadd(t_list **alst, t_list *new); -void ft_lstnadd(t_list **alst, t_list *new, int n); -t_list *ft_lstlast(t_list *lst); -void ft_lst_sorted_merge(t_list **begin_list1, t_list *begin_list2, int (*cmp)()); -void ft_lst_sorted_insert(t_list **begin_list, t_list *insert, int (*cmp)()); -t_list *ft_lstnew_range(int a, int b); -void ft_lst_delif(t_list **alist, void *data_ref, int (*cmp)(), void (*del)(void *, size_t)); -void ft_lst_delsub(t_list **alst, t_list *sub, int (*cmp)(), void (*del)(void *, size_t)); -void ft_lst_cfree(void *ptr, size_t size); -t_list *ft_lst_filter(t_list *lst, void const *data_ref, t_list *(*f)(t_list *elem, void const *)); -t_list *ft_lst_removeif(t_list **alst, void *data_ref, int (*cmp)()); -t_list *ft_lst_find(t_list *begin_list, void *data_ref, int (*cmp)()); -t_list *ft_lstpop(t_list **lst); -void ft_lst_merge(t_list **begin_list1, t_list *begin_list2); -void ft_lst_reverse(t_list **begin_list); - -int ft_diff(void *a, void *b); -t_list *ft_id(t_list *a); - char *ft_strrev(char *str); char **ft_strsplit(char const *s, char c); char *ft_str3join(char const *s1, char const *s2, char const *s3); +char *ft_strcut(char *str, char *cut); char **ft_split_whitespaces(char *str); char *ft_convert_base(char *str, char *base_from, char *base_to, char *flags); @@ -127,8 +93,11 @@ void ft_sstrsort(char **list, int size, int (*cmp)()); void ft_sstrprint(char **list, char sep); char **ft_sstrdup(char **list); char **ft_sstradd(char **list, char *new); +void ft_sstrdel(char **sstr, int index); int ft_time_isrecent(time_t event); char *ft_path_notdir(char *path); + +int ft_printf(const char *format, ...); #endif diff --git a/libft/includes/lst.h b/libft/includes/lst.h new file mode 100644 index 00000000..fdec98d4 --- /dev/null +++ b/libft/includes/lst.h @@ -0,0 +1,40 @@ +#ifndef LST_H +# define LST_H + +typedef struct s_list +{ + void *content; + size_t content_size; + struct s_list *next; +} t_list; + +t_list *ft_lstnew(void const *content, size_t content_size); +void ft_lstdelone(t_list **alst, void (*del)(void *, size_t)); +void ft_lstadd(t_list **alst, t_list *new); +void ft_lstiter(t_list *lst, void (*f)(t_list *elem)); +t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)); + +void ft_lst_sort(t_list **begin_list, int (*cmp)()); +void ft_lst_print(t_list *list, void (*printer)()); +int ft_lstsize(t_list *lst); +void ft_lsteadd(t_list **alst, t_list *new); +void ft_lstnadd(t_list **alst, t_list *new, int n); +t_list *ft_lstlast(t_list *lst); +void ft_lst_sorted_merge(t_list **begin_list1, t_list *begin_list2, int (*cmp)()); +void ft_lst_sorted_insert(t_list **begin_list, t_list *insert, int (*cmp)()); +t_list *ft_lstnew_range(int a, int b); +void ft_lst_delif(t_list **alist, void *data_ref, int (*cmp)(), void (*del)(void *, size_t)); +void ft_lst_delsub(t_list **alst, t_list *sub, int (*cmp)(), void (*del)(void *, size_t)); +void ft_lst_cfree(void *ptr, size_t size); + +t_list *ft_lst_filter(t_list *lst, void const *data_ref, t_list *(*f)(t_list *elem, void const *)); +t_list *ft_lst_removeif(t_list **alst, void *data_ref, int (*cmp)()); +t_list *ft_lst_find(t_list *begin_list, void *data_ref, int (*cmp)()); +t_list *ft_lstpop(t_list **lst); +void ft_lst_merge(t_list **begin_list1, t_list *begin_list2); +void ft_lst_reverse(t_list **begin_list); + +int ft_diff(void *a, void *b); +t_list *ft_id(t_list *a); + +#endif diff --git a/libft/src/dlst/ft_dlst_add_after.c b/libft/src/dlst/ft_dlst_add_after.c new file mode 100644 index 00000000..90b96499 --- /dev/null +++ b/libft/src/dlst/ft_dlst_add_after.c @@ -0,0 +1,16 @@ +#include "libft.h" + +void ft_dlst_add_after(t_dlist **alst, t_dlist *new) +{ + if (new) + { + new->prev = (*alst); + if (*alst) + new->next = (*alst)->next; + if (new->next) + new->next->prev = new; + if (new->prev) + new->prev->next = new; + *alst = new; + } +} diff --git a/libft/src/dlst/ft_dlst_add_before.c b/libft/src/dlst/ft_dlst_add_before.c new file mode 100644 index 00000000..e0c145a4 --- /dev/null +++ b/libft/src/dlst/ft_dlst_add_before.c @@ -0,0 +1,16 @@ +#include "libft.h" + +void ft_dlst_add_before(t_dlist **alst, t_dlist *new) +{ + if (new) + { + new->next = (*alst); + if (*alst) + new->prev = (*alst)->prev; + if (new->next) + new->next->prev = new; + if (new->prev) + new->prev->next = new; + *alst = new; + } +} diff --git a/libft/src/dlst/ft_dlst_delone.c b/libft/src/dlst/ft_dlst_delone.c new file mode 100644 index 00000000..eb4cd604 --- /dev/null +++ b/libft/src/dlst/ft_dlst_delone.c @@ -0,0 +1,22 @@ +#include "libft.h" + +void ft_dlst_delone(t_dlist **alst, void (*del)(void *, size_t)) +{ + t_dlist *tmp; + + tmp = *alst; + if (tmp) + { + if (del) + (*del)(tmp->content, tmp->content_size); + if (tmp->next) + tmp->next->prev = tmp->prev; + if (tmp->prev) + tmp->prev->next = tmp->next; + if (tmp->prev) + *alst = tmp->prev; + else + *alst = tmp->next; + free(tmp); + } +} diff --git a/libft/src/dlst/ft_dlst_last.c b/libft/src/dlst/ft_dlst_last.c new file mode 100644 index 00000000..b536596e --- /dev/null +++ b/libft/src/dlst/ft_dlst_last.c @@ -0,0 +1,8 @@ +#include "libft.h" + +t_dlist *ft_dlst_last(t_dlist *list) +{ + while (list && list->next) + list = list->next; + return (list); +} diff --git a/libft/src/dlst/ft_dlst_new.c b/libft/src/dlst/ft_dlst_new.c new file mode 100644 index 00000000..a7c5143b --- /dev/null +++ b/libft/src/dlst/ft_dlst_new.c @@ -0,0 +1,27 @@ +#include "libft.h" + +t_dlist *ft_dlst_new(void const *content, size_t content_size) +{ + t_dlist *new; + + if (!content) + { + new = malloc(sizeof(*new)); + if (!new) + return (NULL); + new->content_size = 0; + new->content = NULL; + } + else + { + new = (t_dlist *)malloc(sizeof(*new)); + if (!new) + return (NULL); + new->content_size = content_size; + new->content = ft_memalloc(content_size + 1); + ft_memcpy(new->content, content, content_size); + } + new->next = NULL; + new->prev = NULL; + return (new); +} diff --git a/libft/src/dlst/ft_dlst_size.c b/libft/src/dlst/ft_dlst_size.c new file mode 100644 index 00000000..1ed16481 --- /dev/null +++ b/libft/src/dlst/ft_dlst_size.c @@ -0,0 +1,24 @@ +#include "libft.h" + +int ft_dlst_size(t_dlist *list) +{ + int size; + t_dlist *tmp; + + size = 0; + if (list) + size++; + tmp = list; + while (tmp->next) + { + size++; + tmp = tmp->next; + } + tmp = list; + while (tmp->prev) + { + size++; + tmp = tmp->prev; + } + return (size); +} diff --git a/libft/src/dlst/ft_dlstrtostr.c b/libft/src/dlst/ft_dlstrtostr.c new file mode 100644 index 00000000..a2b7ba74 --- /dev/null +++ b/libft/src/dlst/ft_dlstrtostr.c @@ -0,0 +1,20 @@ +#include "libft.h" + +char *ft_dlsttostr(t_dlist *list) +{ + char *str; + + if (!list) + return (NULL); + while (list->prev) + list = list->prev; + str = (char *)ft_strnew(sizeof(char) * (ft_dlst_size(list) + 2)); + /* list = ft_dlst_last(list); */ + while (list) + { + ft_strcat(str, (char *)list->content); + list = list->next; + } + /* str = ft_strrev(str); */ + return (str); +} diff --git a/libft/src/get_next_line/get_next_line.c b/libft/src/get_next_line/get_next_line.c index 29dd45ed..93f145ad 100644 --- a/libft/src/get_next_line/get_next_line.c +++ b/libft/src/get_next_line/get_next_line.c @@ -1,4 +1,4 @@ -#include "libft.h" +#include "getnextline.h" static char *ft_realloc(char *line, int size) { @@ -23,9 +23,6 @@ int get_next_line(int const fd, char **line) *line = ft_strcpy(*line, save); if ((pos = ft_strchr(*line, '\n'))) { - /* printf("found \\n in save\n"); */ - /* fflush(stdout); */ - /* ft_putstr(save); */ ft_strcpy(save, pos + 1); *pos = '\0'; return (1); @@ -33,8 +30,6 @@ int get_next_line(int const fd, char **line) while ((ret = read(fd, buf, BUFF_SIZE)) > 0) { buf[ret] = '\0'; - /* ft_putstr(buf); */ - /* ft_putchar('/'); */ if ((pos = ft_strchr(buf, '\n'))) { ft_strcpy(save, pos + 1); diff --git a/libft/src/lst/ft_lstadd.c b/libft/src/lst/ft_lstadd.c deleted file mode 100644 index 068fdaf3..00000000 --- a/libft/src/lst/ft_lstadd.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "libft.h" - -void ft_lstadd(t_list **alst, t_list *new) -{ - if (new) - { - new->next = *alst; - *alst = new; - } -} diff --git a/libft/src/printing/ft_putchar.c b/libft/src/printing/ft_putchar.c index 70439c66..8336fc99 100644 --- a/libft/src/printing/ft_putchar.c +++ b/libft/src/printing/ft_putchar.c @@ -1,6 +1,7 @@ #include "libft.h" -void ft_putchar(char c) +int ft_putchar(int c) { write(1, &c, 1); + return (0); } diff --git a/libft/src/sstr/ft_sstrdel.c b/libft/src/sstr/ft_sstrdel.c new file mode 100644 index 00000000..41a71411 --- /dev/null +++ b/libft/src/sstr/ft_sstrdel.c @@ -0,0 +1,13 @@ +#include "libft.h" + +void ft_sstrdel(char **sstr, int index) +{ + int i; + + i = index; + while (sstr[i]) + { + sstr[i] = sstr[i + 1]; + i++; + } +} diff --git a/libft/src/str/ft_split_whitespaces.c b/libft/src/str/ft_split_whitespaces.c index 76c8acfd..869ced14 100644 --- a/libft/src/str/ft_split_whitespaces.c +++ b/libft/src/str/ft_split_whitespaces.c @@ -10,10 +10,7 @@ /* */ /* ************************************************************************** */ -#include -#include - -#define SEP(x) (x==' ' || x=='\n' || x=='\t') +#include "libft.h" char **alloc_table(char **table, char *str) { @@ -22,19 +19,19 @@ char **alloc_table(char **table, char *str) i = 0; n_words = 0; - while (SEP(str[i])) + while (FT_WS(str[i])) i++; while (str[i] != '\0') { i++; - if (SEP(str[i])) + if (FT_WS(str[i])) { n_words++; - while (SEP(str[i])) + while (FT_WS(str[i])) i++; } } - if (!SEP(str[i - 1])) + if (!FT_WS(str[i - 1])) n_words++; table = (char**)malloc(sizeof(*table) * (n_words + 1)); table[n_words] = 0x0; @@ -50,17 +47,17 @@ char **alloc_words(char **table, char *str) i = 0; j = 0; k = 0; - while (SEP(str[i])) + while (FT_WS(str[i])) i++; while (str[i] != '\0') { i++; - if (SEP(str[i]) || str[i] == '\0') + if (FT_WS(str[i]) || str[i] == '\0') { table[j] = (char*)malloc(sizeof(**table) * (k + 1)); j++; k = 0; - while (SEP(str[i])) + while (FT_WS(str[i])) i++; } k++; @@ -77,19 +74,19 @@ char **fill_table(char **table, char *str) i = 0; j = 0; k = 0; - while (SEP(str[i])) + while (FT_WS(str[i])) i++; while (str[i] != '\0') { table[j][k] = str[i]; i++; k++; - if (SEP(str[i])) + if (FT_WS(str[i])) { table[j][k] = '\0'; j++; k = 0; - while (SEP(str[i])) + while (FT_WS(str[i])) i++; } } diff --git a/libft/src/str/ft_strcut.c b/libft/src/str/ft_strcut.c new file mode 100644 index 00000000..5dda370e --- /dev/null +++ b/libft/src/str/ft_strcut.c @@ -0,0 +1,12 @@ +#include "libft.h" + +char *ft_strcut(char *str, char *cut) +{ + char *target; + + while ((target = ft_strstr(str, cut))) + { + ft_strcpy(target, target + ft_strlen(cut)); + } + return (str); +} diff --git a/libft/src/str/ft_strdel.c b/libft/src/str/ft_strdel.c index a851f878..fe2d29a5 100644 --- a/libft/src/str/ft_strdel.c +++ b/libft/src/str/ft_strdel.c @@ -2,6 +2,7 @@ void ft_strdel(char **as) { - free(*as); + if (as) + free(*as); *as = NULL; } diff --git a/libft/src/str/ft_strsplit.c b/libft/src/str/ft_strsplit.c index 4eaba8b8..bcb0b09c 100644 --- a/libft/src/str/ft_strsplit.c +++ b/libft/src/str/ft_strsplit.c @@ -85,6 +85,8 @@ char **ft_strsplit(char const *s, char c) { char **table; + if (!s) + return (NULL); table = 0; table = alloc_table(table, s, c); table = alloc_words(table, s, c);