From d4c4722884bdaf1f1c479ad0edd7131546531aa5 Mon Sep 17 00:00:00 2001 From: wescande Date: Wed, 15 Mar 2017 16:34:16 +0100 Subject: [PATCH] rectif setenv et mise a la norme. Ajout data init des IFS + data init du SHLVL --- 42sh/src/builtin/builtin_setenv.c | 54 ++++++++++++++++--------------- 42sh/src/builtin/is_builtin.c | 6 +++- 42sh/src/main/data_init.c | 7 +++- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/42sh/src/builtin/builtin_setenv.c b/42sh/src/builtin/builtin_setenv.c index c436e331..049ed1b4 100644 --- a/42sh/src/builtin/builtin_setenv.c +++ b/42sh/src/builtin/builtin_setenv.c @@ -6,51 +6,53 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 14:25:17 by jhalford #+# #+# */ -/* Updated: 2017/03/15 10:47:33 by gwojda ### ########.fr */ +/* Updated: 2017/03/15 16:29:51 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int builtin_setenv(const char *path, char *const av[], char *const envp[]) +static int assign_var(char *const av[], char ***env) { char *str; - char ***env; int i; + i = -1; + str = ft_str3join(av[1], "=", av[2]); + while ((*env) && (*env)[++i]) + { + if (ft_strcmp((*env)[i], av[1]) == '=' + && ft_strlen(av[1]) == ft_strlenchr((*env)[i], '=')) + { + ft_strdel(&(*env)[i]); + (*env)[i] = str; + return (0); + } + } + *env = ft_sstradd(*env, str); + ft_strdel(&str); + return (0); +} + +int builtin_setenv(const char *path, + char *const av[], char *const envp[]) +{ + char ***env; + (void)envp; (void)path; - i = 0; + if (!av || !av[0]) + return (1); if (ft_strcmp(av[0], "local") == 0) - { env = &data_singleton()->local_var; - av++; - } else env = &data_singleton()->env; - av++; - if (!av[0]) + if (!av[1]) { ft_sstrprint(*env, '\n'); ft_putchar('\n'); } - else if (!av[1]) - ft_putendl_fd("usage : name [space] value", 2); else - { - str = ft_str3join(av[0], "=", av[1]); - while ((*env) && (*env)[i]) - { - if (ft_strcmp((*env)[i], av[0]) == '=') - { - ft_strdel(&(*env)[i]); - (*env)[i] = str; - return (0); - } - i++; - } - *env = ft_sstradd(*env, str); - ft_strdel(&str); - } + return (assign_var(av, env)); return (0); } diff --git a/42sh/src/builtin/is_builtin.c b/42sh/src/builtin/is_builtin.c index 4bc3a2c3..06a2e33d 100644 --- a/42sh/src/builtin/is_builtin.c +++ b/42sh/src/builtin/is_builtin.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 13:09:57 by jhalford #+# #+# */ -/* Updated: 2017/03/14 22:32:24 by ariard ### ########.fr */ +/* Updated: 2017/03/15 15:58:53 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,7 @@ t_stof g_builtin[] = {"export", &builtin_export}, {"unset", &builtin_unset}, {"setenv", &builtin_setenv}, + {"local", &builtin_setenv}, {"unsetenv", &builtin_unsetenv}, {"env", &builtin_env}, {"exit", &builtin_exit}, @@ -40,7 +41,10 @@ t_execf *is_builtin(t_process *p) while (g_builtin[++i].name) { if (ft_strcmp(g_builtin[i].name, p->data.cmd.av[0]) == 0) + { + DG(); return (g_builtin[i].f); + } } return (NULL); } diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index a337be26..11e9f92e 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 19:26:32 by jhalford #+# #+# */ -/* Updated: 2017/03/14 21:39:13 by jhalford ### ########.fr */ +/* Updated: 2017/03/15 16:23:18 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,13 +18,18 @@ int data_init(int ac, char **av) { t_data *data; char *term_name; + char* shlvl; data = data_singleton(); data->argc = ac; data->argv = ft_sstrdup(av); data->env = ft_sstrdup(environ); data->local_var = NULL; + builtin_setenv(NULL, (char *[]){"local", "IFS", "\n ", 0}, NULL); set_exitstatus(0, 1); + shlvl = ft_itoa(ft_atoi(ft_getenv(data->env, "SHLVL")) + 1); + builtin_setenv(NULL, (char *[]){"setenv", "SHLVL", shlvl, 0}, NULL); + ft_strdel(&shlvl); data->comp = NULL; data->opts = 0; exec_reset();