/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* parser.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: narnaud +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/01/06 07:52:29 by narnaud #+# #+# */ /* Updated: 2022/04/14 09:19:12 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" size_t count_arguments(t_token tok) { size_t ret; ret = 0; while (tok.value) { if (tok.type == 0 && tok.value[0] != '|') ret++; if (tok.next) tok = *(tok.next); else break ; } return (ret); } void update_redir(t_command *cmd, t_token tok) { if (tok.type == OUT) { if (cmd->fd[1]) close(cmd->fd[1]); cmd->output = init_file(tok.value, O_TRUNC | O_WRONLY); } else if (tok.type == ADD) { if (cmd->fd[1]) close(cmd->fd[1]); cmd->fd[1] = init_file(tok.value, O_APPEND | O_WRONLY); } else if (tok.type == IN) { if (cmd->fd[0]) close(cmd->fd[0]); cmd->fd[0] = init_file(tok.value, O_RDONLY); } else if (tok.type == HD) { if (cmd->fd[0]) close(cmd->fd[0]); cmd->fd[0] = 0; cmd->heredoc = tok.value; } } t_command *parser(t_token tok) { int i; t_command *cmd; t_command *ret; cmd = ft_calloc(1, sizeof(t_command)); ret = cmd; while (tok.value) { i = 0; cmd->argv = ft_calloc(count_arguments(tok) + 1, sizeof(char *)); while(tok.value[0] != '|') { if (tok.type) update_redir(cmd, tok); else { cmd->argv[i] = tok.value; i++; } if (tok.next) tok = *(tok.next); else break ; } //printf("Input : %d\n", cmd->input); //printf("Output : %d\n", cmd->output); cmd->argv[i] = NULL; if (tok.next) tok = *(tok.next); else break ; cmd->next = ft_calloc(1, sizeof(t_command)); cmd->next->prev = cmd; cmd = cmd->next; } return (ret); }