42_minishell/libft/ft_split.c
2024-04-23 16:46:55 +02:00

98 lines
2 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_split.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/10/03 11:47:18 by mcolonna #+# #+# */
/* Updated: 2023/10/12 13:24:04 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
#include <stdlib.h>
#include "libft.h"
static int count_until(char const *s, char const c)
{
int i;
i = 0;
while (s[i] && s[i] != c)
i++;
return (i);
}
static int count_words(char const *s, char c)
{
int i;
int r;
int in_a_word;
i = 0;
r = 0;
in_a_word = 0;
while (s[i])
{
if (s[i] == c)
{
in_a_word = 0;
}
else if (!in_a_word)
{
in_a_word = 1;
r++;
}
i++;
}
return (r);
}
static char **free_array(char ***array, int size)
{
int i;
i = 0;
while (i < size)
{
free((*array)[i]);
(*array)[i] = NULL;
i++;
}
free(*array);
*array = NULL;
return (NULL);
}
static void ignore_sep(char const *s, char c, int *i)
{
while (s[*i] == c)
(*i)++;
}
char **ft_split(char const *s, char c)
{
int size;
char **dest;
int i;
int str_i;
int len_until;
size = count_words(s, c);
dest = malloc((size + 1) * sizeof(char *));
if (!dest)
return (NULL);
i = -1;
str_i = 0;
while (++i < size)
{
ignore_sep(s, c, &str_i);
len_until = count_until(s + str_i, c);
dest[i] = ft_substr(s, str_i, len_until);
if (!dest[i])
return (free_array(&dest, i));
str_i += len_until;
}
dest[i] = NULL;
return (dest);
}