From 5c6d9b3ba3e4946b2a527d10109f0e82284e64c5 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 15 Jan 2020 07:36:06 +0100 Subject: Isolated get_next_line internals --- Makefile | 24 +++++---- get_next_line.c | 115 ------------------------------------------ get_next_line.h | 35 ------------- get_next_line/get_next_line.c | 115 ++++++++++++++++++++++++++++++++++++++++++ get_next_line/get_next_line.h | 35 +++++++++++++ 5 files changed, 163 insertions(+), 161 deletions(-) delete mode 100644 get_next_line.c delete mode 100644 get_next_line.h create mode 100644 get_next_line/get_next_line.c create mode 100644 get_next_line/get_next_line.h diff --git a/Makefile b/Makefile index 152e843..de79815 100644 --- a/Makefile +++ b/Makefile @@ -6,15 +6,17 @@ # By: cacharle +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/10/08 15:45:53 by cacharle #+# #+# # -# Updated: 2019/11/21 03:43:46 by cacharle ### ########.fr # +# Updated: 2020/01/15 07:34:57 by cacharle ### ########.fr # # # # **************************************************************************** # LIB = ar rcs RM = rm -f +GET_NEXT_LINE_DIR = get_next_line + CC = gcc -CCFLAGS = -Wall -Wextra -Werror +CCFLAGS = -I. -I$(GET_NEXT_LINE_DIR) -Wall -Wextra -Werror NAME = libft.a SRC = ft_atoi.c ft_bzero.c ft_isalnum.c ft_isalpha.c ft_isascii.c ft_isdigit.c \ @@ -28,12 +30,15 @@ SRC = ft_atoi.c ft_bzero.c ft_isalnum.c ft_isalpha.c ft_isascii.c ft_isdigit.c \ ft_strncmp.c ft_strncpy.c ft_strnequ.c ft_strnew.c ft_strnstr.c \ ft_strrchr.c ft_split.c ft_strstr.c ft_substr.c ft_strtrim.c \ ft_tolower.c ft_toupper.c ft_strlcpy.c ft_calloc.c ft_strndup.c \ - ft_strjoin_free.c ft_strjoin_free_snd.c get_next_line.c ft_strcount.c \ - ft_printf.c ft_sprintf.c ft_snprintf.c ft_asprintf.c ft_dprintf.c \ - ft_vprintf.c ft_vsprintf.c ft_vsnprintf.c ft_vasprintf.c ft_vdprintf.c + ft_strjoin_free.c ft_strjoin_free_snd.c ft_strcount.c + # ft_printf.c ft_sprintf.c ft_snprintf.c ft_asprintf.c ft_dprintf.c \ + # ft_vprintf.c ft_vsprintf.c ft_vsnprintf.c ft_vasprintf.c ft_vdprintf.c +SRC += $(GET_NEXT_LINE_DIR)/get_next_line.c + OBJ = $(SRC:.c=.o) -INCLUDE = libft.h + +HEADER = libft.h BONUSSRC = ft_lstadd_back_bonus.c ft_lstadd_front_bonus.c ft_lstclear_bonus.c \ ft_lstdelone_bonus.c ft_lstiter_bonus.c ft_lstlast_bonus.c \ ft_lstmap_bonus.c ft_lstnew_bonus.c ft_lstsize_bonus.c ft_lstpop_front_bonus.c @@ -41,10 +46,10 @@ BONUSOBJ = $(BONUSSRC:.c=.o) all: $(NAME) -$(NAME): $(OBJ) $(INCLUDE) +$(NAME): $(OBJ) $(HEADER) $(LIB) $(NAME) $(OBJ) -bonus: $(BONUSOBJ) $(INCLUDE) +bonus: $(BONUSOBJ) $(HEADER) $(LIB) $(NAME) $(BONUSOBJ) %.o: %.c @@ -59,6 +64,3 @@ fclean: clean re: fclean all rebonus: fclean bonus - -so: $(OBJ) $(BONUSOBJ) $(INCLUDE) - $(CC) -shared -fPIC -Wl,-soname,libft.so -o libft.so $(OBJ) $(BONUSOBJ) diff --git a/get_next_line.c b/get_next_line.c deleted file mode 100644 index 00aca8d..0000000 --- a/get_next_line.c +++ /dev/null @@ -1,115 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* get_next_line.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/10/19 09:08:36 by cacharle #+# #+# */ -/* Updated: 2019/11/21 03:39:51 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "get_next_line.h" - -#define HAS_NEWLINE(str, split_at) ((split_at = find_newline(str)) != -1) - -static int find_newline(char *str) -{ - int i; - - i = -1; - while (str[++i]) - if (str[i] == '\n') - return (i); - return (-1); -} - -static int free_return(char **ptr, char **ptr2, int ret) -{ - if (ptr != NULL) - { - free(*ptr); - *ptr = NULL; - } - if (ptr2 != NULL) - { - free(*ptr2); - *ptr2 = NULL; - } - return (ret); -} - -static int read_line(int fd, char **line, char *rest) -{ - int ret; - int split_at; - char *buf; - - if ((buf = malloc(sizeof(char) * (BUFFER_SIZE + 1))) == NULL) - return (free_return(line, NULL, STATUS_ERROR)); - while ((ret = read(fd, buf, BUFFER_SIZE)) > 0) - { - buf[ret] = '\0'; - if (HAS_NEWLINE(buf, split_at)) - { - ft_strcpy(rest, buf + split_at + 1); - buf[split_at] = '\0'; - if ((*line = ft_strjoin_free(*line, buf, 1)) == NULL) - return (free_return(&buf, NULL, STATUS_ERROR)); - return (free_return(&buf, NULL, STATUS_LINE)); - } - if ((*line = ft_strjoin_free(*line, buf, 1)) == NULL) - return (free_return(&buf, NULL, STATUS_ERROR)); - } - if (ret == -1) - return (free_return(&buf, line, STATUS_ERROR)); - return (free_return(&buf, NULL, ret)); -} - -/* -** if has rest: -** if rest has newline: -** push rest until newline in line, shift rest -** return LINE_READ -** else: -** push rest in line -** -** while can read fd in buf -** if buf has newline: -** push buf until newline in line -** push buf after newline in rest -** return LINE_READ -** push buf in line -** -** return GNL_EOF -*/ - -int get_next_line(int fd, char **line) -{ - int split_at; - static char rest[OPEN_MAX][BUFFER_SIZE + 1] = {{0}}; - - if (fd < 0 || fd > OPEN_MAX || line == NULL || BUFFER_SIZE <= 0) - return (STATUS_ERROR); - if ((*line = ft_strdup("")) == NULL) - return (STATUS_ERROR); - if (rest[fd][0] == '\0') - return (read_line(fd, line, rest[fd])); - if (HAS_NEWLINE(rest[fd], split_at)) - { - free(*line); - if ((*line = (char*)malloc(sizeof(char) * (split_at + 1))) == NULL) - return (STATUS_ERROR); - ft_strncpy(*line, rest[fd], split_at); - (*line)[split_at] = '\0'; - ft_strcpy(rest[fd], rest[fd] + split_at + 1); - return (STATUS_LINE); - } - free(*line); - if (!(*line = (char*)malloc(sizeof(char) * (ft_strlen(rest[fd]) + 1)))) - return (STATUS_ERROR); - ft_strcpy(*line, rest[fd]); - rest[fd][0] = '\0'; - return (read_line(fd, line, rest[fd])); -} diff --git a/get_next_line.h b/get_next_line.h deleted file mode 100644 index 36a5116..0000000 --- a/get_next_line.h +++ /dev/null @@ -1,35 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* get_next_line.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cacharle +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/10/09 13:52:59 by cacharle #+# #+# */ -/* Updated: 2019/11/21 02:47:49 by cacharle ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef GET_NEXT_LINE_H -# define GET_NEXT_LINE_H - -# include -# include -# include -# include "libft.h" - -# ifndef BUFFER_SIZE -# define BUFFER_SIZE 32 -# endif - -# define STATUS_LINE 1 -# define STATUS_EOF 0 -# define STATUS_ERROR -1 - -/* -** get_next_line.c -*/ - -int get_next_line(int fd, char **line); - -#endif diff --git a/get_next_line/get_next_line.c b/get_next_line/get_next_line.c new file mode 100644 index 0000000..e51f152 --- /dev/null +++ b/get_next_line/get_next_line.c @@ -0,0 +1,115 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/10/19 09:08:36 by cacharle #+# #+# */ +/* Updated: 2020/01/15 07:26:50 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +#define HAS_NEWLINE(str, split_at) ((split_at = gnl_find_newline(str)) != -1) + +static int gnl_find_newline(char *str) +{ + int i; + + i = -1; + while (str[++i]) + if (str[i] == '\n') + return (i); + return (-1); +} + +static int gnl_free_return(char **ptr, char **ptr2, int ret) +{ + if (ptr != NULL) + { + free(*ptr); + *ptr = NULL; + } + if (ptr2 != NULL) + { + free(*ptr2); + *ptr2 = NULL; + } + return (ret); +} + +static int gnl_read_line(int fd, char **line, char *rest) +{ + int ret; + int split_at; + char *buf; + + if ((buf = malloc(sizeof(char) * (BUFFER_SIZE + 1))) == NULL) + return (gnl_free_return(line, NULL, GNL_STATUS_ERROR)); + while ((ret = read(fd, buf, BUFFER_SIZE)) > 0) + { + buf[ret] = '\0'; + if (HAS_NEWLINE(buf, split_at)) + { + ft_strcpy(rest, buf + split_at + 1); + buf[split_at] = '\0'; + if ((*line = ft_strjoin_free(*line, buf, 1)) == NULL) + return (gnl_free_return(&buf, NULL, GNL_STATUS_ERROR)); + return (gnl_free_return(&buf, NULL, GNL_STATUS_LINE)); + } + if ((*line = ft_strjoin_free(*line, buf, 1)) == NULL) + return (gnl_free_return(&buf, NULL, GNL_STATUS_ERROR)); + } + if (ret == -1) + return (gnl_free_return(&buf, line, GNL_STATUS_ERROR)); + return (gnl_free_return(&buf, NULL, ret)); +} + +/* +** if has rest: +** if rest has newline: +** push rest until newline in line, shift rest +** return LINE_READ +** else: +** push rest in line +** +** while can read fd in buf +** if buf has newline: +** push buf until newline in line +** push buf after newline in rest +** return LINE_READ +** push buf in line +** +** return GNL_EOF +*/ + +int get_next_line(int fd, char **line) +{ + int split_at; + static char rest[OPEN_MAX][BUFFER_SIZE + 1] = {{0}}; + + if (fd < 0 || fd > OPEN_MAX || line == NULL || BUFFER_SIZE <= 0) + return (GNL_STATUS_ERROR); + if ((*line = ft_strdup("")) == NULL) + return (GNL_STATUS_ERROR); + if (rest[fd][0] == '\0') + return (gnl_read_line(fd, line, rest[fd])); + if (HAS_NEWLINE(rest[fd], split_at)) + { + free(*line); + if ((*line = (char*)malloc(sizeof(char) * (split_at + 1))) == NULL) + return (GNL_STATUS_ERROR); + ft_strncpy(*line, rest[fd], split_at); + (*line)[split_at] = '\0'; + ft_strcpy(rest[fd], rest[fd] + split_at + 1); + return (GNL_STATUS_LINE); + } + free(*line); + if (!(*line = (char*)malloc(sizeof(char) * (ft_strlen(rest[fd]) + 1)))) + return (GNL_STATUS_ERROR); + ft_strcpy(*line, rest[fd]); + rest[fd][0] = '\0'; + return (gnl_read_line(fd, line, rest[fd])); +} diff --git a/get_next_line/get_next_line.h b/get_next_line/get_next_line.h new file mode 100644 index 0000000..9d15202 --- /dev/null +++ b/get_next_line/get_next_line.h @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/10/09 13:52:59 by cacharle #+# #+# */ +/* Updated: 2020/01/15 07:22:07 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H +# define GET_NEXT_LINE_H + +# include +# include +# include +# include "libft.h" + +# ifndef BUFFER_SIZE +# define BUFFER_SIZE 32 +# endif + +# define GNL_STATUS_LINE 1 +# define GNL_STATUS_EOF 0 +# define GNL_STATUS_ERROR -1 + +/* +** get_next_line.c +*/ + +int get_next_line(int fd, char **line); + +#endif -- cgit