/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* pipex_heredoc_bonus.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/14 11:22:13 by erey-bet #+# #+# */ /* Updated: 2023/03/28 18:07:02 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "pipex_bonus.h" int parsing_here_doc(int argc, char *argv[], t_data *data) { int i; data->argc = argc; data->fd2 = open(argv[argc], O_WRONLY | O_APPEND | O_CREAT, 0644); if (data->fd2 < 0) { close(data->fd1); return (print_error(0, argv[argc])); } data->cmds = ft_calloc(argc - 2, sizeof(char *)); if (!data->cmds) return (1); data->flgs = ft_calloc(argc - 2, sizeof(char *)); if (!data->cmds) return (free_all(data)); i = -1; while (++i < argc - 3) { data->cmds[i] = get_command(argv[3 + i]); data->flgs[i] = ft_split(argv[3 + i], ' '); } if (!data->cmds[argc - 4] || !data->flgs[argc - 4]) return (free_all(data)); return (0); } static int ft_strcmp(char *s1, char *s2) { if (!s1 || !s2) return (-1); while (*s1 && *s2) { if (*s1 != *s2) return (*s1 - *s2); s1++; s2++; } return (*s1 - *s2); } int here_doc(int argc, char *argv[], char **env, t_data *data) { char *cur; int fd[2]; if (pipe(fd) < -1) return (1); while (1) { cur = get_next_line(0); if (!cur) break ; cur[ft_strlen(cur) - 1] = '\0'; if (ft_strcmp(cur, argv[2]) == 0) break ; cur[ft_strlen(cur)] = '\n'; ft_putstr_fd(cur, fd[1]); free(cur); } free(cur); data->fd1 = fd[0]; close(fd[1]); if (parsing_here_doc(argc, argv, data) > 0) return (1); data->env = env; return (0); }