/* ************************************************************************** */ /* LE - / */ /* / */ /* ft_split.c .:: .:/ . .:: */ /* +:+:+ +: +: +:+:+ */ /* By: rbousset +:+ +: +: +:+ */ /* #+# #+ #+ #+# */ /* Created: 2019/10/12 19:24:20 by rbousset #+# ## ## #+# */ /* Updated: 2019/10/13 08:37:16 by rbousset ### #+. /#+ ###.fr */ /* / */ /* / */ /* ************************************************************************** */ #include "libft.h" #include #include #include static uint8_t ft_check(int c, char sep) { if (c == sep) return (1); return (0); } static size_t ft_strlen_plus(const char *str, char c) { size_t i; size_t count; uint8_t ibool; i = 0; count = 0; ibool = 1; while (str[i]) { while (ft_check(str[i], c) && str[i]) i++; while (!ft_check(str[i], c) && str[i]) { if (ibool == 1) count++; ibool = 0; i++; } ibool = 1; } return (count); } static size_t ft_strlen_again(const char *str, char c) { size_t i; i = 0; while (!ft_check(str[i], c) && str[i]) i++; return (i); } static char *ft_strdup_plus(const char *src, char c) { size_t i; size_t slen; char *nstr; i = 0; slen = ft_strlen_again(src, c) + 1; if (!(nstr = (char*)ft_calloc(slen, sizeof(char)))) return (NULL); while (!ft_check(src[i], c) && src[i]) { nstr[i] = src[i]; i++; } nstr[i] = '\0'; return (nstr); } char **ft_split(const char *s, char c) { size_t i; size_t j; char **best_split; i = 0; j = 0; if (!(best_split = (char **)ft_calloc(ft_strlen_plus(s, c) + 1, sizeof(char *)))) return (NULL); while (s[i]) { while (ft_check(s[i], c) && s[i]) i++; while (!ft_check(s[i], c) && s[i]) { best_split[j] = ft_strdup_plus(&s[i], c); i += ft_strlen_again(&s[i], c); j++; } } best_split[j] = 0; return (best_split); }