diff --git a/includes/builtins.h b/includes/builtins.h index fa3a8be..2b295c4 100644 --- a/includes/builtins.h +++ b/includes/builtins.h @@ -19,7 +19,7 @@ void builtin_pwd(char *arg); void builtin_env(char *str, char **envp); int builtin_unset(char **arg, t_data *data); int builtin_cd(char **arg, t_data *data); -char **builtin_export(char **arg, char **envp); +void builtin_export(char **arg, t_data *data); //UTILS int count_char(char *str); diff --git a/srcs/builtins/export.c b/srcs/builtins/export.c index cb7c1d8..74577b8 100644 --- a/srcs/builtins/export.c +++ b/srcs/builtins/export.c @@ -1,18 +1,5 @@ #include "../../includes/builtins.h" -void check_format(char **arg) -{ - (void)arg; -} - -void print_error(char *str, int *code) -{ - ft_put_s_fd("minishell: export: ", 2); - ft_put_s_fd(str, 2); - ft_putendl_fd(": not a valid identifier", 2); - *code = 1; -} - void print_arr(char **envp) { int i; @@ -42,7 +29,7 @@ void print_export(char **envp) j = 0; while (j < len - i - 1) { - if (ft_strncmp(envp[j], envp[j + 1], ft_strlen(envp[j])) > 0) + if (ft_strncmp(envp[j], envp[j + 1], ft_strchr(envp[j], '=') - envp[j]) > 0) { tmp = envp[j]; envp[j] = envp[j + 1]; @@ -55,35 +42,51 @@ void print_export(char **envp) print_arr(envp); } -char **builtin_export(char **arg, char **envp) +static void free_tmp(char **tab) { - char **new_envp; - int i; - // int code; + int i; - i =0; - while (envp[i]) - i++; - new_envp = malloc(sizeof(char *) * i + 1); - new_envp[i] = NULL; - i = -1; - while (envp[++i]) - new_envp[i] = ft_strdup(envp[i]); - // code = 0; i = 0; - while (arg[i]) - i++; - if (i == 1) - return(print_export(new_envp), envp); - return (envp); - // i = -1; - // while (arg[++i]) - // { - // if (check_format(arg[i])) - // { - // - // } - // else - // print_error(arg[i], &code); - // } + while (tab[i]) + free(tab[i++]); + free(tab); +} + +char **key_value(char *str) +{ + char **tmp; + char *equal; + + tmp = malloc(sizeof(char *) * (2 + 1)); + if (!tmp) + return (NULL); + equal = ft_strchr(str, '='); + tmp[0] = ft_substr(str, 0, equal - str); + if (equal - str == 0) + tmp[2] = ft_strdup(""); + else + tmp[1] = ft_substr(equal, 1, ft_strlen(equal)); + tmp[2] = NULL; + return (tmp); +} + +void builtin_export(char **arg, t_data *data) +{ + int i; + char **tmp; + + i = 0; + if (count_var(arg) == 1) + return (print_export(data->env)); + while (++i < count_var(arg)) + { + if (ft_strchr(arg[i], '=') != NULL) + { + tmp = key_value(arg[i]); + set_var_env(tmp[0], tmp[1], data); + free_tmp(tmp); + } + else + set_var_env(arg[i], NULL, data); + } } diff --git a/srcs/builtins/unset.c b/srcs/builtins/unset.c index 6b5d59f..5d4b952 100644 --- a/srcs/builtins/unset.c +++ b/srcs/builtins/unset.c @@ -23,7 +23,13 @@ // int builtin_unset(char **arg, t_data *data) { + int i; + int ret; + + i = 0; if (count_var(arg) == 1) return (err_msg_cmd("unset", NULL, "not enough arguments", EXIT_FAILURE)); - return (remove_env_var(arg[1], data)); + while (++i < count_var(arg)) + ret = remove_env_var(arg[i], data); + return (ret); } diff --git a/srcs/env/var.c b/srcs/env/var.c index 8d998e2..fbcabc6 100644 --- a/srcs/env/var.c +++ b/srcs/env/var.c @@ -136,15 +136,14 @@ void set_var_env(char *key, char *value, t_data *data) char *tmp; i = get_var_index(key, data); - if (!value) - value = ""; - tmp = ft_strjoin("=", value); + if (value) + tmp = ft_strjoin(key, "="); if (!tmp) return ; if (i != -1 && data->env[i]) { free_null_ptr(data->env[i]); - data->env[i] = ft_strjoin(key, tmp); + data->env[i] = ft_strjoin(tmp, value); } else { @@ -152,7 +151,7 @@ void set_var_env(char *key, char *value, t_data *data) data->env = copy_env_var(data->env, i + 1); if (!data->env) return ; - data->env[i] = ft_strjoin(key, tmp); + data->env[i] = ft_strjoin(tmp, value); } free_null_ptr(tmp); return ; diff --git a/srcs/main.c b/srcs/main.c index ca95efc..4e7feb7 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -40,7 +40,7 @@ char **ft_setnewenv(void) return (envp); } -t_data *init_data(char **envp) +static t_data *init_data(char **envp) { t_data *data; @@ -75,7 +75,7 @@ int main(int ac, char **av, char **envp) if (ft_strncmp(input, "cd", 2) == 0) builtin_cd(ft_split(input, " "), data); if (ft_strncmp(input, "export", 6) == 0) - data->env = builtin_export(ft_split(input, " "), data->env); + builtin_export(ft_split(input, " "), data); free(input); } return (0);