From: Lukas Jiriste Date: Fri, 2 Aug 2024 12:04:56 +0000 (+0200) Subject: Harden ft_split, provide ft_free_split X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=fa05d58ec52dd468509baecb6e2a5a0991beac7f;p=Libft.git Harden ft_split, provide ft_free_split --- diff --git a/ft_str/ft_split.c b/ft_str/ft_split.c index 641ca25..c9994d4 100644 --- a/ft_str/ft_split.c +++ b/ft_str/ft_split.c @@ -6,14 +6,14 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 -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); diff --git a/inc/ft_str.h b/inc/ft_str.h index b632bf1..56d743b 100644 --- a/inc/ft_str.h +++ b/inc/ft_str.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 *));