summaryrefslogtreecommitdiff
path: root/get_next_line.c
diff options
context:
space:
mode:
authorDominik Kaiser2024-03-22 16:52:19 +0100
committerDominik Kaiser2024-03-22 16:52:19 +0100
commitc9e8005df3f0f3f68f58626420960519b078f5a4 (patch)
treef4355e5a1aef18751252d770e1821285ffa6de41 /get_next_line.c
parent149353e6b0895ae02ae05ee2635519a811b0f46d (diff)
downloadget_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.c94
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);
}