diff --git a/get_next_line.c b/get_next_line.c new file mode 100644 index 0000000..30452f3 --- /dev/null +++ b/get_next_line.c @@ -0,0 +1,145 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/12/14 02:40:53 by apommier #+# #+# */ +/* Updated: 2020/12/14 21:13:09 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int ft_strlen(char *s1) +{ + int i; + i = 0; + while (s1[i]) + i++; + return (i); +} + +char *ft_strjoin(char *s1, char *s2) +{ + char *dest; + int i; + int j; + + i = 0; + j = 0; + dest = (char*)malloc(sizeof(char) * (ft_strlen(s1) + ft_strlen(s2) + 1)); + if (dest == 0) + return (0); + while (s1[i]) + { + dest[j] = s1[i]; + j++; + i++; + } + i = 0; + while (s2[i]) + { + dest[j] = s2[i]; + j++; + i++; + } + dest[j] = 0; + return (dest); +} + +int ft_free(char **s1; char **s2; char **s3) +{ + if (*s1) + free(*s1); + if (*s2) + free(*s2); + if (*s3) + free(*s3); + return (0); +} + +static char *up_save(char *save, int index, int fd) +{ + char *dest; + char *delete; + int i; + + delete = save; + if (index) + save += index; + if (!(dest = (char*)malloc(BUFFER_SIZE))) + { + ft_free(dest, delete, save); + return (0); + } + i = read(fd, dest, BUFFER_SIZE); + if (!i) + { + ft_free(dest, delete, save); + return (0); + } + if (!(save = ft_strjoin(save, dest))) + { + ft_free(dest, delete, save); + return (0); + } + free(delete); + return (save); +} + +int is_line(char *save, char **line) +{ + int i; + + i = 0; + if (save == 0) + return (0); + while (save[i] && i < BUFFER_SIZE) + { + if (save[i] == '\n') + { + save[i] = 0; + return (1); + } + i++; + } + if (save[i] == 0) + { + return (2); + *line = save; + } + return (0); +} + +int get_next_line(int fd, char **line) +{ + static char *save; + int i; + + if (fd < 0 || !line || !BUFFER_SIZE) + return (-1); + if (is_line(save, line)) + { + while (save[i] != 0) + i++; + if (!(save = up_save(save, i, fd))) + return (-1); + } + else + { + if (!(save = up_save(save, 0, fd))) + return (-1); + } + while (!is_line(save, line)) + { + if (is_line(save, line) == 2) + return (0); + if (!(save = up_save(save, 0, fd))) + return (-1); + } + *line = save; + return (1); +} diff --git a/get_next_line_utils.c b/get_next_line_utils.c new file mode 100644 index 0000000..614bc84 --- /dev/null +++ b/get_next_line_utils.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/12/14 06:05:54 by apommier #+# #+# */ +/* Updated: 2020/12/14 06:06:31 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +char *ft_strjoin(char const *s1, char const *s2) +{ + char *dest; + int i; + int j; + + i = 0; + j = 0; + dest = (char*)malloc(sizeof(char) * (ft_strlen(s1) + ft_strlen(s2) + 1)); + if (dest == 0) + return (0); + while (s1[i]) + { + dest[j] = s1[i]; + j++; + i++; + } + i = 0; + while (s2[i]) + { + dest[j] = s2[i]; + j++; + i++; + } + dest[j] = 0; + return (dest); +}