diff options
-rw-r--r-- | src/ft_d_define.h | 7 | ||||
-rw-r--r-- | src/ft_p_lcom.c | 2 | ||||
-rw-r--r-- | src/ft_p_lcom_next.c | 38 | ||||
-rw-r--r-- | src/ft_p_lcom_next.h | 4 | ||||
-rw-r--r-- | src/ft_p_line.c | 2 | ||||
-rw-r--r-- | src/ft_s_lcom.c | 24 | ||||
-rw-r--r-- | src/ft_s_lcom.h | 3 | ||||
-rw-r--r-- | src/ft_u_utils.c | 61 | ||||
-rw-r--r-- | src/ft_u_utils.h | 2 | ||||
-rw-r--r-- | src/minishell.c | 1 |
10 files changed, 134 insertions, 10 deletions
diff --git a/src/ft_d_define.h b/src/ft_d_define.h index 89e1106..b1e9a72 100644 --- a/src/ft_d_define.h +++ b/src/ft_d_define.h @@ -33,6 +33,13 @@ #define FT_OPT_COMMAND "-c" /* +** ====== VARS ====== +*/ + +#define FT_ZER_VAR "$0" +#define FT_RET_VAR "$?" + +/* ** ====== FAIL MSG ====== */ diff --git a/src/ft_p_lcom.c b/src/ft_p_lcom.c index a08e8c2..9a7a1b8 100644 --- a/src/ft_p_lcom.c +++ b/src/ft_p_lcom.c @@ -134,7 +134,7 @@ int8_t return (-1); while (i <= count) { - if (!(link = ft_lcom_new(words[i]))) + if (!(link = ft_lcom_new(words[i], msh))) { return (-1); } diff --git a/src/ft_p_lcom_next.c b/src/ft_p_lcom_next.c index df312bc..d1ab206 100644 --- a/src/ft_p_lcom_next.c +++ b/src/ft_p_lcom_next.c @@ -14,6 +14,44 @@ #include <stdlib.h> #include <stdint.h> +#include "ft_s_struct.h" +#include "ft_u_utils.h" + +char + **ft_subst_vars(char *words[], + t_msh *msh) +{ + /* TODO: norme */ + char **p_words; + char **p_env; + char *s_varname; + int64_t i; + size_t varlen; + + p_words = words; + varlen = 0; + while (*p_words) + { + while (varlen < ft_strlen(*p_words) && + (i = ft_strlchr((*p_words) + varlen, '$'))) + { + if (i == -1) + break ; + varlen = i + 1; + while ((*p_words)[varlen] != '\0' && (*p_words)[varlen] != '$') + varlen += 1; + if (!(s_varname = ft_substr(*p_words, (uint32_t)i, varlen))) + return (NULL); + ft_printf("{%s} | {%s}\n", s_varname, ft_subst_var_value(s_varname, msh)); + p_env = msh->envp; + ft_memdel((void*)&s_varname); + varlen += 1; + } + p_words += 1; + } + return (words); +} + char **ft_subst_args(const char word[], int8_t redir) diff --git a/src/ft_p_lcom_next.h b/src/ft_p_lcom_next.h index 6f0c2a8..54eefd2 100644 --- a/src/ft_p_lcom_next.h +++ b/src/ft_p_lcom_next.h @@ -15,6 +15,10 @@ #include <stdint.h> +#include "ft_s_struct.h" + +char **ft_subst_vars(char *words[], + t_msh *msh); char **ft_subst_args(const char word[], int8_t redir); diff --git a/src/ft_p_line.c b/src/ft_p_line.c index 07c5fac..b1ba6b2 100644 --- a/src/ft_p_line.c +++ b/src/ft_p_line.c @@ -17,6 +17,7 @@ #include "ft_f_fail.h" #include "ft_p_lcom.h" #include "ft_p_line.h" +#include "ft_s_destroy.h" #include "ft_s_struct.h" void @@ -42,6 +43,7 @@ void } if (ft_p_lcom(line, count, msh) < 0) { + ft_s_destroy(msh); ft_fail_alloc(msh); } } diff --git a/src/ft_s_lcom.c b/src/ft_s_lcom.c index 03b2f67..ab63414 100644 --- a/src/ft_s_lcom.c +++ b/src/ft_s_lcom.c @@ -106,12 +106,27 @@ void *lcom = NULL; } +/* !!!!!!!!!! ATTENTION !!!!!!!!!!! */ +/* TODO: remove this after tests */ +/* !!!!!!!!!! ATTENTION !!!!!!!!!!! */ +static void +ft_print_words(char *words[]) +{ + while (*words) + { + ft_printf("[%s]\n", *words); + words++; + } +} + t_lcom - *ft_lcom_new(const char word[]) + *ft_lcom_new(const char word[], + t_msh *msh) { t_lcom *link; char **words; + (void)msh; if (!(link = (t_lcom*)malloc(sizeof(t_lcom)))) return (NULL); link->redir = 0; @@ -123,6 +138,13 @@ t_lcom return (NULL); if (!(words = ft_subst_args(word, link->redir))) return (NULL); + if (!(words = ft_subst_vars(words, msh))) + return (NULL); + /* !!!!!!!!!! ATTENTION !!!!!!!!!!! */ + /* TODO: remove this after tests */ + ft_print_words(words); + /* TODO: remove this after tests */ + /* !!!!!!!!!! ATTENTION !!!!!!!!!!! */ if (ft_fill_lcom(words, &link) < 0) { ft_delwords(words); diff --git a/src/ft_s_lcom.h b/src/ft_s_lcom.h index eae0501..6db58d3 100644 --- a/src/ft_s_lcom.h +++ b/src/ft_s_lcom.h @@ -18,7 +18,8 @@ void ft_lcom_add_back(t_lcom **alcom, t_lcom *new); void ft_lcom_clear(t_lcom **lcom); -t_lcom *ft_lcom_new(const char word[]); +t_lcom *ft_lcom_new(const char word[], + t_msh *msh); t_lcom *ft_lcom_last(t_lcom *lcom); #endif diff --git a/src/ft_u_utils.c b/src/ft_u_utils.c index cd9e53f..594f2c8 100644 --- a/src/ft_u_utils.c +++ b/src/ft_u_utils.c @@ -14,8 +14,24 @@ #include <stdlib.h> #include <stdint.h> +#include "ft_f_fail.h" +#include "ft_s_destroy.h" +#include "ft_s_lcom.h" #include "ft_s_struct.h" +uint64_t + ft_get_argc(const char *args[]) +{ + uint64_t argc; + + argc = 0; + while (args[argc]) + { + argc++; + } + return (argc); +} + char *ft_get_home_dir(char **envp) { @@ -35,15 +51,46 @@ char return (NULL); } -uint64_t - ft_get_argc(const char *args[]) +/* +** char * +** ft_subst_var_value(const char varname[], const t_msh *msh); +** +** DESCRIPTION +** The ft_subst_var_value() function returns +** a heap-allocated, null-terminated string +** that may later be free'd containing the +** value of the variable varname[] including +** the '$' prefix. NULL is returned if varname[] +** wasn't found. +*/ + +char + *ft_subst_var_value(const char varname[], + t_msh *msh) { - uint64_t argc; + char **p_env; + char *varval; - argc = 0; - while (args[argc]) + p_env = msh->envp; + varval = NULL; + while (*p_env) { - argc++; + if (!ft_strncmp(*p_env, varname + 1, ft_strlen(varname + 1) + 1)) + { + ft_printf("(%s)\n", *p_env); + while (**p_env != '\0' && **p_env != '=') + **p_env += 1; + if (**p_env == '=') + **p_env += 1; + if (!(varval = ft_strdup(*p_env))) + { + ft_lcom_clear(&msh->curr); + ft_s_destroy(msh); + ft_fail_alloc(msh); + } + return (varval); + } + p_env += 1; } - return (argc); + return (NULL); } diff --git a/src/ft_u_utils.h b/src/ft_u_utils.h index d025cb2..05b3ab3 100644 --- a/src/ft_u_utils.h +++ b/src/ft_u_utils.h @@ -17,5 +17,7 @@ uint64_t ft_get_argc(const char *args[]); char *ft_get_home_dir(char *envp[]); +char *ft_subst_var_value(const char varname[], + t_msh *msh); #endif diff --git a/src/minishell.c b/src/minishell.c index 1df809b..36ba25a 100644 --- a/src/minishell.c +++ b/src/minishell.c @@ -30,6 +30,7 @@ int int32_t ret; /* TODO: increment $SHLVL */ + /* TODO: handle general variables | $var */ if (!(msh = ft_init_msh(envp))) { ft_dprintf(2, "%s\n", strerror(errno)); |