/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* p_subst_vars.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 "d_define.h" #include "s_struct.h" #include "u_parse.h" #include "u_utils.h" #include "u_vars.h" static char *p_double_them_bs(char varval[]) { char *ptr; ptr = varval; while (*ptr != C_NUL) { if (*ptr == C_BACKS) { ptr = ft_memmove(ptr + 1, ptr, ft_strlen(ptr) + 1); varval[ptr - varval] = C_BACKS; } ptr++; } return (varval); } static void p_subst_this_var(char **p, long i, char word[], t_msh *msh) { char tmp[ARG_MAX]; char varval[ARG_MAX]; char *ptr; size_t varlen; ptr = word; varlen = i + 1; while (ptr[varlen] != C_NUL && ft_ischarset("$=\\/@%^*+{}[]<>(),.-", ptr[varlen]) == FALSE && ft_iswhitespace(ptr[varlen]) == FALSE) varlen += 1; ft_strlcpy(tmp, ptr + i, varlen + 1 - i); u_get_var_value(varval, tmp, ARG_MAX, msh); p_double_them_bs(varval); (void)ft_memmove(ptr + (i + ft_strlen(varval)), ptr + varlen, (ft_strlen(ptr + varlen) + 1) * sizeof(char)); (void)ft_memmove(word + i, varval, ft_strlen(varval) * sizeof(char)); *(p) = word + (i + ft_strlen(varval) - 1); } void p_subst_vars(char word[], t_msh *msh) { char *ptr; t_quote_mode mode; mode = Q_NONE; ptr = word; while (*ptr != C_NUL) { if (*ptr == C_DQUOTE) mode = u_meet_dquote(word, ptr, mode); else if (*ptr == C_SQUOTE) mode = u_meet_squote(word, ptr, mode); if ((mode == Q_NONE || mode == Q_DOUBLE) && *ptr == C_DOLLAR && u_is_not_escaped(word, ptr) == TRUE) { p_subst_this_var(&ptr, (ptr - word), word, msh); } ptr++; } }