Harden ft_split, provide ft_free_split
authorLukas Jiriste <ljiriste@student.42prague.com>
Fri, 2 Aug 2024 12:04:56 +0000 (14:04 +0200)
committerLukas Jiriste <ljiriste@student.42prague.com>
Fri, 2 Aug 2024 12:04:56 +0000 (14:04 +0200)
ft_str/ft_split.c
inc/ft_str.h

index 641ca2584b755ec1b348129bb0fcd77c9fe473dd..c9994d45481e710603686d43aa5178404451fdef 100644 (file)
@@ -6,14 +6,14 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2023/06/20 11:51:05 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/08/01 11:56:05 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/08/02 14:01:23 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "ft_str.h"
 #include <stdlib.h>
 
-size_t substr_len(const char *str, const char *seps)
+static size_t  substr_len(const char *str, const char *seps)
 {
        size_t  len;
 
@@ -23,7 +23,7 @@ size_t        substr_len(const char *str, const char *seps)
        return (len);
 }
 
-size_t count_valid_strs(const char *str, const char *seps)
+static size_t  count_valid_strs(const char *str, const char *seps)
 {
        size_t  i;
        size_t  str_count;
@@ -41,12 +41,14 @@ size_t      count_valid_strs(const char *str, const char *seps)
        return (str_count);
 }
 
-char   *extract_substr(const char *str, const char *seps)
+static char    *extract_substr(const char *str, const char *seps)
 {
        char    *res;
        size_t  i;
 
        res = malloc((substr_len(str, seps) + 1) * sizeof(char));
+       if (!res)
+               return (NULL);
        i = 0;
        while (!ft_strchr(seps, str[i]))
        {
@@ -57,6 +59,20 @@ char *extract_substr(const char *str, const char *seps)
        return (res);
 }
 
+void   ft_free_split(char **split)
+{
+       size_t  i;
+
+       i = 0;
+       while (split[i])
+       {
+               free(split[i]);
+               ++i;
+       }
+       free(split);
+       return ;
+}
+
 char   **ft_split(const char *str, const char *seps)
 {
        char    **res;
@@ -72,11 +88,15 @@ char        **ft_split(const char *str, const char *seps)
        {
                if (!ft_strchr(seps, str[i]))
                {
-                       res[str_num++] = extract_substr(&str[i], seps);
-                       i += substr_len(&str[i], seps);
+                       res[str_num] = extract_substr(&str[i], seps);
+                       if (!res[str_num++])
+                       {
+                               ft_free_split(res);
+                               return (NULL);
+                       }
+                       i += substr_len(&str[i], seps) - 1;
                }
-               else
-                       ++i;
+               ++i;
        }
        res[str_num] = NULL;
        return (res);
index b632bf116fe36ac8cfaf8cedeb794461dba261c4..56d743b06701a3a791881812e9a76897d16d26fd 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <ljiriste@student.42prague.com>   +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2023/12/09 11:50:15 by ljiriste          #+#    #+#             */
-/*   Updated: 2024/07/21 18:08:41 by ljiriste         ###   ########.fr       */
+/*   Updated: 2024/08/02 14:02:44 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -32,6 +32,7 @@ char  *ft_strjoin(const char *s1, const char *s2);
 char   *ft_strtrim(const char *s1, const char *set);
 char   *ft_remove_space(const char *str);
 char   **ft_split(const char *str, const char *seps);
+void   ft_free_split(char **split);
 char   *ft_strmapi(const char *s, char (*f)(unsigned int, char));
 void   ft_striteri(char *s, void (*f)(unsigned int, char *));