summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Kaiser2024-03-22 16:52:19 +0100
committerDominik Kaiser2024-03-22 16:52:19 +0100
commitc9e8005df3f0f3f68f58626420960519b078f5a4 (patch)
treef4355e5a1aef18751252d770e1821285ffa6de41
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...)
-rw-r--r--get_next_line.c94
-rw-r--r--get_next_line.h6
-rw-r--r--get_next_line_utils.c12
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;