summaryrefslogtreecommitdiff
path: root/libft/get_next_line.c
diff options
context:
space:
mode:
authorDominik Kaiser2024-05-08 13:14:19 +0200
committerDominik Kaiser2024-05-08 13:14:19 +0200
commit95ccc46ad62c59e648679acad8b44ba5d4465e3d (patch)
treec053e4c692039d151cefa26759bee90d31d8c0a0 /libft/get_next_line.c
parent42289aa55c7dafe8fffbcdfb0e02f089b7b83afb (diff)
downloadpipex-95ccc46ad62c59e648679acad8b44ba5d4465e3d.tar.gz
pipex-95ccc46ad62c59e648679acad8b44ba5d4465e3d.zip
Add libft as dirHEADmaster
Diffstat (limited to 'libft/get_next_line.c')
-rw-r--r--libft/get_next_line.c84
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);
+}