/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* ft_s_lcom.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ /* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include #include #include "ft_s_struct.h" static int8_t ft_fill_lcom(char *words[], t_lcom **lcom) { uint64_t i; uint64_t j; i = 0; if (!((*lcom)->com = (char*)malloc((ft_strlen(words[0]) + 1) * sizeof(char)))) return (-1); ft_strlcpy((*lcom)->com, words[0], ft_strlen(words[0]) + 1); while(words[i + 1]) i++; if (!((*lcom)->args = (char**)malloc((i + 1) * sizeof(char*)))) return (-1); j = 0; if (i > 0) { while (j < i) { if (!((*lcom)->args[j] = (char*)malloc((ft_strlen(words[j + 1]) + 1) * sizeof(char)))) return (-1); ft_strlcpy((*lcom)->args[j], words[j + 1], ft_strlen(words[j + 1]) + 1); j++; } } (*lcom)->args[j] = 0; return (0); } t_lcom *ft_lcom_last(t_lcom *lcom) { while (lcom->next != NULL) lcom = lcom->next; return (lcom); } void ft_lcom_add_back(t_lcom **alcom, t_lcom *new) { t_lcom *tmp; if (!*alcom) *alcom = new; else { tmp = ft_lcom_last(*alcom); tmp->next = new; } } void ft_lcom_clear(t_lcom **lcom) { t_lcom *tmp; t_lcom *renext; if (!lcom) return ; tmp = *lcom; while (tmp) { renext = tmp->next; ft_memdel((void*)&tmp->com); if (tmp->args) ft_delwords(tmp->args); ft_memdel((void*)&tmp); tmp = renext; } *lcom = NULL; } t_lcom *ft_lcom_new(const char word[]) { t_lcom *link; char **words; if (!(link = (t_lcom*)malloc(sizeof(t_lcom)))) return (NULL); if (!(words = ft_split(word, ' '))) return (NULL); if (ft_fill_lcom(words, &link) < 0) { ft_delwords(words); return (NULL); } link->next = NULL; ft_delwords(words); return (link); }