]> git.dkaiser.de - 42/get_next_line.git/commitdiff
It is working (or is it?)
authorDominik Kaiser <dkaiser@1-C-11.42heilbronn.de>
Fri, 22 Mar 2024 15:52:19 +0000 (16:52 +0100)
committerDominik Kaiser <dkaiser@1-C-11.42heilbronn.de>
Fri, 22 Mar 2024 15:52:19 +0000 (16:52 +0100)
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...)

get_next_line.c
get_next_line.h
get_next_line_utils.c

index 2f5a9548319ad7773298f754f87fe4aa322bcf10..7b43e06e079917592786705c99478c29b0dd98d7 100644 (file)
@@ -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);
 }
index 1e9a6f6088afb0c0a749cf50f9beab7c8f1fc480..f0b0006c22115799f86ade3f08568e01f8ef6e0f 100644 (file)
@@ -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
index d6fc37a5491450440be14f55970fb2338a8173b2..612773659121e4be0172e1e71bbc3283d67ecd7c 100644 (file)
@@ -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;