diff options
| author | Dominik Kaiser | 2024-05-08 13:14:19 +0200 |
|---|---|---|
| committer | Dominik Kaiser | 2024-05-08 13:14:19 +0200 |
| commit | 95ccc46ad62c59e648679acad8b44ba5d4465e3d (patch) | |
| tree | c053e4c692039d151cefa26759bee90d31d8c0a0 /libft/get_next_line.c | |
| parent | 42289aa55c7dafe8fffbcdfb0e02f089b7b83afb (diff) | |
| download | pipex-95ccc46ad62c59e648679acad8b44ba5d4465e3d.tar.gz pipex-95ccc46ad62c59e648679acad8b44ba5d4465e3d.zip | |
Diffstat (limited to 'libft/get_next_line.c')
| -rw-r--r-- | libft/get_next_line.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/libft/get_next_line.c b/libft/get_next_line.c new file mode 100644 index 0000000..46edb73 --- /dev/null +++ b/libft/get_next_line.c @@ -0,0 +1,84 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/03/15 14:13:51 by dkaiser #+# #+# */ +/* Updated: 2024/03/25 15:26:21 by dkaiser ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +static int get_next_line_len(char *buf, int pos) +{ + int len; + + len = 0; + while (pos + len < BUFFER_SIZE) + { + if (buf[pos + len] == '\n') + { + len++; + break ; + } + if (!buf[pos + len]) + break ; + len++; + } + return (len); +} + +static void get_next_line_rec(int fd, char *buf, char **result, int pos) +{ + int len; + int i; + int readlen; + + len = get_next_line_len(buf, pos); + *result = str_add_buffer(*result, buf + pos, len); + if (pos + len == BUFFER_SIZE && buf[BUFFER_SIZE - 1] == '\n') + return (clear_buffer(buf, pos)); + i = 0; + while (i < len) + buf[pos + i++] = '\0'; + if (pos + len == BUFFER_SIZE && *result) + { + readlen = read(fd, buf, BUFFER_SIZE); + if (readlen < 0) + { + clear_buffer(buf, 0); + free(*result); + *result = NULL; + } + else if (readlen > 0) + get_next_line_rec(fd, buf, result, 0); + } +} + +char *get_next_line(int fd) +{ + static char buf[BUFFER_SIZE]; + int i; + char *result; + int readlen; + + i = 0; + readlen = 0; + result = NULL; + while (i < BUFFER_SIZE && !buf[i]) + i++; + if (i == BUFFER_SIZE) + { + readlen = read(fd, buf, BUFFER_SIZE); + if (readlen < 0) + clear_buffer(buf, 0); + else if (readlen > 0) + return (get_next_line(fd)); + return (NULL); + } + get_next_line_rec(fd, buf, &result, i); + return (result); +} |
