Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
yabtaour
GitHub Repository: yabtaour/Minishell-42
Path: blob/main/parsing/parsing_utils3.c
1407 views
1
/* ************************************************************************** */
2
/* */
3
/* ::: :::::::: */
4
/* parsing_utils3.c :+: :+: :+: */
5
/* +:+ +:+ +:+ */
6
/* By: ssabbaji <[email protected]> +#+ +:+ +#+ */
7
/* +#+#+#+#+#+ +#+ */
8
/* Created: 2022/07/26 18:17:12 by yabtaour #+# #+# */
9
/* Updated: 2022/09/19 16:29:08 by ssabbaji ### ########.fr */
10
/* */
11
/* ************************************************************************** */
12
13
#include "../minishell.h"
14
15
void ft_handle_herdoc(t_data *data, t_lexer *lexer, int i)
16
{
17
while (lexer)
18
{
19
if (ft_strcmp(lexer->val, "<<") == 0)
20
data->her_doc++;
21
lexer = lexer->next;
22
}
23
if (data->her_doc)
24
{
25
data->eof = malloc(sizeof(char *) * (data->her_doc + 1));
26
if (!data->eof)
27
exit (1);
28
lexer = data->lst_lexer;
29
while (lexer)
30
{
31
if (ft_strcmp(lexer->val, "<<") == 0)
32
{
33
lexer = lexer->next;
34
data->eof[i] = ft_substr(lexer->val, 0, ft_strlen(lexer->val));
35
ft_delete_eof_quotes(data->eof[i++]);
36
}
37
lexer = lexer->next;
38
}
39
data->eof[i] = NULL;
40
}
41
}
42
43
void ft_delete_command(t_data *data)
44
{
45
t_lexer *lexer_clone;
46
47
lexer_clone = data->lst_lexer;
48
while (lexer_clone && lexer_clone->type != PIPE)
49
{
50
if (lexer_clone->next)
51
lexer_clone->next->prev = lexer_clone->prev;
52
if (lexer_clone->prev)
53
lexer_clone->prev->next = lexer_clone->next;
54
data->lst_lexer = lexer_clone->next;
55
free(lexer_clone->val);
56
free(lexer_clone);
57
lexer_clone = data->lst_lexer;
58
}
59
if (lexer_clone)
60
{
61
if (lexer_clone->next)
62
lexer_clone->next->prev = lexer_clone->prev;
63
if (lexer_clone->prev)
64
lexer_clone->prev->next = lexer_clone->next;
65
data->lst_lexer = lexer_clone->next;
66
free(lexer_clone->val);
67
free(lexer_clone);
68
lexer_clone = data->lst_lexer;
69
}
70
}
71
72
char **ft_get_new(t_cmd *cmd)
73
{
74
int i;
75
char **new_cmd;
76
int len;
77
78
i = 1;
79
new_cmd = NULL;
80
while (cmd->cmd && cmd->cmd[i])
81
i++;
82
new_cmd = malloc(sizeof(char *) * i - (cmd->her_doc_num * 2) + 1);
83
if (!new_cmd)
84
exit (1);
85
len = 0;
86
i = -1;
87
while (cmd->cmd && cmd->cmd[++i])
88
{
89
if (!ft_strcmp(cmd->cmd[i], "<<"))
90
i += 1;
91
else
92
{
93
new_cmd[len] = ft_substr(cmd->cmd[i], 0, ft_strlen(cmd->cmd[i]));
94
len++;
95
}
96
new_cmd[len] = NULL;
97
}
98
return (new_cmd);
99
}
100
101
char **ft_fix(char **new, char **cmd)
102
{
103
int i;
104
105
i = 0;
106
while (new && new[i])
107
{
108
cmd[i] = ft_substr(new[i], 0, ft_strlen(new[i]));
109
i++;
110
}
111
cmd[i] = NULL;
112
return (cmd);
113
}
114
115
void ft_delete_herdoc(t_data *data)
116
{
117
t_cmd *cmd_clone;
118
char **new_cmd;
119
int i;
120
121
cmd_clone = data->lst_cmd;
122
while (cmd_clone->next)
123
cmd_clone = cmd_clone->next;
124
if (cmd_clone && cmd_clone->her_doc_num)
125
{
126
new_cmd = ft_get_new(cmd_clone);
127
free_split(cmd_clone->cmd);
128
i = 0;
129
while (new_cmd && new_cmd[i])
130
i++;
131
cmd_clone->cmd = malloc (sizeof(char *) * i + 1);
132
if (!cmd_clone->cmd)
133
exit (1);
134
cmd_clone->cmd = ft_fix(new_cmd, cmd_clone->cmd);
135
free_split(new_cmd);
136
}
137
}
138
139