/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* get_next_line_bonus.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: dgaillet +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/11/24 15:55:25 by dgaillet #+# #+# */ /* Updated: 2025/11/27 17:40:04 by dgaillet ### ########lyon.fr */ /* */ /* ************************************************************************** */ #include #include "get_next_line_bonus.h" static int del_before_nl(char buf[BUFFER_SIZE]) { int nl_i; int i; char *temp; nl_i = index_of_nl(buf, BUFFER_SIZE); if (nl_i >= 0) { temp = ft_substr(buf, nl_i + 1, BUFFER_SIZE - nl_i); if (!temp) return (-1); ft_bzero(buf, BUFFER_SIZE); i = 0; while (temp[i]) { buf[i] = temp[i]; i++; } free(temp); } return (1); } static char *ft_read_one(char buf[BUFFER_SIZE], int fd, char *str) { int temp; str = ft_strjoin_new(str, buf, BUFFER_SIZE); if (!str) return (NULL); ft_bzero(buf, BUFFER_SIZE); temp = read(fd, buf, BUFFER_SIZE); if (temp < 0) { free(str); return (NULL); } if ((!str || ft_strlen(str) == 0) && temp == 0) { free(str); return (NULL); } if (temp == 0) return (str); return (str); } static char *extract_all_nl(char buf[BUFFER_SIZE], int fd, char *str, int nl_i) { int temp; if (!str) return (NULL); while (nl_i < 0) { str = ft_read_one(buf, fd, str); if (!str) return (NULL); nl_i = index_of_nl(buf, BUFFER_SIZE); if (nl_i < 0 && !ft_strlen(buf)) return (str); } str = ft_strjoin_new(str, buf, nl_i); if (!str) return (NULL); temp = del_before_nl(buf); if (temp < 0) { free(str); return (NULL); } return (str); } static char *ft_gnl_extra(char buf[BUFFER_SIZE], int fd) { int nl_i; int temp; char *str; nl_i = index_of_nl(buf, BUFFER_SIZE); if (nl_i >= 0) { str = ft_substr(buf, 0, nl_i + 1); temp = del_before_nl(buf); if (temp < 0) return (free(str), NULL); } else str = extract_all_nl(buf, fd, ft_substr("", 0, 1), nl_i); return (str); } char *get_next_line(int fd) { static char strs[1024][BUFFER_SIZE]; char *to_return; if (fd < 0) return (NULL); to_return = ft_gnl_extra(strs[fd], fd); return (to_return); } /* #include #include int main(void) { char *str; int fd1; fd1 = open("read_error.txt", O_RDONLY); str = get_next_line(fd1); while (str) { printf("%s", str); free(str); str = get_next_line(fd1); } printf("%s\n", str); close(fd1); } */