/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* s_com.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 "d_define.h" #include "f_fail.h" #include "p_args.h" #include "p_lblock.h" #include "p_lblock_next.h" >>>>>>> master #include "s_struct.h" static int8_t s_fill_com(char *words[], t_com **com) { /* TODO: norme is bav (for now)*/ int64_t i; int64_t j; i = 0; if (words[0] != NULL) { if (((*com)->bin = (char*)malloc((ft_strlen(words[0]) + 1) * sizeof(char))) == NULL) return (-1); ft_strlcpy((*com)->bin, words[0], ft_strlen(words[0]) + 1); } else return (0); while(words[++i]) { /* TODO: cut fd number "msh ~> echo a 2>file" */ /* ^ */ if (ft_ischarset("<>", words[i][0]) == TRUE) break ; } if (!((*com)->argv = (char**)malloc((i + 1) * sizeof(char*)))) return (-1); j = -1; while (++j < i) if (!((*com)->argv[j] = ft_strdup(words[j]))) return (-1); (*com)->argv[j] = 0; return (0); } static void s_com_cpy_env_fork(t_com **com, t_msh *msh) { size_t i; size_t j; i = 0; while (msh->env_fork_tmp[i][0] != '\0') i++; if (((*com)->env_fork = (char**)malloc((i + 1) * sizeof(char*))) == NULL) f_alloc_and_destroy_msh(msh); j = 0; while (j < i) { if (((*com)->env_fork[j] = ft_strdup(msh->env_fork_tmp[j])) == NULL) f_alloc_and_destroy_msh(msh); j++; } (*com)->env_fork[j] = NULL; } void s_com_destroy(t_com **com) { t_com *ptr; ptr = *com; ft_memdel((void*)&ptr->bin); if (ptr->argv != NULL) ft_delwords(ptr->argv); if (ptr->redir != 0) ft_memdel((void*)&ptr->rdrpath); if (ptr->env_fork != NULL) ft_delwords(ptr->env_fork); ft_memdel((void*)&ptr); } t_com *s_com_new(char word[], t_msh *msh) { char nword[ARG_MAX]; t_com *com; char **words; size_t ret; if ((com = (t_com*)malloc(sizeof(t_com))) == NULL) return (NULL); com->redir = 0; com->bin = NULL; com->argv = NULL; com->rdrfd = 0; com->rdrpath = NULL; com->env_fork = NULL; nword[0] = C_NUL; ft_strlcpy(nword, word, ARG_MAX); if (p_get_redir(nword, &com) != 0) return (NULL); if (msh->alias != NULL) { ret = p_subst_alias(nword, TRUE, msh); while (ret != 0) ret = p_subst_alias(nword, FALSE, msh); } p_subst_vars(nword, msh); if ((words = p_split_args(nword, com->redir)) == NULL) return (NULL); if ((words = p_subst_home(words, msh)) == NULL) return (NULL); words = p_check_args_equals(words, msh); if (msh->env_fork_tmp[0][0] != '\0') s_com_cpy_env_fork(&com, msh); if (s_fill_com(words, &com) < 0) { ft_delwords(words); return (NULL); } ft_delwords(words); return (com); }