/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   get_next_line.c                                    :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: cchauvet <cchauvet@student.42angoulem      +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2022/10/26 00:52:47 by cchauvet          #+#    #+#             */
/*   Updated: 2023/01/05 13:07:10 by cchauvet         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "get_next_line.h"

char	*ft_getstash(int fd)
{
	char	*str;
	int		readed;

	str = ft_calloc(BUFFER_SIZE + 1, sizeof(char));
	if (str == NULL)
		return (NULL);
	readed = read(fd, str, BUFFER_SIZE);
	if (readed < 1)
	{
		free(str);
		return (NULL);
	}
	return (str);
}

char	*ft_getline(int fd)
{
	char		*stash;
	char		*buf;

	stash = NULL;
	buf = NULL;
	while (ft_strchri(stash, '\n') == -1)
	{
		buf = ft_getstash(fd);
		if (buf == NULL)
			return (stash);
		stash = ft_strfjoin(stash, buf);
		if (stash == NULL)
			return (NULL);
	}
	return (stash);
}

char	*ft_getreturn(char *str)
{
	int	i;

	if (str == NULL)
		return (NULL);
	i = ft_strchri(str, '\n') + 1;
	if (i == 0)
		i = ft_strlen(str);
	return (ft_strndup(str, i));
}

char	*ft_getextra(char *str)
{
	int	i;
	int	j;

	if (str == NULL)
		return (NULL);
	i = ft_strchri(str, '\n') + 1;
	if (i == 0)
		return (NULL);
	j = ft_strlen(str + i);
	return (ft_strndup(str + i, j));
}

char	*get_next_line(int fd)
{
	static char	*stash = NULL;
	char		*buf1;
	char		*buf2;

	buf2 = stash;
	if (ft_strchri(stash, '\n') == -1)
	{
		buf1 = ft_getline(fd);
		buf2 = ft_strfjoin(stash, buf1);
		if (buf2 == NULL)
		{
			free(buf1);
			return (NULL);
		}
	}
	buf1 = ft_getreturn(buf2);
	stash = ft_getextra(buf2);
	free(buf2);
	if (buf1 == NULL)
	{
		free(stash);
		free(buf1);
		return (NULL);
	}
	return (buf1);
}