/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* get_next_line.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: erey-bet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/15 23:42:35 by erey-bet #+# #+# */ /* Updated: 2022/11/07 17:11:17 by erey-bet ### ########.fr */ /* */ /* ************************************************************************** */ #include "get_next_line.h" void *read_line(char *str, char *buff, int fd, int y) { y = read(fd, buff, BUFFER_SIZE); if (y == -1 || (ft_strlen(buff) == 0 && str == NULL)) { free(buff); return (NULL); } buff[y] = '\0'; return (buff); } int get_next(char *str, char *buff, int y, int last_malloc) { if (y == -1 || (ft_strlen(buff) == 0 && str == NULL)) { free(buff); return (-1); } buff[y] = '\0'; if (str == NULL) { str = ft_calloc(BUFFER_SIZE + 1, 1); ft_strlcpy(str, buff, BUFFER_SIZE + 1); } else { if ((size_t)last_malloc - 1 < ft_strlen(str) + ft_strlen(buff)) { str = ft_realloc(str, last_malloc); last_malloc += BUFFER_SIZE; } ft_strlcpy(str + ft_strlen(str), buff, BUFFER_SIZE + 1); } return (last_malloc); } char *get_next_line(int fd) { char *buff; static char *str; size_t i; int y; static int last_malloc; last_malloc = BUFFER_SIZE + 1; buff = ft_calloc(BUFFER_SIZE + 1, 1); y = 1; while ((str == NULL || ft_strchr(str, '\n') == -1) && y > 0) { y = read(fd, buff, BUFFER_SIZE); last_malloc = get_next(str, buff, y, last_malloc); if (last_malloc == -1) return (NULL); } i = 0; while (str[i] != '\n' && str[i]) i++; if (str[i] == '\n') i++; free(buff); buff = malloc(i + 1); ft_strlcpy(buff, str, i + 1); buff[i] = '\0'; ft_strlcpy(str, str + i, BUFFER_SIZE + 1); if (ft_strlen(str) == 0) { free(str); str = NULL; } return (buff); } #include #include int main(int argc, char *argv[]) { char *r; int fd; (void) argc; fd = open(argv[1], 0); r = get_next_line(fd); printf("%s", r); printf("\n"); free(r); r = get_next_line(fd); printf("%s", r); printf("\n"); free(r); r = get_next_line(fd); printf("%s", r); printf("\n"); r = get_next_line(fd); printf("%s", r); printf("\n"); r = get_next_line(fd); printf("%s", r); printf("\n"); r = get_next_line(fd); printf("%s", r); printf("\n"); r = get_next_line(fd); printf("%s", r); printf("\n"); free(r); close(fd); return (0); }