From 1d30401e1559fd3888f6bfc259e5c0e83c5bf506 Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Mon, 16 Dec 2019 14:09:02 +0100 Subject: [PATCH] new header for bonus --- get_next_line.h | 6 +- get_next_line_bonus.c | 154 ++++++++++++++++++++++++++++++++++++ get_next_line_bonus.h | 38 +++++++++ get_next_line_utils_bonus.c | 73 +++++++++++++++++ 4 files changed, 266 insertions(+), 5 deletions(-) create mode 100644 get_next_line_bonus.c create mode 100644 get_next_line_bonus.h create mode 100644 get_next_line_utils_bonus.c diff --git a/get_next_line.h b/get_next_line.h index 83a4235..1c34212 100644 --- a/get_next_line.h +++ b/get_next_line.h @@ -6,7 +6,7 @@ /* By: hulamy +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/29 10:19:37 by hulamy #+# #+# */ -/* Updated: 2019/12/16 13:58:03 by hulamy ### ########.fr */ +/* Updated: 2019/12/16 14:07:14 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,10 +17,6 @@ # include # include -# ifndef BUFF_SIZE -# define BUFF_SIZE 9999 -# endif - typedef struct s_gnlist { int lfd; diff --git a/get_next_line_bonus.c b/get_next_line_bonus.c new file mode 100644 index 0000000..12ccd5f --- /dev/null +++ b/get_next_line_bonus.c @@ -0,0 +1,154 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hulamy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/16 14:08:36 by hulamy #+# #+# */ +/* Updated: 2019/12/16 14:08:39 by hulamy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +/* +** #include //for printf +** #include //for open +** +** int main(int ac, char **av) +** { +** int *fd; +** int i; +** int j; +** char *line; +** +** if (ac < 2) +** return (0); +** line = NULL; +** i = 0; +** if (!(fd = (int *)malloc(sizeof(int) * ac))) +** return (0); +** while (++i <= ac - 1) +** fd[i - 1] = open(av[i], O_RDONLY); +** i = 0; +** j = 0; +** while (j < ac - 1) +** { +** if (get_next_line(fd[i], &line) > 0) +** { +** printf("fd%i| %s\n", fd[i], line); +** free(line); +** j = 0; +** } +** else +** { +** printf("fd%i|*FINI*\n", fd[i]); +** j++; +** } +** i++; +** if (i >= ac - 1) +** i = 0; +** } +** free (fd); +** // while (1); +** return (0); +** } +*/ + +int multi_fd(int fd, t_gnlist **lst) +{ + t_gnlist *tmp; + + tmp = *lst; + while (*lst && (*lst)->lfd != fd && (*lst)->next != tmp) + *lst = (*lst)->next; + if (!tmp || ((*lst)->next == tmp && (*lst)->lfd != fd)) + { + if (!(tmp = (t_gnlist*)malloc(sizeof(*tmp)))) + return (0); + tmp->lfd = fd; + if (!(tmp->string = ft_strdup(""))) + return (0); + if (*lst) + { + tmp->next = (*lst)->next; + (*lst)->next = tmp; + } + else + tmp->next = tmp; + *lst = tmp; + } + return (1); +} + +char *ft_strjoinfree(char const *s1, char const *s2) +{ + char *str; + int len; + int j; + + if (!s1 || !s2) + return (NULL); + len = ft_strlen(s1) + ft_strlen(s2); + if (!(str = (char *)malloc(sizeof(char) * (len + 1)))) + return (NULL); + len = 0; + j = 0; + while (s1[j] != '\0') + str[len++] = s1[j++]; + j = 0; + while (s2[j] != '\0') + str[len++] = s2[j++]; + str[len] = '\0'; + free((char*)s1); + return (str); +} + +int hasnewline(char *str, t_gnlist *lst, char **line) +{ + str[0] = '\0'; + if (!(*line = ft_strdup(lst->string))) + return (-1); + ft_memmove(lst->string, str + 1, ft_strlen(str + 1) + 1); + return (1); +} + +void free_lst(t_gnlist **lst, const int fd) +{ + t_gnlist *tmp; + + tmp = *lst; + while ((*lst)->next && (*lst)->next->lfd != fd) + (*lst) = (*lst)->next; + free(tmp->string); + free(tmp); + (*lst)->next = (*lst)->next->next; +} + +int get_next_line(const int fd, char **line) +{ + char buf[BUFF_SIZE + 1]; + int ret; + static t_gnlist *lst = NULL; + char *str; + + if (!(multi_fd(fd, &lst)) || !(ret = 1) || !line || fd < 0) + return (-1); + while (ret > 0) + { + if ((str = ft_strchr(lst->string, '\n'))) + return (hasnewline(str, lst, line)); + if ((ret = read(fd, buf, BUFF_SIZE)) < 0) + return (-1); + buf[ret] = '\0'; + if (!(lst->string = ft_strjoinfree(lst->string, buf))) + return (-1); + } + if (*(lst->string) && !(*line = ft_strdup(lst->string))) + return (-1); + if (*(lst->string) && ++ret == 1) + (lst->string)[0] = '\0'; + free_lst(&lst, fd); + return (ret); +} diff --git a/get_next_line_bonus.h b/get_next_line_bonus.h new file mode 100644 index 0000000..ca8911f --- /dev/null +++ b/get_next_line_bonus.h @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_bonus.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hulamy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/16 14:07:51 by hulamy #+# #+# */ +/* Updated: 2019/12/16 14:07:54 by hulamy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H +# define GET_NEXT_LINE_H + +# include +# include +# include + +typedef struct s_gnlist +{ + int lfd; + char *string; + struct s_gnlist *next; +} t_gnlist; + +int get_next_line(const int fd, char **line); +int multi_fd(int fd, t_gnlist **lst); +char *ft_strjoinfree(char const *s1, char const *s2); +int hasnewline(char *str, t_gnlist *lst, char **line); +void free_lst(t_gnlist **lst, const int fd); + +size_t ft_strlen(const char *str); +void *ft_memmove(void *dst, const void *src, size_t len); +char *ft_strchr(const char *s, int c); +char *ft_strdup(const char *src); + +#endif diff --git a/get_next_line_utils_bonus.c b/get_next_line_utils_bonus.c new file mode 100644 index 0000000..9de7536 --- /dev/null +++ b/get_next_line_utils_bonus.c @@ -0,0 +1,73 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_utils_bonus.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hulamy +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/16 14:08:47 by hulamy #+# #+# */ +/* Updated: 2019/12/16 14:08:48 by hulamy ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +char *ft_strdup(const char *src) +{ + int i; + char *str; + + i = 0; + while (src[i] != '\0') + i++; + if (!(str = (char*)malloc(sizeof(*str) * (i + 1)))) + return (NULL); + while (i-- >= 0) + str[i + 1] = src[i + 1]; + return (str); +} + +char *ft_strchr(const char *s, int c) +{ + int i; + int j; + + i = 0; + j = -1; + while (s[i]) + i++; + while (++j < i + 1) + if (s[j] == c) + return ((char *)s + j); + return (NULL); +} + +void *ft_memmove(void *dst, const void *src, size_t len) +{ + size_t i; + char *cpsrc; + char *cpdst; + + i = -1; + cpsrc = (char *)src; + cpdst = (char *)dst; + if (dst == src) + return (dst); + if (cpsrc < cpdst) + while (len--) + cpdst[len] = cpsrc[len]; + else + while (++i < len) + cpdst[i] = cpsrc[i]; + return (dst); +} + +size_t ft_strlen(const char *str) +{ + size_t i; + + i = 0; + while (str[i]) + i++; + return (i); +}