diff options
author | Rudy Bousset <rbousset@z2r5p6.le-101.fr> | 2019-10-29 12:25:57 +0100 |
---|---|---|
committer | Rudy Bousset <rbousset@z2r5p6.le-101.fr> | 2019-10-29 12:25:57 +0100 |
commit | 507661351ca718c8a3d8213a0a80f994825fc881 (patch) | |
tree | eb9192a57e884e5bcf96f79d98cf7659924ce1df /libft/ft_split.c | |
parent | Makefile complete (diff) | |
download | 42-minishell-507661351ca718c8a3d8213a0a80f994825fc881.tar.gz 42-minishell-507661351ca718c8a3d8213a0a80f994825fc881.tar.bz2 42-minishell-507661351ca718c8a3d8213a0a80f994825fc881.tar.xz 42-minishell-507661351ca718c8a3d8213a0a80f994825fc881.tar.zst 42-minishell-507661351ca718c8a3d8213a0a80f994825fc881.zip |
libft included
Diffstat (limited to 'libft/ft_split.c')
-rw-r--r-- | libft/ft_split.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/libft/ft_split.c b/libft/ft_split.c new file mode 100644 index 0000000..7c706cf --- /dev/null +++ b/libft/ft_split.c @@ -0,0 +1,109 @@ +/* ************************************************************************** */ +/* LE - / */ +/* / */ +/* ft_split.c .:: .:/ . .:: */ +/* +:+:+ +: +: +:+:+ */ +/* By: rbousset <marvin@le-101.fr> +:+ +: +: +:+ */ +/* #+# #+ #+ #+# */ +/* Created: 2019/10/12 19:24:20 by rbousset #+# ## ## #+# */ +/* Updated: 2019/10/13 08:37:16 by rbousset ### #+. /#+ ###.fr */ +/* / */ +/* / */ +/* ************************************************************************** */ + +#include "libft.h" +#include <stddef.h> +#include <stdlib.h> +#include <inttypes.h> + +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); +} |