/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* parser.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: narnaud +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/02 16:09:25 by narnaud #+# #+# */ /* Updated: 2022/05/03 12:43:48 by narnaud ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" int push_heredoc(char *str) { char *line; int pip[2]; pipe(pip); while(1) { line = readline(">"); if (!ft_strncmp(line, str, ft_strlen(str) + 1)) break; ft_putstr_fd(line, pip[1]); write(pip[1], "\n", 1); } close(pip[1]); return (pip[0]); } size_t count_arguments(t_token *tok) { size_t ret; ret = 0; while (tok && tok->type != PIPE) { if (!tok->type) ret++; tok = tok->next; } return (ret); } void update_redir(t_command *cmd, t_token *tok) { if (tok->type == OUT) { if (cmd->fd[1]) close(cmd->fd[1]); cmd->fd[1] = open(tok->value, O_CREAT | O_TRUNC | O_WRONLY, 0644); } else if (tok->type == ADD) { if (cmd->fd[1]) close(cmd->fd[1]); cmd->fd[1] = open(tok->value, O_CREAT | O_APPEND | O_WRONLY, 0644); } else if (tok->type == IN) { if (cmd->fd[0]) close(cmd->fd[0]); cmd->fd[0] = open(tok->value, O_RDONLY); } else if (tok->type == HD) { if (cmd->fd[0]) close(cmd->fd[0]); cmd->fd[0] = push_heredoc(tok->value); } }