From e22383189f8cde2a6dd616dbd98f6906e58c2d0d Mon Sep 17 00:00:00 2001 From: Etienne Rey-bethbeder Date: Thu, 10 Nov 2022 15:09:21 +0100 Subject: [PATCH] V0.1 GetNextLine --- get_next_line.c | 125 ++++++++++++++++++++++++++++++++++++++++++ get_next_line.h | 26 +++++++++ get_next_line_utils.c | 102 ++++++++++++++++++++++++++++++++++ 3 files changed, 253 insertions(+) create mode 100644 get_next_line.c create mode 100644 get_next_line.h create mode 100644 get_next_line_utils.c diff --git a/get_next_line.c b/get_next_line.c new file mode 100644 index 0000000..b980ebc --- /dev/null +++ b/get_next_line.c @@ -0,0 +1,125 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* 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); +} diff --git a/get_next_line.h b/get_next_line.h new file mode 100644 index 0000000..72a229d --- /dev/null +++ b/get_next_line.h @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: erey-bet +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/10/15 23:40:12 by erey-bet #+# #+# */ +/* Updated: 2022/10/15 23:51:30 by erey-bet ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H +# define GET_NEXT_LINE_H + +# include +# include + +char *get_next_line(int fd); +void *ft_calloc(size_t nitems, size_t size); +size_t ft_strlen(const char *str); +int ft_strchr(const char *str, int search); +void ft_strlcpy(char *dest, const char *src, size_t size); +void *ft_realloc(void *ptr, size_t size); + +#endif diff --git a/get_next_line_utils.c b/get_next_line_utils.c new file mode 100644 index 0000000..f6a7043 --- /dev/null +++ b/get_next_line_utils.c @@ -0,0 +1,102 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: erey-bet +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/11/07 17:19:41 by erey-bet #+# #+# */ +/* Updated: 2022/11/07 17:19:42 by erey-bet ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +void *ft_calloc(size_t nitems, size_t size) +{ + size_t i; + char *tmp; + + if (nitems == 0 || size == 0) + return (malloc(0)); + if (nitems * size < nitems) + return (NULL); + tmp = malloc(nitems * size); + if (tmp == NULL) + return (NULL); + i = 0; + while (i < nitems * size) + { + tmp[i] = '\0'; + i++; + } + return (tmp); +} + +size_t ft_strlen(const char *str) +{ + int i; + + i = 0; + while (str[i] != '\0') + i++; + return (i); +} + +int ft_strchr(const char *str, int search) +{ + int i; + + i = 0; + while (str[i] || str[i] == (unsigned char)search) + { + if (str[i] == (unsigned char)search) + return (i); + i++; + } + return (-1); +} + +void ft_strlcpy(char *dest, const char *src, size_t size) +{ + size_t i; + + i = 0; + if (!size || !dest || !src) + return ; + while (i < size - 1 && src[i] != '\0') + { + dest[i] = src[i]; + i++; + } + dest[i] = '\0'; +} + +void *ft_realloc(void *ptr, size_t size) +{ + char *str; + char *p; + int i; + + i = -1; + p = ptr; + str = ft_calloc(ft_strlen(p) + 1, 1); + while (p[++i]) + str[i] = p[i]; + str[i] = '\0'; + free(ptr); + p = ft_calloc(size + BUFFER_SIZE + 1, 1); + if (p == NULL) + return (NULL); + i = 0; + while (str[i]) + { + p[i] = str[i]; + i++; + } + p[i] = '\0'; + ptr = p; + free(str); + str = NULL; + return (ptr); +}