export append
This commit is contained in:
parent
5ad220e434
commit
2c5499a72f
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ */
|
||||||
/* +#+ */
|
/* +#+ */
|
||||||
/* Created: 2025/02/20 11:32:53 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);
|
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)
|
int builtin_export(t_minishell *msh, t_command *cmd)
|
||||||
{
|
{
|
||||||
char *err;
|
|
||||||
char **arr;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
arr = NULL;
|
|
||||||
if (cmd->args[1] == NULL)
|
if (cmd->args[1] == NULL)
|
||||||
environment_print(msh, TRUE);
|
environment_print(msh, TRUE);
|
||||||
while (cmd->args[++i] != NULL)
|
while (cmd->args[++i] != NULL)
|
||||||
{
|
{
|
||||||
arr = ft_split_safe(msh, cmd->args[i], '=');
|
if (!handle_argument(msh, cmd->args[i]))
|
||||||
if (arr != NULL && arr[0] != NULL && ft_isvalid_identifier(arr[0]) == TRUE)
|
return (EXIT_FAILURE);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
return (EXIT_SUCCESS);
|
return (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user