diff --git a/src/builtin/builtin_export.c b/src/builtin/builtin_export.c index 71466d3..d4e2cfe 100644 --- a/src/builtin/builtin_export.c +++ b/src/builtin/builtin_export.c @@ -6,7 +6,7 @@ /* By: whaffman +#+ */ /* +#+ */ /* Created: 2025/02/20 11:32:53 by whaffman #+# #+# */ -/* Updated: 2025/03/04 16:41:06 by whaffman ######## odam.nl */ +/* Updated: 2025/03/06 17:41:54 by whaffman ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -24,29 +24,79 @@ static int ft_isvalid_identifier(char *str) } return (TRUE); } +static int actually_append(t_minishell *msh, char *name, char *value) +{ + char *value_old; + + if (name != NULL && value != NULL) + { + if (environment_get(msh, name) == NULL) + environment_update(msh, name, value); + else + { + value_old = environment_get(msh, name)->value; + value = ft_strjoin_safe(msh, value_old, value); + environment_update(msh, name, value); + } + return (SUCCESS); + } + return (FAILURE); +} + +static int handle_append(t_minishell *msh, char *arg) +{ + char *name; + char *name_end; + char *value; + int ret; + + ret = FAILURE; + name_end = ft_strnstr(arg, "+=", ft_strlen(arg)); + if (name_end == NULL) + return (FAILURE); + name = ft_substr_safe(msh, arg, 0, name_end - arg); + value = ft_strdup_safe(msh, ft_strchr(arg, '=') + 1); + if (name != NULL && value != NULL) + ret = actually_append(msh, name, value); + free_safe(msh, (void **)&name); + free_safe(msh, (void **)&value); + return (ret); +} + +static int handle_argument(t_minishell *msh, char *arg) +{ + char **arr; + char *err; + + arr = NULL; + if (ft_strnstr(arg, "+=", ft_strlen(arg)) != NULL) + return (handle_append(msh, arg)); + arr = ft_split_safe(msh, arg, '='); + if (arr != NULL && arr[0] != NULL + && ft_isvalid_identifier(arr[0]) == TRUE) + environment_update(msh, arr[0], arr[1]); + else + { + err = ft_strjoin_safe(msh, arg, ": not a valid identifier"); + error_msg("export", err); + return (ft_free_arr_safe(msh, arr), FAILURE); + } + ft_free_arr_safe(msh, arr); + return (SUCCESS); +} int builtin_export(t_minishell *msh, t_command *cmd) { - char *err; - char **arr; int i; i = 0; - arr = NULL; + if (cmd->args[1] == NULL) environment_print(msh, TRUE); while (cmd->args[++i] != NULL) { - arr = ft_split_safe(msh, cmd->args[i], '='); - if (arr != NULL && arr[0] != NULL && ft_isvalid_identifier(arr[0]) == TRUE) - environment_update(msh, arr[0], arr[1]); - else - { - err = ft_strjoin_safe(msh, cmd->args[1], ": not a valid identifier"); - error_msg("export", err); - return (ft_free_arr_safe(msh, arr), EXIT_FAILURE); - } - ft_free_arr_safe(msh, arr); + if (!handle_argument(msh, cmd->args[i])) + return (EXIT_FAILURE); } return (EXIT_SUCCESS); }