diff options
| author | Dominik Kaiser | 2024-03-22 16:52:19 +0100 |
|---|---|---|
| committer | Dominik Kaiser | 2024-03-22 16:52:19 +0100 |
| commit | c9e8005df3f0f3f68f58626420960519b078f5a4 (patch) | |
| tree | f4355e5a1aef18751252d770e1821285ffa6de41 /get_next_line.c | |
| parent | 149353e6b0895ae02ae05ee2635519a811b0f46d (diff) | |
| download | get_next_line-c9e8005df3f0f3f68f58626420960519b078f5a4.tar.gz get_next_line-c9e8005df3f0f3f68f58626420960519b078f5a4.zip | |
It is working (or is it?)
If '\n' is the last character in the buffer it won't work.
Other than that everything is working fine (as far as my current tests go...)
Diffstat (limited to 'get_next_line.c')
| -rw-r--r-- | get_next_line.c | 94 |
1 files changed, 71 insertions, 23 deletions
diff --git a/get_next_line.c b/get_next_line.c index 2f5a954..7b43e06 100644 --- a/get_next_line.c +++ b/get_next_line.c @@ -6,48 +6,96 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/15 14:13:51 by dkaiser #+# #+# */ -/* Updated: 2024/03/21 16:21:33 by dkaiser ### ########.fr */ +/* Updated: 2024/03/22 16:51:40 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "get_next_line.h" -int get_next_line_len(char *buffer) +char *str_add_buffer(char *old_str, char *buf, int pos, int buf_len) { - int len; + char *result; + int len; + int i; - len = 0; - while (len < BUFFER_SIZE) + if (!old_str) + len = buf_len; + else + len = ft_strlen(old_str) + buf_len; + result = malloc(sizeof(char) * len); + if (!result) + return (NULL); + result[len] = '\0'; + i = 0; + while (old_str && old_str[i]) { - if (!buffer[len]) - return (len); - if (buffer[len] == '\n') - return (len + 1); - len++; + result[i] = old_str[i]; + i++; } - return (-1); + while (i < len) + result[i++] = buf[pos++]; + return (result); } -char *get_next_line_rec(int fd, char *buffer, char *result) +void get_next_line_rec(int fd, char *buf, char **ptr_result, int pos) { - int len; - - if (!buffer[0]) - read(fd, buffer, BUFFER_SIZE); - len = get_next_line_len(buffer); - if (!len) - return (result); + int len; + int i; + char *old_res; + char *result; + int readlen; - return (result); + result = *ptr_result; + readlen = 0; + len = 0; + while (pos + len < BUFFER_SIZE) + { + if (buf[pos + len] == '\n') + { + len++; + break; + } + if (!buf[pos + len]) + break ; + len++; + } + old_res = result; + result = str_add_buffer(old_res, buf, pos, len); + *ptr_result = result; + free(old_res); + if (!result) + return ; + i = 0; + while (i < len) + buf[pos + i++] = '\0'; + if (pos + len == BUFFER_SIZE) + { + readlen = read(fd, buf, BUFFER_SIZE); + if (readlen > 0) + get_next_line_rec(fd, buf, &result, 0); + } + *ptr_result = result; } char *get_next_line(int fd) { - static char buffer[BUFFER_SIZE]; + static char buf[BUFFER_SIZE]; + int i; char *result; + int readlen; - return (NULL); + i = 0; + readlen = 0; result = NULL; - result = get_next_line_rec(fd, buffer, result); + while (i < BUFFER_SIZE && !buf[i]) + i++; + if (i == BUFFER_SIZE) + { + readlen = read(fd, buf, BUFFER_SIZE); + if (readlen > 0) + return (get_next_line(fd)); + return (NULL); + } + get_next_line_rec(fd, buf, &result, i); return (result); } |
