diff --git a/includes/minishell.h b/includes/minishell.h index 73f4fbd..695abd1 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -13,7 +13,7 @@ #ifndef MINISHELL_H # define MINISHELL_H -# define DEBUG 1 +# define DEBUG 0 typedef struct s_ast_n t_ast_n; typedef struct s_node t_node; diff --git a/includes/parser/ast.h b/includes/parser/ast.h index a949eaf..fb83308 100644 --- a/includes/parser/ast.h +++ b/includes/parser/ast.h @@ -80,4 +80,7 @@ void create_pline(t_ast_n *self, t_node *lst, t_node *token, t_msh *msh); // and_or void create_and_or(t_ast_n *parrent, t_node *lst, t_node *token, t_msh *msh); +// free +void free_ast(t_ast_n *node); + #endif diff --git a/lib/libft/srcs/format/add_to_tab.c b/lib/libft/srcs/format/add_to_tab.c index 9fa1622..ddabff0 100644 --- a/lib/libft/srcs/format/add_to_tab.c +++ b/lib/libft/srcs/format/add_to_tab.c @@ -43,12 +43,10 @@ static char **add_space_to_tab(char **tab, int count) void add_to_tab(char ***tab, char *str) { - char **tmp; int i; if (!str) return ; - tmp = *tab; i = 0; if (*tab) { @@ -60,8 +58,6 @@ void add_to_tab(char ***tab, char *str) { *tab = malloc(sizeof(char *) * 2); } - if (tmp) - free(tmp); (*tab)[i] = ft_strdup(str); (*tab)[i + 1] = NULL; } diff --git a/srcs/main.c b/srcs/main.c index 94500ba..2dce29a 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -73,6 +73,8 @@ void interpret_cmd(char **input, t_msh *msh) { msh->head = parser(*input, msh); msh->ex_code = execute_command(msh->head); + free_ast(msh->head); + msh->head = NULL; free(*input); *input = NULL; } diff --git a/srcs/parsing/ast/free_ast.c b/srcs/parsing/ast/free_ast.c new file mode 100644 index 0000000..2039652 --- /dev/null +++ b/srcs/parsing/ast/free_ast.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* free_ast.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: nalebrun +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/05 14:39:28 by nalebrun #+# #+# */ +/* Updated: 2025/02/05 14:39:28 by nalebrun ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../../includes/minishell.h" + +static void free_redirs(t_ast_n *node) +{ + free(node->redir); + if (node->files) + free_tab(node->files); + free_tab(node->args); +} + +void free_ast(t_ast_n *node) +{ + int i; + + if (node->state == _AND || node->state == _OR) + { + free_ast(node->left); + free_ast(node->right); + } + else if (node->state == _PLINE) + { + i = -1; + while (node->pline[++i]) + free_ast(node->pline[i]); + } + else if (node->state == _SUBSH) + { + free_ast(node->left); + free_redirs(node); + } + else + { + free(node->cmd); + free_redirs(node); + } + + free(node); +} diff --git a/srcs/parsing/ast/subsh.c b/srcs/parsing/ast/subsh.c index f4abed5..7a201b2 100644 --- a/srcs/parsing/ast/subsh.c +++ b/srcs/parsing/ast/subsh.c @@ -46,4 +46,5 @@ void create_subsh(t_ast_n *self, t_node *lst, t_msh *msh) self->redir = ft_calloc(1, sizeof(t_redir)); self->redir[0] = _NR; create_redir_subsh(lst, self); + // free(cutted); }