diff options
| -rw-r--r-- | .gitignore | 5 | ||||
| -rw-r--r-- | Makefile | 11 | ||||
| -rw-r--r-- | get_next_line.c | 82 | ||||
| -rw-r--r-- | get_next_line.h | 8 | ||||
| -rw-r--r-- | get_next_line_utils.c | 7 | ||||
| -rw-r--r-- | main.c | 8 |
6 files changed, 63 insertions, 58 deletions
@@ -2,7 +2,12 @@ a.out get_next_line *.ghc +t1 +t2 +testrand +testnl test test2 test3 *.dSYM + @@ -6,14 +6,14 @@ # By: cacharle <marvin@42.fr> +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/10/08 08:11:00 by cacharle #+# #+# # -# Updated: 2019/10/10 11:20:17 by cacharle ### ########.fr # +# Updated: 2019/10/19 14:49:29 by cacharle ### ########.fr # # # # **************************************************************************** # $(RM) = rm -f CC = gcc -CCFLAGS = -Wall -Wextra -Werror +CCFLAGS = -Wall -Wextra -g NAME = get_next_line SRC = get_next_line.c get_next_line_utils.c main.c @@ -35,3 +35,10 @@ fclean: clean $(RM) $(NAME) re: fclean all + +compare: all + @./get_next_line Makefile > t1 + @cat -e Makefile | sed 's/^\(.*\)\$$/[\1]/' > t2 + @diff t1 t2 + + diff --git a/get_next_line.c b/get_next_line.c index 94ef3d8..36edac1 100644 --- a/get_next_line.c +++ b/get_next_line.c @@ -5,8 +5,8 @@ /* +:+ +:+ +:+ */ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/10/08 10:37:41 by cacharle #+# #+# */ -/* Updated: 2019/10/11 14:29:11 by cacharle ### ########.fr */ +/* Created: 2019/10/19 09:08:36 by cacharle #+# #+# */ +/* Updated: 2019/10/19 16:19:25 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,59 +14,56 @@ #include <stdlib.h> #include "get_next_line.h" -/* -** store rest in local_buf and read diff -** while no newline -> recursion -** newline -> store what is after newline -** allocate line according to stack depth -** cpy before newline at the end -** at each stack pop store local buf on the allocated line -*/ - int get_next_line(int fd, char **line) { int ret; int split_at; char buf[BUFFER_SIZE + 1]; - static char *rest = NULL; + static char rest[BUFFER_SIZE + 1] = {0}; if (fd < 0 || line == NULL) return (ERROR); - while ((ret = read(fd, buf, BUFFER_SIZE)) > 0 || !empty_rest(rest)) + int has_stuff = rest[0] != 0; + *line = put_rest(*line, rest); + if (rest[0] != '\0') + return (LINE_READ); + while ((ret = read(fd, buf, BUFFER_SIZE)) > 0)// || rest[0] != '\0') { - buf[ret] = 0; - rest = ft_strappend(rest, buf); - if ((split_at = find_newline(rest)) == -1 && ret == 0) - split_at = ft_strlen(rest); + buf[ret] = '\0'; + split_at = find_newline(buf); if (split_at == -1) + { + *line = ft_strappend(*line, buf); continue ; - if ((*line = (char*)malloc(sizeof(char) * (split_at + 1))) == NULL) - return (ERROR); - ft_strncpy(*line, rest, split_at); - (*line)[split_at] = '\0'; - return ((rest = shift_rest(rest, split_at)) == NULL - ? ERROR : LINE_READ); + } + buf[split_at] = '\0'; + ft_strncpy(rest, buf + split_at + 1, BUFFER_SIZE + 1); + *line = ft_strappend(*line, buf); + return LINE_READ; } - free(rest); - rest = NULL; + if (has_stuff) + return (LINE_READ); return (ret == -1 ? ERROR : END_OF_FILE); } -char *shift_rest(char *rest, int split_at) +char *put_rest(char *line, char *rest) { - char *copy; - int len; + int split_at; - len = ft_strlen(rest) - split_at + 1; - if ((copy = (char*)malloc(sizeof(char) * len)) == NULL) - return (NULL); - ft_strncpy(copy, rest + split_at + 1, len); - free(rest); - if ((rest = (char*)malloc(sizeof(char) * len)) == NULL) - return (NULL); - ft_strncpy(rest, copy, len); - free(copy); - return (rest); + split_at = find_newline(rest); + if (split_at == -1) + { + line = malloc(sizeof(char) * (ft_strlen(rest) + 1)); + ft_strcpy(line, rest); + /* line[ft_strlen(rest)] = 0; */ + rest[0] = '\0'; + return (line); + } + line = malloc(sizeof(char) * (split_at + 1)); + ft_strncpy(line, rest, split_at + 1); + line[split_at] = '\0'; + ft_strncpy(rest, rest + split_at + 1, BUFFER_SIZE); + return (line); } int find_newline(char *str) @@ -79,12 +76,3 @@ int find_newline(char *str) return (i); return (-1); } - -t_bool empty_rest(char *rest) -{ - if (rest == NULL) - return (TRUE); - if (rest[0] == 0) - return (TRUE); - return (FALSE); -} diff --git a/get_next_line.h b/get_next_line.h index 9f7aabd..619cb9b 100644 --- a/get_next_line.h +++ b/get_next_line.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/09 13:52:59 by cacharle #+# #+# */ -/* Updated: 2019/10/11 14:27:22 by cacharle ### ########.fr */ +/* Updated: 2019/10/19 16:24:03 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ # define GET_NEXT_LINE_H # ifndef BUFFER_SIZE -# define BUFFER_SIZE 32 +# define BUFFER_SIZE 100000 # endif # define LINE_READ 1 @@ -26,14 +26,14 @@ typedef int t_bool; +#include <stdio.h> /* ** get_next_line.c */ int get_next_line(int fd, char **line); -char *shift_rest(char *rest, int split_at); +char *put_rest(char *line, char *rest); int find_newline(char *str); -t_bool empty_rest(char *rest); /* ** get_next_line_utils.c - helper functions diff --git a/get_next_line_utils.c b/get_next_line_utils.c index e024c12..929e37b 100644 --- a/get_next_line_utils.c +++ b/get_next_line_utils.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/08 08:52:59 by cacharle #+# #+# */ -/* Updated: 2019/10/11 14:29:34 by cacharle ### ########.fr */ +/* Updated: 2019/10/19 14:09:48 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,14 +47,15 @@ char *ft_strappend(char *dest, char *src) if ((dest = (char*)malloc(sizeof(char) * (ft_strlen(src) + 1))) == NULL) return (NULL); ft_strcpy(dest, src); + /* printf("%s - %s\n", dest, src); */ return (dest); } if ((copy = (char*)malloc(sizeof(char) * (ft_strlen(dest) + 1))) == NULL) return (NULL); ft_strcpy(copy, dest); /* free(dest); */ - if ((dest = (char*)malloc(sizeof(char) - * (ft_strlen(dest) + ft_strlen(src) + 1))) == NULL) + dest = (char*)malloc(sizeof(char) * (ft_strlen(dest) + ft_strlen(src) + 1)); + if (dest == NULL) return (NULL); ft_strcpy(dest, copy); free(copy); @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/10 09:27:41 by cacharle #+# #+# */ -/* Updated: 2019/10/10 11:04:31 by cacharle ### ########.fr */ +/* Updated: 2019/10/19 09:01:18 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,8 +22,12 @@ int main(int argc, char **argv) char *line; int ret; + if (argc != 2) + { + printf("You forgot the filename"); + exit(1); + } printf("BUFFER_SIZE = %d\n", BUFFER_SIZE); - (void)argc; fd = open(argv[1], O_RDONLY); while ((ret = get_next_line(fd, &line)) == LINE_READ) { |
