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 | |
| 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...)
| -rw-r--r-- | get_next_line.c | 94 | ||||
| -rw-r--r-- | get_next_line.h | 6 | ||||
| -rw-r--r-- | get_next_line_utils.c | 12 |
3 files changed, 86 insertions, 26 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); } diff --git a/get_next_line.h b/get_next_line.h index 1e9a6f6..f0b0006 100644 --- a/get_next_line.h +++ b/get_next_line.h @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/15 14:14:07 by dkaiser #+# #+# */ -/* Updated: 2024/03/21 15:22:54 by dkaiser ### ########.fr */ +/* Updated: 2024/03/22 12:04:28 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,8 @@ # define BUFFER_SIZE 42 # endif +int ft_strlen(const char *str); char *get_next_line(int fd); -char * str_realloc(char *str, size_t size); +char *str_realloc(char *str, size_t size); + #endif // GET_NEXT_LINE_H diff --git a/get_next_line_utils.c b/get_next_line_utils.c index d6fc37a..6127736 100644 --- a/get_next_line_utils.c +++ b/get_next_line_utils.c @@ -6,12 +6,22 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/15 14:14:59 by dkaiser #+# #+# */ -/* Updated: 2024/03/21 15:22:40 by dkaiser ### ########.fr */ +/* Updated: 2024/03/22 12:05:00 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "get_next_line.h" +int ft_strlen(const char *str) +{ + int len; + + len = 0; + while (str[len]) + len++; + return (len); +} + char * str_realloc(char *str, size_t size) { char *result; |
