diff options
author | JozanLeClerc <bousset.rudy@gmail.com> | 2020-07-27 18:55:07 +0200 |
---|---|---|
committer | JozanLeClerc <bousset.rudy@gmail.com> | 2020-07-27 18:55:07 +0200 |
commit | 487a66394061f2d14a2fa421302966b5442d643f (patch) | |
tree | 34237d4e9cb85f94bcefd46f399d2224dff3f6b3 /src/u_vars.c | |
parent | Correct shell prompt (diff) | |
download | 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.gz 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.bz2 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.xz 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.tar.zst 42-minishell-487a66394061f2d14a2fa421302966b5442d643f.zip |
I couldn't see shit
Diffstat (limited to 'src/u_vars.c')
-rw-r--r-- | src/u_vars.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/src/u_vars.c b/src/u_vars.c new file mode 100644 index 0000000..3f3a1a5 --- /dev/null +++ b/src/u_vars.c @@ -0,0 +1,163 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* u_vars.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <libft.h> +#include <stdlib.h> +#include <stdint.h> + +#include "d_define.h" +#include "f_fail.h" +#include "s_destroy.h" +#include "s_lcom.h" +#include "s_struct.h" + + +static char + *set_rva(const char varname[], + t_msh *msh) +{ + char *rvarname; + + if (!(rvarname = (char*)malloc((ft_strlen(varname) + 1) * sizeof(char)))) + { + lcom_clear(&msh->curr); + s_destroy(msh); + fail_alloc(msh); + } + ft_memcpy((char*)rvarname, (const char*)varname + 1, + ft_strlen(varname + 1)); + *(rvarname + ft_strlen(varname + 1)) = '='; + *(rvarname + ft_strlen(varname + 1) + 1) = '\0'; + return (rvarname); +} + +static char + *dup_env(char *p_env, + char *rvarname, + t_msh *msh) +{ + char *varval; + + if (!(varval = ft_strdup(p_env))) + { + ft_memdel((void*)&rvarname); + lcom_clear(&msh->curr); + s_destroy(msh); + fail_alloc(msh); + } + ft_memdel((void*)&rvarname); + return (varval); +} + +static char + *get_frm_env(char rvarname[], + t_msh *msh) +{ + char **p_env; + char *pp_env; + char *varval; + + p_env = msh->envp; + while (*p_env) + { + if (!ft_strncmp(rvarname, *p_env, ft_strlen(rvarname))) + { + pp_env = *p_env; + while (*pp_env != '\0' && *pp_env != '=') + pp_env += 1; + if (*pp_env == '=') + pp_env += 1; + varval = dup_env(pp_env, rvarname, msh); + return (varval); + } + p_env += 1; + } + return (NULL); +} + +static char + *get_special_var(const char varname[], + t_msh *msh) +{ + char *varval; + + if (!ft_strncmp(varname, FT_RET_VAR, 3)) + { + if (!(varval = ft_uitoa(msh->ret))) + { + lcom_clear(&msh->curr); + s_destroy(msh); + fail_alloc(msh); + } + return (varval); + } + else if (!ft_strncmp(varname, FT_ZER_VAR, 3)) + { + if (!(varval = ft_strdup(msh->shname))) + { + lcom_clear(&msh->curr); + s_destroy(msh); + fail_alloc(msh); + } + return (varval); + } + return (NULL); +} + +static char + *get_cstm_vr(const char varname[], + t_msh *msh) +{ + (void)varname; + (void)msh; + return (NULL); +} + +/* +** char * +** subst_var_value(const char varname[], const t_msh *msh); +** +** DESCRIPTION +** The 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 + *subst_var_value(const char varname[], + t_msh *msh) +{ + /* TODO: check behaviour on empty vars -> "QWE=" */ + /* TODO: add support for global variables -> "$hey $nigga..." */ + char *varval; + char *rvarname; + + varval = NULL; + if ((varval = get_special_var(varname, msh)) != NULL) + { + return (varval); + } + else if ((varval = get_cstm_vr(varname, msh)) != NULL) + { + return (varval); + } + else + { + rvarname = set_rva(varname, msh); + varval = get_frm_env(rvarname, msh); + return (varval); + } + return (NULL); +} |