/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   get_next_line_bonus.c                              :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: ahel-bah <ahel-bah@student.42.fr>          +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2021/12/09 21:46:15 by ahel-bah          #+#    #+#             */
/*   Updated: 2021/12/10 18:23:20 by ahel-bah         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "get_next_line_bonus.h"

char	*ft_get_line_after(char *buffer)
{
	int		i;
	int		j;
	char	*the_rest;

	i = 0;
	j = 0;
	while (buffer[i] && buffer[i] != '\n')
		i++;
	if (buffer[i] == '\0')
		return (0);
	if (buffer[i] == '\n')
		i++;
	the_rest = malloc(sizeof(char) * ((ft_strlen(buffer) - i) + 1));
	if (the_rest == 0)
		return (0);
	j = 0;
	while (buffer[i])
		the_rest[j++] = buffer[i++];
	the_rest[j] = '\0';
	if (ft_strlen(the_rest) != 0)
		return (the_rest);
	free(the_rest);
	return (0);
}

char	*ft_get_line_before(char *buffer)
{
	int		i;
	char	*s_before;
	int		j;

	i = 0;
	while (buffer[i] && buffer[i] != '\n')
		i++;
	if (buffer[i] == '\n')
		i++;
	s_before = malloc((i + 1) * sizeof(char));
	if (s_before == 0)
	{
		free(buffer);
		return (0);
	}
	j = 0;
	while (j < i)
	{
		s_before[j] = buffer[j];
		j++;
	}
	s_before[j] = '\0';
	return (s_before);
}

char	*ft_read_file(char *buffer, int fd)
{
	int		read_bytes;
	char	*new;

	read_bytes = 1;
	new = malloc(sizeof(char) * (BUFFER_SIZE) + 1);
	if (new == 0)
		return (0);
	while (read_bytes != 0 && ft_strchr(buffer) == 0)
	{
		read_bytes = read(fd, new, BUFFER_SIZE);
		if (read_bytes == -1)
		{
			free(new);
			return (0);
		}
		new[read_bytes] = '\0';
		if (read_bytes == 0)
			break ;
		buffer = ft_strjoin(buffer, new);
	}
	free(new);
	return (buffer);
}

char	*get_next_line(int fd)
{
	static char	*buffer[1024];
	char		*ret;
	char		*tobefreed;

	if (buffer[fd] < 0 || BUFFER_SIZE <= 0)
		return (0);
	buffer[fd] = ft_read_file(buffer[fd], fd);
	if (buffer[fd] == 0)
		return (0);
	ret = ft_get_line_before(buffer[fd]);
	tobefreed = buffer[fd];
	buffer[fd] = ft_get_line_after(buffer[fd]);
	free(tobefreed);
	return (ret);
}