Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
yabtaour
GitHub Repository: yabtaour/Minishell-42
Path: blob/main/parsing/ft_new_split.c
1407 views
1
/* ************************************************************************** */
2
/* */
3
/* ::: :::::::: */
4
/* ft_new_split.c :+: :+: :+: */
5
/* +:+ +:+ +:+ */
6
/* By: ssabbaji <[email protected]> +#+ +:+ +#+ */
7
/* +#+#+#+#+#+ +#+ */
8
/* Created: 2022/07/26 18:17:06 by yabtaour #+# #+# */
9
/* Updated: 2022/09/15 18:09:19 by ssabbaji ### ########.fr */
10
/* */
11
/* ************************************************************************** */
12
13
#include "../minishell.h"
14
15
size_t word_count(char *s, char c)
16
{
17
int i;
18
int count;
19
int flag_d;
20
int flag_s;
21
22
flag_d = 0;
23
flag_s = 0;
24
i = 0;
25
count = 0;
26
while (s[i])
27
{
28
if (s[i] == '"' && flag_s == 0)
29
flag_d = ft_change_flag(flag_d);
30
if (s[i] == '\'' && flag_d == 0)
31
flag_s = ft_change_flag(flag_s);
32
if (flag_d == 0 && flag_s == 0 && (s[i] != c
33
&& (!s[i + 1] || s[i + 1] == c)))
34
count++;
35
i++;
36
}
37
return (count);
38
}
39
40
char **ft_allocation(char *s, char c)
41
{
42
char **ptr;
43
44
ptr = NULL;
45
if (!s)
46
return (NULL);
47
ptr = ft_calloc((word_count(s, c) + 1), sizeof(char *));
48
return (ptr);
49
}
50
51
void ft_initialize_split(t_split *split)
52
{
53
split->d = 0;
54
split->i = 0;
55
split->j = 6;
56
split->s = 0;
57
split->ptr = NULL;
58
}
59
60
void ft_flag(char c, t_split *split, int flag)
61
{
62
if (c == '"' && split->s == 0)
63
{
64
split->j++;
65
split->d = ft_change_flag(split->d);
66
return ;
67
}
68
if (c == '\'' && split->d == 0)
69
{
70
split->j++;
71
split->s = ft_change_flag(split->s);
72
return ;
73
}
74
if (flag)
75
split->j++;
76
}
77
78
char **ft_new_split(char *s, char c)
79
{
80
t_split split;
81
82
ft_initialize_split(&split);
83
split.ptr = ft_allocation(s, c);
84
while (*s)
85
{
86
while (*s && *s == c)
87
s++;
88
split.j = 0;
89
ft_flag(*s, &split, 0);
90
while ((s[split.j] && (split.d == 1 || split.s == 1))
91
|| (s[split.j] != '\0' && s[split.j] != c))
92
ft_flag(s[split.j], &split, 1);
93
if (split.j)
94
{
95
split.ptr[split.i] = ft_substr(s, 0, split.j);
96
if (!split.ptr[split.i])
97
return (ft_free_tab(split.ptr, split.i));
98
split.i++;
99
}
100
s = s + split.j;
101
}
102
return (split.ptr);
103
}
104
105