From 1c9653a5a566d20b35aa7e158bcbd05188b86e65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Mon, 14 Apr 2025 12:48:15 +0200 Subject: [PATCH] parsing: parse redirections --- src/parser/cmd_parsing.c | 84 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 8 deletions(-) diff --git a/src/parser/cmd_parsing.c b/src/parser/cmd_parsing.c index 37a18e8..4233281 100644 --- a/src/parser/cmd_parsing.c +++ b/src/parser/cmd_parsing.c @@ -6,11 +6,16 @@ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/31 10:28:28 by jguelen #+# #+# */ -/* Updated: 2025/04/11 16:56:59 by khais ### ########.fr */ +/* Updated: 2025/04/14 12:48:26 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #include "cmd_parsing.h" +#include +#include "worddesc/worddesc.h" +#include "wordlist/wordlist.h" +#include +#include "../executing/here_doc/here_doc.h" /* ** NOTE: This file will temporarily include way more functions than allowed. @@ -52,20 +57,83 @@ static bool is_redir(t_worddesc *token) || token->token_type == HERE_DOC_REDIR_TOKEN); } -/* -** TODO Deal with heredocs properly and fill type, source, open_flags, cflags -** and redirectee (Don't know about here_doc_eof). -*/ +static t_redir_type redir_type_from_token_type(t_token_type type) +{ + if (type == OUT_APPEND_REDIR_TOKEN) + return (FT_OUTPUT_APPEND_REDIR); + if (type == OUT_TRUNC_REDIR_TOKEN) + return (FT_OUTPUT_TRUNC_REDIR); + if (type == IN_REDIR_TOKEN) + return (FT_INPUT_REDIR); + if (type == HERE_DOC_REDIR_TOKEN) + return (FT_HEREDOC); + return (FT_INVALID_REDIR); +} + +static int redir_source_from_type(t_redir_type type) +{ + if (type == FT_OUTPUT_APPEND_REDIR || type == FT_OUTPUT_TRUNC_REDIR) + return (STDOUT_FILENO); + if (type == FT_INPUT_REDIR) + return (STDIN_FILENO); + return (-1); +} + +static int redir_open_flags_from_type(t_redir_type type) +{ + if (type == FT_OUTPUT_APPEND_REDIR) + return (O_CREAT | O_APPEND | O_WRONLY); + if (type == FT_OUTPUT_TRUNC_REDIR) + return (O_CREAT | O_TRUNC | O_WRONLY); + return (0); +} + + +static t_redirect *redir_from_words(t_worddesc *operator, t_worddesc *specifier, t_minishell *app) +{ + t_redirect *redir; + + if (operator == NULL || specifier == NULL) + return (NULL); + redir = ft_calloc(1, sizeof(t_redirect)); + if (redir == NULL) + return (ft_errno(FT_EERRNO), NULL); + redir->type = redir_type_from_token_type(operator->token_type); + redir->source = redir_source_from_type(redir->type); + redir->open_flags = redir_open_flags_from_type(redir->type); + redir->c_flags = 0644; + redir->redirectee.dest = -1; + if (redir->type == FT_HEREDOC) + { + redir->here_doc_eof = ft_strdup(specifier->word); + redir->redirectee.dest = here_doc(specifier, STDIN_FILENO, app); + worddesc_destroy(specifier); + } + else + redir->redirectee.filename = specifier; + worddesc_destroy(operator); + return (redir); +} + t_redirect *minishell_redir_parse(t_minishell *app, t_cmd_builder *builder) { ft_printf("%s() %s\n", __FUNCTION__, builder->tokens->word->word); - t_redirect *redir; + t_redirect *redir_list; + t_worddesc *redir_operator; + t_worddesc *redir_specifier; + t_redirect *new_redir; - redir = NULL; + redir_list = NULL; while (is_redir(builder->tokens->word)) { + if (builder->tokens->next == NULL) + return (redirect_destroy(redir_list), NULL); + redir_operator = wordlist_pop(&builder->tokens); + redir_specifier = wordlist_pop(&builder->tokens); + new_redir = redir_from_words(redir_operator, redir_specifier, app); + t_redirect_add_back(&redir_list, new_redir); } - return (redir); + return (redir_list); } /*