From 2d32889d6313cf96a825824a5ccd8db4af6eb09c Mon Sep 17 00:00:00 2001 From: hugodu69 Date: Sat, 30 Nov 2019 01:01:52 +0100 Subject: [PATCH] lstmap fonctionne --- srcd/bonus/ft_lstmap.c | 52 +++++++--- srcs/ft_lstmap.c | 217 +++++++++++++++++++++-------------------- 2 files changed, 149 insertions(+), 120 deletions(-) diff --git a/srcd/bonus/ft_lstmap.c b/srcd/bonus/ft_lstmap.c index 26d9002..942efd4 100644 --- a/srcd/bonus/ft_lstmap.c +++ b/srcd/bonus/ft_lstmap.c @@ -16,7 +16,9 @@ */ /* -** #include +** #include +** #include +** #include ** ** typedef struct s_list ** { @@ -57,10 +59,29 @@ ** } ** } ** +** char *ft_strdup(const char *src) +** { +** int i; +** char *str; +** +** i = 0; +** while (src[i] != '\0') +** i++; +** if (!(str = (char*)malloc(sizeof(*str) * (i + 1)))) +** return (NULL); +** while (i-- >= 0) +** str[i + 1] = src[i + 1]; +** return (str); +** } +** ** void *to_uppercase(void *element) ** { -** *(char*)(((t_list*)element)->content) -= 32; -** return (element); +** char *i; +** +** if (!(i = ft_strdup((char*)element))) +** return (NULL); +** *i -= 32; +** return ((void *)i); ** } ** ** void ft_delete(void *element) @@ -76,18 +97,18 @@ ** void *(to_uppercase)(void *); ** void (ft_delete)(void*); ** -** toto = ft_lstnew("a"); +** toto = ft_lstnew("aa"); ** toto->next = ft_lstnew("b"); ** toto->next->next = ft_lstnew("c"); -** printf("toto->data :%c\n",*(char*)(toto->content)); -** printf("toto->nxt->data :%c\n",*(char*)(toto->next->content)); -** printf("toto->nxt->nxt->data:%c\n",*(char*)(toto->next->next->content)); +** printf("toto->data :%s\n",(char*)(toto->content)); +** printf("toto->nxt->data :%s\n",(char*)(toto->next->content)); +** printf("toto->nxt->nxt->data:%s\n",(char*)(toto->next->next->content)); ** printf("toto->nxt->nxt->nxt :%s\n",(char*)(toto->next->next->next)); -** ft_lstmap(toto->next, to_uppercase, ft_delete); +** toto = ft_lstmap(toto, to_uppercase, ft_delete); ** printf("----------------------\n"); -** printf("toto->data :%c\n",*(char*)(toto->content)); -** printf("toto->nxt->data :%c\n",*(char*)(toto->next->content)); -** printf("toto->nxt->nxt->data:%c\n",*(char*)(toto->next->next->content)); +** printf("toto->data :%s\n",(char*)(toto->content)); +** printf("toto->nxt->data :%s\n",(char*)(toto->next->content)); +** printf("toto->nxt->nxt->data:%s\n",(char*)(toto->next->next->content)); ** printf("toto->nxt->nxt->nxt :%s\n",(char*)(toto->next->next->next)); ** return (0); ** } @@ -100,14 +121,17 @@ t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)) t_list *new; t_list *tmp; - if (!lst) + if(!(tmp = ft_lstnew(f(lst->content)))) + { + del(tmp->content); + free(tmp); return (NULL); - tmp = (t_list*)f(lst); + } new = tmp; while (lst->next) { lst = lst->next; - if (!(tmp->next = (t_list*)f(lst))) + if(!(tmp->next = ft_lstnew(f(lst->content)))) { del(tmp->next->content); free(tmp->next); diff --git a/srcs/ft_lstmap.c b/srcs/ft_lstmap.c index aafb820..af76d5c 100644 --- a/srcs/ft_lstmap.c +++ b/srcs/ft_lstmap.c @@ -3,124 +3,129 @@ ** if necessary the function del is used to delete an element */ +/* +** #include +** #include +** #include +** +** typedef struct s_list +** { +** void *content; +** struct s_list *next; +** } t_list; +** +** t_list *ft_lstnew(void *content) +** { +** t_list *lst; +** +** if (!(lst = (t_list *)malloc(sizeof(*lst)))) +** return (NULL); +** if (!content) +** lst->content = NULL; +** else +** lst->content = content; +** lst->next = NULL; +** return (lst); +** } +** +** void ft_lstadd_back(t_list **alst, t_list *new) +** { +** t_list *tmp; +** +** if (alst) +** { +** tmp = *alst; +** if (!tmp) +** *alst = new; +** else +** { +** while (tmp->next) +** tmp = tmp->next; +** tmp->next = new; +** } +** new->next = NULL; +** } +** } +** +** char *ft_strdup(const char *src) +** { +** int i; +** char *str; +** +** i = 0; +** while (src[i] != '\0') +** i++; +** if (!(str = (char*)malloc(sizeof(*str) * (i + 1)))) +** return (NULL); +** while (i-- >= 0) +** str[i + 1] = src[i + 1]; +** return (str); +** } +** +** void *to_uppercase(void *element) +** { +** char *i; +** +** if (!(i = ft_strdup((char*)element))) +** return (NULL); +** *i -= 32; +** return ((void *)i); +** } +** +** void ft_delete(void *element) +** { +** *(char*)element = '\0'; +** } +** +** t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)); +** +** int main(void) +** { +** t_list *toto; +** void *(to_uppercase)(void *); +** void (ft_delete)(void*); +** +** toto = ft_lstnew("aa"); +** toto->next = ft_lstnew("b"); +** toto->next->next = ft_lstnew("c"); +** printf("toto->data :%s\n",(char*)(toto->content)); +** printf("toto->nxt->data :%s\n",(char*)(toto->next->content)); +** printf("toto->nxt->nxt->data:%s\n",(char*)(toto->next->next->content)); +** printf("toto->nxt->nxt->nxt :%s\n",(char*)(toto->next->next->next)); +** toto = ft_lstmap(toto, to_uppercase, ft_delete); +** printf("----------------------\n"); +** printf("toto->data :%s\n",(char*)(toto->content)); +** printf("toto->nxt->data :%s\n",(char*)(toto->next->content)); +** printf("toto->nxt->nxt->data:%s\n",(char*)(toto->next->next->content)); +** printf("toto->nxt->nxt->nxt :%s\n",(char*)(toto->next->next->next)); +** return (0); +** } +*/ - #include - - typedef struct s_list - { - void *content; - struct s_list *next; - } t_list; - - t_list *ft_lstnew(void *content) - { - t_list *lst; - - if (!(lst = (t_list *)malloc(sizeof(*lst)))) - return (NULL); - if (!content) - lst->content = NULL; - else - lst->content = content; - lst->next = NULL; - return (lst); - } - - void ft_lstadd_back(t_list **alst, t_list *new) - { - t_list *tmp; - - if (alst) - { - tmp = *alst; - if (!tmp) - *alst = new; - else - { - while (tmp->next) - tmp = tmp->next; - tmp->next = new; - } - new->next = NULL; - } - } - - void *to_uppercase(void *element) - { - char *i; - - *i = *(char*)element; - *i -= 32; - return ((void *)i); - } - - void ft_delete(void *element) - { - *(char*)element = '\0'; - } - - t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)); - - int main(void) - { - t_list *toto; - void *(to_uppercase)(void *); - void (ft_delete)(void*); - - toto = ft_lstnew("a"); - toto->next = ft_lstnew("b"); - toto->next->next = ft_lstnew("c"); - printf("toto->data :%c\n",*(char*)(toto->content)); - printf("toto->nxt->data :%c\n",*(char*)(toto->next->content)); - printf("toto->nxt->nxt->data:%c\n",*(char*)(toto->next->next->content)); - printf("toto->nxt->nxt->nxt :%s\n",(char*)(toto->next->next->next)); - toto = ft_lstmap(toto, to_uppercase, ft_delete); - printf("toto->data :%c\n",*(char*)(toto->content)); - printf("toto->nxt->data :%c\n",*(char*)(toto->next->content)); - printf("toto->nxt->nxt->data:%c\n",*(char*)(toto->next->next->content)); - printf("toto->nxt->nxt->nxt :%s\n",(char*)(toto->next->next->next)); - return (0); - } - - -//#include "libft.h" +#include "libft.h" t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)) { t_list *new; t_list *tmp; - if (!lst) - return (NULL); - write(1, "o\n", 2); - new = ft_lstnew(""); - tmp = new; - while (lst) + if(!(tmp = ft_lstnew(f(lst->content)))) { - if (!(tmp = ft_lstnew(f(lst->content)))) + del(tmp->content); + free(tmp); + return (NULL); + } + new = tmp; + while (lst->next) + { + lst = lst->next; + if(!(tmp->next = ft_lstnew(f(lst->content)))) { - del(tmp->content); - free(tmp); + del(tmp->next->content); + free(tmp->next); return (NULL); } - lst = lst->next; tmp = tmp->next; } return (new); - - -// tmp = (t_list*)f(lst->content); -// new = tmp; -// while (lst->next) -// { -// lst = lst->next; -// if (!(tmp->next = (t_list*)f(lst->content))) -// { -// del(tmp->next->content); -// free(tmp->next); -// return (NULL); -// } -// tmp = tmp->next; -// } -// return (new); }