From 9c9e5ac17efca1cc22fd8cf69fb75a1e4701efe7 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 15 Jul 2020 13:27:31 +0200 Subject: Added export/unset builtin error message and status code --- src/builtin/export.c | 61 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 20 deletions(-) (limited to 'src/builtin/export.c') diff --git a/src/builtin/export.c b/src/builtin/export.c index f41bcb0..809b809 100644 --- a/src/builtin/export.c +++ b/src/builtin/export.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:11:34 by charles #+# #+# */ -/* Updated: 2020/06/19 11:21:50 by nahaddac ### ########.fr */ +/* Updated: 2020/07/15 13:22:18 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,35 +15,56 @@ ** \brief `export` builtin */ -// modify existing -// set with no string without '=' -// TODO: multiple exported variable (e.g export A=a B=b C=c) - #include "minishell.h" -int builtin_export(char **argv, t_env env) +static void st_put_declare_x(char *s) { - char *temp; + char *equal_ptr; + + if (s == NULL) + return ; + ft_putstr("declare -x "); + if ((equal_ptr = ft_strchr(s, '=')) == NULL) + equal_ptr = ft_strchr(s, '\0'); + write(STDOUT_FILENO, s, equal_ptr - s); + ft_putchar('='); + ft_putchar('"'); + ft_putstr(equal_ptr + 1); + ft_putchar('"'); + ft_putchar('\n'); +} + +int builtin_export(char **argv, t_env env) +{ + int status; size_t i; + char *equal_ptr; + bool skip; - (void)env; if (argv[1] == NULL) + { + ft_veciter(env, (void (*)(void*))st_put_declare_x); return (0); - if(ft_isdigit(argv[1][0])) - return(0); + } + status = 0; i = 0; - temp = argv[1]; - while(temp[i] != '\0') + while (argv[++i] != NULL) { - if(temp[i] == ' ' || ft_isalnum(temp[i]) == 0) - return(0); - if (temp[i] == '=') + skip = (equal_ptr = ft_strchr(argv[i], '=')) == NULL; + if (!skip) + *equal_ptr = '\0'; + if (!utils_valid_identifier(argv[i])) { - temp[i] = '\0'; - env_export(env, temp, &argv[1][i + 1]); - return(0); + if (!skip) + *equal_ptr = '='; + error_put_invalid_identifier("export", argv[i]); + status = 1; + continue; } - i++; + if (skip) + continue; + if (env_export(env, argv[i], equal_ptr + 1) == NULL) + return (127); // malloc error } - return (0); + return (status); } -- cgit