/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* p_line_next.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_enum.h" #include "s_destroy.h" #include "f_fail.h" #include "s_struct.h" #include "u_vars.h" #include "u_vars_next.h" /* TODO: norme */ static int8_t subst_those_vars(int64_t i, char **p_words, t_msh *msh) { size_t varlen; char *s_varname; char *varval; varval = NULL; s_varname = NULL; varlen = i + 1; while ((*p_words)[varlen] != '\0' && !ft_ischarset("$=/#@%^*+{}[],.-", (*p_words)[varlen])) varlen += 1; if (!(s_varname = ft_substr(*p_words, (uint32_t)i, varlen - i))) return (-1); varval = u_get_var_value(s_varname, msh); *p_words = ft_strsubst(*p_words, s_varname, varval); ft_memdel((void*)&s_varname); ft_memdel((void*)&varval); return (0); } char **p_subst_vars(char *words[], t_msh *msh) { char **p_words; int64_t i; p_words = words; i = 0; while (*p_words) { while ((i = ft_strlchr((*p_words), '$')) != -1) { if (*(*p_words) + i - 1 != '\\') { if (subst_those_vars(i, p_words, msh) != 0) return (NULL); } } p_words += 1; } return (words); } char **p_subst_args(const char word[], int8_t redir) { char **words; char *subst; size_t i; if (redir == 0) { if (!(words = ft_split(word, ' '))) return (NULL); return (words); } i = 0; while (word[i] && !ft_ischarset("<>", word[i])) i++; while (redir > 0 && ft_isdigit(word[i])) i--; if (!(subst = ft_substr(word, 0, i))) return (NULL); if (!(words = ft_split(subst, ' '))) { ft_memdel((void*)&subst); return (NULL); } ft_memdel((void*)&subst); return (words); } static void p_register_word(char word[], t_msh *msh) { char name[255]; char val[255]; char *ptr; size_t i; name[0] = '$'; ptr = word; i = 1; while (*ptr != '=' && *ptr != '\0') { name[i] = *ptr; i++; ptr++; } name[i] = '\0'; ptr++; i = 0; while (*ptr != '\0') { val[i] = *ptr; i++; ptr++; } val[i] = '\0'; u_subst_var_value(name, val, msh); } static char **p_add_to_variables_and_delete(char *words[], t_bool reg, int64_t i, t_msh *msh) { int64_t j; int64_t k; char **rewords; j = 0; if (reg == TRUE) { while (words[j] && j < i) { p_register_word(words[j], msh); j++; } } j = 0; while (words[i + j] != NULL) j++; if (!(rewords = (char**)malloc((j + 1) * sizeof(char*)))) { ft_delwords(words); f_alloc_and_destroy_msh(msh); } k = i; while (i - k < j) { if (!(rewords[i - k] = ft_strdup(words[i]))) { ft_delwords(words); f_alloc_and_destroy_msh(msh); } i++; } rewords[i - k] = 0; ft_delwords(words); i++; return (rewords); } static void p_add_to_env_fork(int64_t i, char *words[], t_msh *msh) { int64_t j; j = 0; while(j < i) { ft_strlcpy(msh->env_fork_tmp[j], words[j], ft_strlen(words[j]) + 1); j++; } msh->env_fork_tmp[j][0] = '\0'; } char **p_check_args_equals(char *words[], t_msh *msh) { char *ptr; t_bool reg; t_bool isvar; int64_t i; i = 0; reg = FALSE; isvar = FALSE; while (words[i]) { ptr = words[i]; while (*ptr != '\0' && *ptr != '=') ptr++; if (*ptr == '=') { reg = TRUE; isvar = TRUE; } if (*ptr == '\0' || words[i][0] == '=' || ft_isdigit(words[i][0]) == 1) { reg = FALSE; if (i == 0) isvar = FALSE; if (isvar == TRUE) p_add_to_env_fork(i, words, msh); else msh->env_fork_tmp[0][0] = '\0'; break ; } i++; } if (isvar == TRUE) return (p_add_to_variables_and_delete(words, reg, i, msh)); return (words); }