diff options
Diffstat (limited to '')
-rw-r--r-- | src/p_lcom_next.c (renamed from src/ft_p_lcom_next.c) | 132 |
1 files changed, 122 insertions, 10 deletions
diff --git a/src/ft_p_lcom_next.c b/src/p_lcom_next.c index 8313b08..997878e 100644 --- a/src/ft_p_lcom_next.c +++ b/src/p_lcom_next.c @@ -1,7 +1,7 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_p_lcom_next.c :+: :+: :+: */ +/* p_lcom_next.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ @@ -14,11 +14,17 @@ #include <stdlib.h> #include <stdint.h> -#include "ft_s_struct.h" -#include "ft_u_vars.h" +#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 - ft_subst_those_vars(int64_t i, + subst_those_vars(int64_t i, char **p_words, t_msh *msh) { @@ -30,11 +36,11 @@ static int8_t s_varname = NULL; varlen = i + 1; while ((*p_words)[varlen] != '\0' && - !ft_ischarset("$=/#@%^*+{}[],.?-", (*p_words)[varlen])) + !ft_ischarset("$=/#@%^*+{}[],.-", (*p_words)[varlen])) varlen += 1; if (!(s_varname = ft_substr(*p_words, (uint32_t)i, varlen - i))) return (-1); - varval = ft_subst_var_value(s_varname, msh); + 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); @@ -42,7 +48,7 @@ static int8_t } char - **ft_subst_vars(char *words[], + **p_subst_vars(char *words[], t_msh *msh) { char **p_words; @@ -56,7 +62,7 @@ char { if (*(*p_words) + i - 1 != '\\') { - if (ft_subst_those_vars(i, p_words, msh) != 0) + if (subst_those_vars(i, p_words, msh) != 0) return (NULL); } } @@ -65,9 +71,8 @@ char return (words); } - char - **ft_subst_args(const char word[], + **p_subst_args(const char word[], int8_t redir) { char **words; @@ -95,3 +100,110 @@ char 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); + s_destroy(msh); + f_fail_alloc(msh); + } + k = i; + while (i - k < j) + { + if (!(rewords[i - k] = ft_strdup(words[i]))) + { + ft_delwords(words); + s_destroy(msh); + f_fail_alloc(msh); + } + i++; + } + rewords[i - k] = 0; + ft_delwords(words); + i++; + return (rewords); +} + +char + **p_check_args_equals(char *words[], + t_msh *msh) +{ + char *ptr; + t_bool reg; + t_bool isvar; + int64_t i; + + i = 0; + reg = TRUE; + isvar = TRUE; + while (words[i]) + { + ptr = words[i]; + while (*ptr != '\0' && *ptr != '=') + ptr++; + if (*ptr == '\0' || words[i][0] == '=' || ft_isdigit(words[i][0])) + { + reg = FALSE; + if (i == 0) + isvar = FALSE; + break ; + } + i++; + } + if (isvar == TRUE) + return (p_add_to_variables_and_delete(words, reg, i, msh)); + return (words); +} |