From c9f64a4635d836b866a5835e2ff011a767e5480e Mon Sep 17 00:00:00 2001 From: Loic Deridder Date: Fri, 7 Feb 2025 12:35:30 +0100 Subject: [PATCH] expand --- includes/exec/expander.h | 20 +++++++++++ includes/minishell.h | 3 +- srcs/env/var.c | 12 +++---- srcs/execution/exec.c | 5 +-- srcs/expander/expander.c | 71 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 includes/exec/expander.h create mode 100644 srcs/expander/expander.c diff --git a/includes/exec/expander.h b/includes/exec/expander.h new file mode 100644 index 0000000..bd35919 --- /dev/null +++ b/includes/exec/expander.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lderidde +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/07 10:21:00 by lderidde #+# #+# */ +/* Updated: 2025/02/07 10:22:10 by lderidde ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef EXPANDER_H +# define EXPANDER_H + +# include "../minishell.h" + +t_ast_n *expand_node(t_ast_n *node); + +#endif diff --git a/includes/minishell.h b/includes/minishell.h index e45dbc7..d7863df 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -6,7 +6,7 @@ /* By: lderidde +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/27 11:25:25 by lderidde #+# #+# */ -/* Updated: 2025/02/07 09:22:29 by lderidde ### ########.fr */ +/* Updated: 2025/02/07 10:22:28 by lderidde ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,6 +41,7 @@ typedef struct s_msh # include "exec/builtins.h" # include "exec/env.h" # include "exec/exec.h" +# include "exec/expander.h" t_msh *init_msh(char **envp); void free_msh(t_msh *msh); diff --git a/srcs/env/var.c b/srcs/env/var.c index 52d391b..a966f63 100644 --- a/srcs/env/var.c +++ b/srcs/env/var.c @@ -6,7 +6,7 @@ /* By: lderidde +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/28 10:08:49 by lderidde #+# #+# */ -/* Updated: 2025/02/04 10:37:20 by lderidde ### ########.fr */ +/* Updated: 2025/02/07 11:59:55 by lderidde ### ########.fr */ /* */ /* ************************************************************************** */ @@ -154,16 +154,16 @@ void set_var_env(char *key, char *value, t_msh *msh) int i; char *tmp; - tmp = ""; + tmp = NULL; i = get_var_index(key, msh); if (value) - tmp = ft_strjoin(key, "="); - if (!tmp) + tmp = ft_strjoin("=", value); + if (value && !tmp) return ; if (i != -1 && msh->env[i]) { free_null_ptr(msh->env[i]); - msh->env[i] = ft_strjoin(tmp, value); + msh->env[i] = ft_strjoin(key, tmp); } else { @@ -171,7 +171,7 @@ void set_var_env(char *key, char *value, t_msh *msh) msh->env = copy_env_var(msh->env, i + 1); if (!msh->env) return ; - msh->env[i] = ft_strjoin(tmp, value); + msh->env[i] = ft_strjoin(key, tmp); } if (tmp && tmp[0]) free_null_ptr(tmp); diff --git a/srcs/execution/exec.c b/srcs/execution/exec.c index 463213e..7a3d57c 100644 --- a/srcs/execution/exec.c +++ b/srcs/execution/exec.c @@ -6,7 +6,7 @@ /* By: lderidde +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/27 11:22:33 by lderidde #+# #+# */ -/* Updated: 2025/02/07 09:28:49 by lderidde ### ########.fr */ +/* Updated: 2025/02/07 12:31:44 by lderidde ### ########.fr */ /* */ /* ************************************************************************** */ @@ -166,6 +166,7 @@ int exec_builtin(t_ast_n *node) { int ret; + expand_node(node); if (ft_strncmp(node->cmd, "exit", 4) == 0) ret = builtin_exit(node->args, node->sh, node); else if (ft_strncmp(node->cmd, "pwd", 3) == 0) @@ -238,7 +239,7 @@ int exec(t_ast_n *node) return_error(node->cmd, "command not found", 127); if (access(path, X_OK) != 0) return_error(path, "Permission denied", 126); - execve(path, node->args, NULL); + execve(path, node->args, node->msh->env); free(path); perror("execve"); exit(1); diff --git a/srcs/expander/expander.c b/srcs/expander/expander.c new file mode 100644 index 0000000..3984ba6 --- /dev/null +++ b/srcs/expander/expander.c @@ -0,0 +1,71 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* expander.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lderidde +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/07 10:23:02 by lderidde #+# #+# */ +/* Updated: 2025/02/07 12:31:57 by lderidde ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/minishell.h" + +int get_new_len(t_ast_n *node, int j) +{ + int i; + int len; + + i = 0; + len = ft_strlen(node->args[j]); + while (node->args[j][++i]) + { + if (node->args[j][i] == '~') + { + len += ft_strlen(get_var_value("HOME", node->msh->env)) - 1; + } + } + return (len); +} + +void expand_tilde(t_ast_n *node, int j) +{ + int i; + int len; + int save; + char *new; + + i = -1; + len = get_new_len(node, j); + new = ft_calloc(len + 1, sizeof(char)); + if (!new) + return ; + save = len; + len = 0; + while (++i < save) + { + if (node->args[j][len] != '~') + new[i] = node->args[j][len++]; + else + { + ft_strlcat(new, get_var_value("HOME", node->msh->env), -1); + i = ft_strlen(new) - 1; + len++; + } + } + ft_free(&node->args[j]); + node->args[j] = new; +} + +t_ast_n *expand_node(t_ast_n *node) +{ + int i; + + i = -1; + while (node->args[++i]) + { + expand_tilde(node, i); + } + return (node); +}