From 45968e547ed22078431eb56c8af98aa3aeec9832 Mon Sep 17 00:00:00 2001 From: Quinten Date: Sun, 23 Feb 2025 12:20:19 +0100 Subject: [PATCH] parsing input redirects --- inc/debug.h | 1 + inc/parser.h | 1 + src/debug/print_commands.c | 10 ++++++++++ src/main.c | 1 - src/parser/parser_get_commands.c | 2 +- src/parser/parser_get_input_redirects.c | 25 ++++++++++++++++++++++--- src/utils/free_command_list.c | 22 ++++++++++++++++++++++ 7 files changed, 57 insertions(+), 5 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index f26f569..174135e 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -17,5 +17,6 @@ void print_commands(void *param); void token_print(void *param); +void print_redirects(void *param); #endif diff --git a/inc/parser.h b/inc/parser.h index f757caa..8a8d05e 100644 --- a/inc/parser.h +++ b/inc/parser.h @@ -18,5 +18,6 @@ t_command *parser_command_new(char *cmd); char **parser_get_arguments(t_list *list, t_minishell *minishell); t_list *parser_get_commands(t_minishell *minishell); +t_list *parser_get_input_redirects(t_list *list); #endif diff --git a/src/debug/print_commands.c b/src/debug/print_commands.c index ed094e9..2ddf0cf 100644 --- a/src/debug/print_commands.c +++ b/src/debug/print_commands.c @@ -28,6 +28,16 @@ void print_commands(void *param) printf("\n"); } +void print_redirects(void *param) +{ + t_redirect *redirect; + + redirect = (t_redirect *)param; + if (!redirect) + return ; + printf("redirect %i value %s\n", redirect->type, redirect->value); +} + void token_print(void *param) { t_token *token; diff --git a/src/main.c b/src/main.c index 2a82a97..dec9a74 100644 --- a/src/main.c +++ b/src/main.c @@ -36,7 +36,6 @@ int main(int argc, char **argv, char **envp) minishell->commands = parser_get_commands(minishell); simple_builtins(minishell); free_minishell_line(minishell); - ft_lstclear(&minishell->commands, free_command_list); } ft_lstclear(&minishell->commands, free_command_list); free_minishell(minishell); diff --git a/src/parser/parser_get_commands.c b/src/parser/parser_get_commands.c index 1001485..c6af1fd 100644 --- a/src/parser/parser_get_commands.c +++ b/src/parser/parser_get_commands.c @@ -30,7 +30,7 @@ t_list *parser_get_commands(t_minishell *minishell) command->args = parser_get_arguments(current, minishell); command->redirect_in = parser_get_input_redirects(current); ft_lstadd_back(&command_list, ft_lstnew(command)); - while (current && ((t_token *)current->content)->type < 3) + while (current && (((t_token *)current->content)->type < 3 || ((t_token *)current->content)->type == T_REDIRECT_IN)) current = current->next; if (current && ((t_token *)current->content)->type >= 3) current = current->next; diff --git a/src/parser/parser_get_input_redirects.c b/src/parser/parser_get_input_redirects.c index 83b011d..aee0376 100644 --- a/src/parser/parser_get_input_redirects.c +++ b/src/parser/parser_get_input_redirects.c @@ -12,12 +12,19 @@ static int valid_def(t_list *list, t_token *token) return ((token->type == T_REDIRECT_IN || token->type == T_HEREDOC) && next->type < 3); } -static t_redirect *redirect_new() +static t_redirect *redirect_new(t_token_type type, char *value) { t_redirect *result; + + result = ft_malloc_safe(sizeof(t_redirect)); + result->type = type; + result->value = NULL; + if (value) + result->value = value; + return (result); } -void parser_get_input_redirects(t_list *list) +t_list *parser_get_input_redirects(t_list *list) { t_list *current; t_list *redirects; @@ -28,12 +35,24 @@ void parser_get_input_redirects(t_list *list) while (current) { token = (t_token *)current->content; + if (token->type != T_REDIRECT_IN && token->type != T_HEREDOC) + { + current = current->next; + continue ; + } if (valid_def(current, token)) { - ft_lstaddfront(&redirects, ft_lstnew()); + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(token->type, ft_strdup(((t_token *)current->next->content)->value)))); + current = current->next; + continue ; } else + { + ft_lstadd_front(&redirects, ft_lstnew(redirect_new(T_ERROR, NULL))); break ; + } current = current->next; } + ft_lstiter(redirects, print_redirects); + return (redirects); } \ No newline at end of file diff --git a/src/utils/free_command_list.c b/src/utils/free_command_list.c index 684f713..76316c0 100644 --- a/src/utils/free_command_list.c +++ b/src/utils/free_command_list.c @@ -25,6 +25,26 @@ static void free_args(char **args) free(args); } +static void free_redirects(t_list *lst) +{ + t_redirect *redir; + t_list *current; + t_list *last; + + current = lst; + while (current) + { + last = current; + redir = (t_redirect *)current->content; + if (redir && redir->value) + free(redir->value); + if (redir) + free(redir); + current = current->next; + free(last); + } +} + void free_command_list(void *content) { t_command *command; @@ -34,5 +54,7 @@ void free_command_list(void *content) free(command->command); if (command->args) free_args(command->args); + if (command->redirect_in) + free_redirects(command->redirect_in); free(command); }