libft
Loading...
Searching...
No Matches
ft_split.c
Go to the documentation of this file.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* ft_split.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: tspoof <tspoof@student.hive.fi> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2022/11/05 15:50:56 by tspoof #+# #+# */
9/* Updated: 2022/11/30 17:07:36 by tspoof ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include "libft.h"
14
15static int ft_free_all(char **arr)
16{
17 while (*arr)
18 {
19 free(*arr);
20 arr++;
21 }
22 return (0);
23}
24
25static int ft_split_count(const char *s, char c)
26{
27 int i;
28 int count;
29
30 i = 0;
31 count = 0;
32 while (s[i])
33 {
34 while (s[i] && s[i] == c)
35 i++;
36 while (s[i] && s[i] != c)
37 i++;
38 if (s[i - 1] != c)
39 count++;
40 }
41 return (count);
42}
43
44static int ft_splitter(char const *s, char c, char **arr, int split_count)
45{
46 int i;
47 int i_prev;
48 int arr_i;
49 int size;
50
51 i = 0;
52 i_prev = 0;
53 arr_i = 0;
54 while (arr_i < split_count)
55 {
56 while (s[i] && s[i] == c)
57 i++;
58 i_prev = i;
59 while (s[i] && s[i] != c)
60 i++;
61 size = i - i_prev;
62 arr[arr_i] = (char *)malloc((size + 1) * sizeof(char));
63 if (!arr[arr_i])
64 return (ft_free_all(arr));
65 ft_strlcpy(arr[arr_i], s + i_prev, size + 1);
66 arr_i++;
67 }
68 return (1);
69}
70
71char **ft_split(char const *s, char c)
72{
73 char **arr;
74 int split_count;
75
76 if (!s)
77 return (NULL);
78 split_count = ft_split_count(s, c);
79 arr = (char **)ft_calloc(split_count + 1, sizeof(char *));
80 if (!arr)
81 return (NULL);
82 if (!ft_splitter(s, c, arr, split_count))
83 {
84 free(arr);
85 return (NULL);
86 }
87 return (arr);
88}
char ** ft_split(char const *s, char c)
Splits string to substrings.
Definition ft_split.c:71
size_t ft_strlcpy(char *dst, const char *src, size_t dstsize)
Copies string to destination.
Definition ft_strlcpy.c:15
void * ft_calloc(size_t count, size_t size)
Allocate and zero.
Definition ft_calloc.c:15