diff options
| -rw-r--r-- | include/ast.h | 9 | ||||
| -rw-r--r-- | src/free_node.c | 13 | ||||
| -rw-r--r-- | src/new_node.c | 3 | ||||
| -rw-r--r-- | src/parse_cmd.c | 29 |
4 files changed, 32 insertions, 22 deletions
diff --git a/include/ast.h b/include/ast.h index b0ed996..bf19083 100644 --- a/include/ast.h +++ b/include/ast.h @@ -6,12 +6,12 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:48:27 by dkaiser #+# #+# */ -/* Updated: 2024/07/09 16:54:29 by dkaiser ### ########.fr */ +/* Updated: 2024/07/10 12:31:39 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ -#include "stdlib.h" #include "debug_tools.h" +#include "stdlib.h" enum e_node_type { @@ -68,5 +68,8 @@ typedef struct s_node t_node *new_node(int type); t_node *new_pipe_node(t_node *left, t_node *right); -t_node *new_cmd_node(char **args, t_assign **assigns, t_redirection redirs[2]); +t_node *new_cmd_node(char **args, t_assign **assigns, + t_redirection redirs[2]); t_node *new_string_node(char *string); + +void free_node(t_node *node); diff --git a/src/free_node.c b/src/free_node.c index 2dfeb7d..f8677d5 100644 --- a/src/free_node.c +++ b/src/free_node.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:41:46 by dkaiser #+# #+# */ -/* Updated: 2024/07/09 11:37:11 by dkaiser ### ########.fr */ +/* Updated: 2024/07/22 14:30:14 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,15 +40,17 @@ static void free_cmd_node(t_node *node) int i; i = 0; - while (node->content.cmd.args[i] != NULL) + while (node->content.cmd.args != NULL && node->content.cmd.args[i] != NULL) { free(node->content.cmd.args[i]); i++; } free(node->content.cmd.args); free_assigns(node->content.cmd.assigns); - free(node->content.cmd.redirs[0].specifier); - free(node->content.cmd.redirs[1].specifier); + if (node->content.cmd.redirs[0].type != 0 && node->content.cmd.redirs[0].specifier != NULL) + free(node->content.cmd.redirs[0].specifier); + if (node->content.cmd.redirs[1].type != 0 && node->content.cmd.redirs[0].specifier != NULL) + free(node->content.cmd.redirs[1].specifier); } static void free_assigns(t_assign **assigns) @@ -56,10 +58,11 @@ static void free_assigns(t_assign **assigns) int i; i = 0; + if (assigns == 0) + return ; while (assigns[i] != NULL) { free(assigns[i]->var); - free(assigns[i]->value); free(assigns[i]); i++; } diff --git a/src/new_node.c b/src/new_node.c index c334eb6..c2458d0 100644 --- a/src/new_node.c +++ b/src/new_node.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:21:03 by dkaiser #+# #+# */ -/* Updated: 2024/07/08 16:10:44 by dkaiser ### ########.fr */ +/* Updated: 2024/07/22 14:25:03 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,6 +46,7 @@ t_node *new_cmd_node(char **args, t_assign **assigns, t_redirection redirs[2]) node->content.cmd.assigns = assigns; node->content.cmd.redirs[0] = redirs[0]; node->content.cmd.redirs[1] = redirs[1]; + free(redirs); return (node); } diff --git a/src/parse_cmd.c b/src/parse_cmd.c index 4fa2bc2..0173caa 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/08 15:06:25 by dkaiser #+# #+# */ -/* Updated: 2024/07/09 19:22:51 by dkaiser ### ########.fr */ +/* Updated: 2024/07/10 13:26:17 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,8 @@ static t_redirection *collect_redirs(t_token **tokens); static t_assign **collect_assigns(t_token **tokens); static char **collect_args(t_token **tokens); static t_assign *to_assign(char *str); +static void set_redir(t_redirection *redir, int type, + char *specifier); t_node *parse_cmd(t_token *tokens) { @@ -33,6 +35,7 @@ static t_redirection *collect_redirs(t_token **tokens) { t_redirection *result; t_token *cur; + int idx; cur = *tokens; result = malloc(sizeof(t_redirection) * 2); @@ -41,24 +44,18 @@ static t_redirection *collect_redirs(t_token **tokens) // free all tokens return (NULL); } - result[0].specifier = NULL; - result[0].type = 0; - result[1].specifier = NULL; - result[1].type = 0; + set_redir(&result[0], 0, NULL); + set_redir(&result[1], 0, NULL); while (cur != NULL && cur->next != NULL) { if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) { if (cur->content.redir_type & (INPUT_FILE | INPUT_LIMITER)) - { - result[0].type = cur->content.redir_type; - result[0].specifier = cur->next->content.string; - } + idx = 0; else if (cur->content.redir_type & (OUTPUT_APPEND | OUTPUT_OVERRIDE)) - { - result[1].type = cur->content.redir_type; - result[1].specifier = cur->next->content.string; - } + idx = 1; + set_redir(&result[idx], cur->content.redir_type, + cur->next->content.string); cur = cur->next; free_token_and_connect(cur->previous); if (cur->next != NULL) @@ -170,3 +167,9 @@ static char **collect_args(t_token **tokens) result[i] = NULL; return (result); } + +static void set_redir(t_redirection *redir, int type, char *specifier) +{ + redir->type = type; + redir->specifier = specifier; +} |
