diff options
Diffstat (limited to 'src/free_node.c')
| -rw-r--r-- | src/free_node.c | 79 |
1 files changed, 68 insertions, 11 deletions
diff --git a/src/free_node.c b/src/free_node.c index 6eae059..d866727 100644 --- a/src/free_node.c +++ b/src/free_node.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* free_node.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ +/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:41:46 by dkaiser #+# #+# */ -/* Updated: 2024/08/11 12:26:20 by dkaiser ### ########.fr */ +/* Updated: 2025/01/22 01:53:34 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,18 +14,64 @@ static void free_pipe_node(t_node *node); static void free_cmd_node(t_node *node); +static void free_file(void *arg); + +// void free_node(t_node *node) +// { +// if (node->type == PIPE_NODE) +// free_pipe_node(node); +// else if (node->type == CMD_NODE) +// free_cmd_node(node); +// else if (node->type == STRING_NODE) +// free(node->content.string); +// else +// panic(UNREACHABLE); +// free(node); +// } +void free_redirections(t_redirection redirs[2]) +{ + for (int i = 0; i < 2; i++) + { + if (redirs[i].specifier) + free(redirs[i].specifier); + } +} void free_node(t_node *node) { - if (node->type == PIPE_NODE) - free_pipe_node(node); - else if (node->type == CMD_NODE) - free_cmd_node(node); - else if (node->type == STRING_NODE) - free(node->content.string); - else - panic(UNREACHABLE); - free(node); + if (!node) + return; + + if (node->type == PIPE_NODE) + { + free_node(node->content.pipe.left); + free_node(node->content.pipe.right); + } + else if (node->type == CMD_NODE) + { + if (node->content.cmd.args) + { + for (int i = 0; node->content.cmd.args[i]; i++) + free(node->content.cmd.args[i]); + free(node->content.cmd.args); + } + free_redirections(node->content.cmd.redirs); + // Assuming create_files is a list of dynamically allocated strings + t_list *current = node->content.cmd.create_files; + t_list *next; + while (current) + { + next = current->next; + free(current->content); + free(current); + current = next; + } + } + else if (node->type == STRING_NODE) + { + free(node->content.string); + } + free(node); } static void free_pipe_node(t_node *node) @@ -51,4 +97,15 @@ static void free_cmd_node(t_node *node) if (node->content.cmd.redirs[1].type != 0 && node->content.cmd.redirs[0].specifier != NULL) free(node->content.cmd.redirs[1].specifier); + if (node->content.cmd.create_files != NULL) + ft_lstclear(&node->content.cmd.create_files, free_file); +} + +static void free_file(void *arg) +{ + t_redirection *file; + + file = (t_redirection *)arg; + free(file->specifier); + free(file); } |
