93 lines
2.1 KiB
C
93 lines
2.1 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* get_next_line.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: mdenys <mdenys@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2020/11/12 13:47:35 by mdenys #+# #+# */
|
|
/* Updated: 2020/11/17 23:54:27 by mdenys ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "get_next_line.h"
|
|
#include <stdio.h>
|
|
|
|
char *check_reminder(char *reminder)
|
|
{
|
|
char *rtn;
|
|
int i;
|
|
int j;
|
|
|
|
i = 0;
|
|
j = 0;
|
|
if (!reminder)
|
|
return (0);
|
|
while (reminder[i] && reminder[i] != '\n')
|
|
i++;
|
|
if (!reminder[i])
|
|
{
|
|
free(reminder);
|
|
return (0);
|
|
}
|
|
if (!(rtn = malloc(sizeof(char) * ((ft_strlen(reminder) - i) + 1))))
|
|
return (0);
|
|
i++;
|
|
while (reminder[i])
|
|
rtn[j++] = reminder[i++];
|
|
rtn[j] = '\0';
|
|
free(reminder);
|
|
return (rtn);
|
|
}
|
|
|
|
char *gnl(char *str)
|
|
{
|
|
int i;
|
|
char *rtn;
|
|
|
|
i = 0;
|
|
if (!str)
|
|
return (0);
|
|
while (str[i] && str[i] != '\n')
|
|
i++;
|
|
if (!(rtn = malloc(sizeof(char) * (i + 1))))
|
|
return (0);
|
|
i = 0;
|
|
while (str[i] && str[i] != '\n')
|
|
{
|
|
rtn[i] = str[i];
|
|
i++;
|
|
}
|
|
rtn[i] = '\0';
|
|
return (rtn);
|
|
}
|
|
|
|
int get_next_line(int fd, char **line)
|
|
{
|
|
char *buff;
|
|
static char *reminder;
|
|
int r_d;
|
|
|
|
r_d = 1;
|
|
if (fd < 0 || !line || BUFFER_SIZE <= 0)
|
|
return (-1);
|
|
if (!(buff = malloc(sizeof(char) * (BUFFER_SIZE + 1))))
|
|
return (-1);
|
|
while (!ft_rn(reminder) && r_d != 0)
|
|
{
|
|
if ((r_d = read(fd, buff, BUFFER_SIZE)) == -1)
|
|
{
|
|
free(buff);
|
|
return (-1);
|
|
}
|
|
buff[r_d] = '\0';
|
|
reminder = ft_strjoin(reminder, buff);
|
|
}
|
|
free(buff);
|
|
*line = gnl(reminder);
|
|
reminder = check_reminder(reminder);
|
|
if (r_d == 0)
|
|
return (0);
|
|
return (1);
|
|
}
|