From 7cad49bd96a1798b5e742ff85084ddc188f7362b Mon Sep 17 00:00:00 2001 From: salad Date: Mon, 31 Aug 2020 14:52:48 +0200 Subject: start normng --- src/p_lcom_next.c | 119 +--------------------------------------------- src/p_lcom_next.h | 2 - src/p_lcom_vars.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/p_lcom_vars.h | 24 ++++++++++ src/s_com.c | 19 ++++---- 5 files changed, 173 insertions(+), 130 deletions(-) create mode 100644 src/p_lcom_vars.c create mode 100644 src/p_lcom_vars.h (limited to 'src') diff --git a/src/p_lcom_next.c b/src/p_lcom_next.c index b04d393..5e5b69d 100644 --- a/src/p_lcom_next.c +++ b/src/p_lcom_next.c @@ -20,108 +20,9 @@ #include "s_struct.h" #include "u_vars.h" #include "u_vars_next.h" +#include "p_lcom_vars.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]) == FALSE) - 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]) == FALSE) - i++; - while (redir > 0 && ft_isdigit(word[i]) == TRUE) - 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); -} - -char - **p_subst_home(char *words[], - t_msh *msh) -{ - char *path; - char **ptr; - - if ((path = u_get_var_value("$HOME", msh)) == NULL) - return (words); - ptr = words; - while (*ptr != NULL) - { - if (*ptr[0] == '~') - { - *ptr = ft_strsubst(*ptr, "~", path); - } - ptr++; - } - ft_memdel((void*)&path); - return (words); -} +/* TODO: norme : 2 fonctions + de 35l*/ static void p_register_word(char word[], @@ -197,22 +98,6 @@ static char 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) diff --git a/src/p_lcom_next.h b/src/p_lcom_next.h index dea86bd..51106e0 100644 --- a/src/p_lcom_next.h +++ b/src/p_lcom_next.h @@ -18,8 +18,6 @@ #include "s_struct.h" char **p_subst_vars(char *words[], t_msh *msh); -char **p_subst_args(const char word[], int8_t redir); -char **p_subst_home(char *word[], t_msh *msh); char **p_check_args_equals(char *words[], t_msh *msh); #endif diff --git a/src/p_lcom_vars.c b/src/p_lcom_vars.c new file mode 100644 index 0000000..754333c --- /dev/null +++ b/src/p_lcom_vars.c @@ -0,0 +1,139 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* 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" + + +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]) == FALSE) + 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); +} + +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_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]) == FALSE) + i++; + while (redir > 0 && ft_isdigit(word[i]) == TRUE) + 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); +} + +char + **p_subst_home(char *words[], + t_msh *msh) +{ + char *path; + char **ptr; + + if ((path = u_get_var_value("$HOME", msh)) == NULL) + return (words); + ptr = words; + while (*ptr != NULL) + { + if (*ptr[0] == '~') + { + *ptr = ft_strsubst(*ptr, "~", path); + } + ptr++; + } + ft_memdel((void*)&path); + return (words); +} diff --git a/src/p_lcom_vars.h b/src/p_lcom_vars.h new file mode 100644 index 0000000..d0732ef --- /dev/null +++ b/src/p_lcom_vars.h @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* p_lcom_vars.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef P_LCOM_VARS_H +#define P_LCOM_VARS_H + +#include + +#include "s_struct.h" + +void p_add_to_env_fork(int64_t i, char *words[], t_msh *msh); +char **p_subst_args(const char word[], int8_t redir); +char **p_subst_home(char *word[], t_msh *msh); + +#endif diff --git a/src/s_com.c b/src/s_com.c index 550616c..a9d8f84 100644 --- a/src/s_com.c +++ b/src/s_com.c @@ -16,17 +16,18 @@ #include "f_fail.h" #include "p_lcom.h" #include "p_lcom_next.h" +#include "p_lcom_vars.h" #include "s_struct.h" static int8_t fill_com(char *words[], t_com **com) { - /* TODO: norme */ - uint64_t i; - uint64_t j; + /* TODO: norme is bav (for now)*/ + int64_t i; + int64_t j; - i = 0; + i = -1; if (words[0]) { if (((*com)->bin = (char*)malloc((ft_strlen(words[0]) + 1) * @@ -36,23 +37,19 @@ static int8_t } else return (0); - while(words[i]) + while(words[++i]) { /* TODO: cut fd number "msh ~> echo a 2>file" */ /* ^ */ if (ft_ischarset("<>", words[i][0]) == TRUE) break ; - i++; } if (!((*com)->argv = (char**)malloc((i + 1) * sizeof(char*)))) return (-1); - j = 0; - while (i > 0 && j < i) - { + j = -1; + while (++j < i) if (!((*com)->argv[j] = ft_strdup(words[j]))) return (-1); - j++; - } (*com)->argv[j] = 0; return (0); } -- cgit v1.2.3