pipex/bonus/pipex_heredoc_bonus.c
2023-03-26 22:34:58 +02:00

84 lines
2.2 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* pipex_heredoc_bonus.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/14 11:22:13 by erey-bet #+# #+# */
/* Updated: 2023/03/26 21:53:29 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[i] || !data->flgs[i])
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);
}