Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
yabtaour
GitHub Repository: yabtaour/Minishell-42
Path: blob/main/expanding/ft_expanding.c
1407 views
1
/* ************************************************************************** */
2
/* */
3
/* ::: :::::::: */
4
/* ft_expanding.c :+: :+: :+: */
5
/* +:+ +:+ +:+ */
6
/* By: ssabbaji <[email protected]> +#+ +:+ +#+ */
7
/* +#+#+#+#+#+ +#+ */
8
/* Created: 2022/07/26 18:16:26 by yabtaour #+# #+# */
9
/* Updated: 2022/09/30 14:34:02 by ssabbaji ### ########.fr */
10
/* */
11
/* ************************************************************************** */
12
13
#include "../minishell.h"
14
15
int ft_value_before(t_data *data, int i, char *value)
16
{
17
i = 0;
18
data->flag_s = 0;
19
data->flag_d = 0;
20
while (data->flag_s == 1 || (value[i] && value[i] != '$'))
21
{
22
if (value[i] == '"' && data->flag_s == 0)
23
data->flag_d = ft_change_flag(data->flag_d);
24
if (value[i] == '\'' && data->flag_d == 0)
25
data->flag_s = ft_change_flag(data->flag_s);
26
i++;
27
}
28
return (i);
29
}
30
31
int ft_value_var(int i, char *value)
32
{
33
while (value[i] && !ft_isspace(value[i]) && value[i] != '$'
34
&& value[i] != '\\' && value[i] != '"'
35
&& value[i] != '\'' && value[i] != '='
36
&& value[i] != '+'
37
&& value[i] != '-'
38
&& value[i] != '/'
39
&& value[i] != '%')
40
i++;
41
return (i);
42
}
43
44
void ft_real_expanding(t_data *data, t_lexer *lexer)
45
{
46
int i;
47
char *n_v;
48
char *var;
49
50
i = 0;
51
var = NULL;
52
n_v = ft_substr(lexer->val, 0, ft_len_before(lexer->val));
53
i = ft_value_before(data, i, lexer->val);
54
if (lexer->val[i] && lexer->val[i + 1])
55
var = ft_substr(lexer->val, i + 1, ft_len_var(lexer->val));
56
if (var)
57
{
58
if (ft_check_var_env(data, var))
59
{
60
n_v = ft_strjoin(n_v, ft_get_value(data, var));
61
n_v = ft_get_expand_value(n_v, i, lexer->val);
62
}
63
else
64
n_v = ft_var_isnt(data, lexer->val, n_v);
65
free(lexer->val);
66
lexer->val = ft_change_nd_free(var, n_v);
67
}
68
}
69
70
int ft_has_var(t_data *data, char *value)
71
{
72
int i;
73
74
i = 0;
75
while (value && value[i])
76
{
77
if (value[i] == '"' && data->flag_s == 0)
78
data->flag_d = ft_change_flag(data->flag_d);
79
if (value[i] == '\'' && data->flag_d == 0)
80
data->flag_s = ft_change_flag(data->flag_s);
81
if (data->flag_s == 0 && value[i] == '$'
82
&& value[i + 1]
83
&& value[i + 1] != '"'
84
&& value[i + 1] != '\''
85
&& value[i + 1] != '?'
86
&& value[i + 1] != '+'
87
&& value[i + 1] != '-'
88
&& value[i + 1] != '/'
89
&& value[i + 1] != '%')
90
return (1);
91
i++;
92
}
93
return (0);
94
}
95
96
void ft_expanding(t_data *data)
97
{
98
t_lexer *lexer_clone;
99
100
lexer_clone = data->lst_lexer;
101
while (ft_check_still_dollar(data))
102
{
103
lexer_clone = data->lst_lexer;
104
while (lexer_clone)
105
{
106
if (!ft_strcmp(lexer_clone->val, "<<"))
107
{
108
lexer_clone = lexer_clone->next;
109
if (lexer_clone)
110
lexer_clone = lexer_clone->next;
111
}
112
if (lexer_clone->type == WORD && ft_has_var(data, lexer_clone->val))
113
ft_real_expanding(data, lexer_clone);
114
if (lexer_clone)
115
lexer_clone = lexer_clone->next;
116
}
117
}
118
}
119
120