/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* get_next_line.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: gbrochar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/03/22 00:00:51 by gbrochar #+# #+# */ /* Updated: 2019/02/22 10:11:53 by gbrochar ### ########.fr */ /* */ /* ************************************************************************** */ #include "get_next_line.h" char *ft_strjoin2(char *str, char *str2) { char *tmp; tmp = ft_strjoin(str, str2); free(str); return (tmp); } int gnl_manage_return(char **line, char **stock) { char *tmp; char *tmp2; if ((tmp = ft_strchr(*stock, '\n'))) { *tmp = '\0'; tmp2 = ft_strdup(tmp + 1); *line = ft_strdup(*stock); ft_memdel((void **)stock); *stock = ft_strdup(tmp2); free(tmp2); tmp2 = NULL; tmp = NULL; return (1); } if (ft_strlen(*stock) == 0) { ft_memdel((void **)stock); return (0); } *line = ft_strdup(*stock); ft_memdel((void **)stock); return (1); } int gnl_manage_read(char **line, char **stock) { char *tmp; char *tmp2; if ((tmp = ft_strchr(*stock, '\n'))) { *tmp = '\0'; tmp2 = ft_strdup(tmp + 1); *line = ft_strdup(*stock); ft_memdel((void **)stock); *stock = ft_strdup(tmp2); free(tmp2); tmp2 = NULL; tmp = NULL; return (1); } return (0); } int get_next_line(int fd, char **line, int error) { static char *stock = NULL; char buffer[BUFF_SIZE + 1]; int ret; if (stock && error) ft_memdel((void **)&stock); if (error) return (-1); buffer[0] = '\0'; if (stock) if (gnl_manage_read(line, &stock)) return (1); while ((ret = read(fd, buffer, BUFF_SIZE)) > 0) { buffer[ret] = '\0'; stock = ft_strjoin2(stock, buffer); if (gnl_manage_read(line, &stock)) return (1); } return (ret < 0 ? ret : gnl_manage_return(line, &stock)); }