-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathms_pipe_split.c
More file actions
94 lines (86 loc) · 2.61 KB
/
ms_pipe_split.c
File metadata and controls
94 lines (86 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ms_pipe_split.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jinsecho <jinsecho@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/12 17:56:21 by jinsecho #+# #+# */
/* Updated: 2024/12/19 16:02:45 by jinsecho ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
int lst_free(t_cmd *cmd, t_plst **tmp)
{
t_plst *pipe_tmp;
*tmp = cmd->pipe_lst;
while (*tmp)
{
pipe_tmp = *tmp;
*tmp = (*tmp)->next;
free(pipe_tmp->pipe_split);
free(pipe_tmp);
}
return (1);
}
static int line_pipe_split_find(t_cmd *cmd, t_plst **tmp, int *i, int *k)
{
if (cmd->line_split[*i + 1] == NULL)
return (lst_free(cmd, tmp));
(*tmp)->pipe_split[*k] = NULL;
*k = 0;
ms_lstadd_back(&(cmd->pipe_lst), ms_lstnew());
*tmp = (*tmp)->next;
(*tmp)->pipe_split = (char **)malloc(sizeof(char *) * cmd->line_i);
if ((*tmp)->pipe_split == NULL)
exit (EXIT_FAILURE);
(*i)++;
if (ft_strnstr(cmd->line_split[*i], "|", 1) && \
ft_strlen(cmd->line_split[*i]) == 1)
return (lst_free(cmd, tmp));
return (0);
}
void ms_idx_init(t_tmp *idx)
{
idx->i = 0;
idx->k = 0;
}
int line_pipe_split_set(t_cmd *cmd, t_plst **tmp)
{
if (cmd->line_split[0] == NULL || \
(ft_strnstr(cmd->line_split[0], "|", 1) && \
ft_strlen(cmd->line_split[0]) == 1))
return (1);
cmd->pipe_lst = ms_lstnew();
*tmp = cmd->pipe_lst;
(*tmp)->pipe_split = (char **)malloc(sizeof(char *) * (cmd->line_i + 1));
if ((*tmp)->pipe_split == NULL)
exit (EXIT_FAILURE);
return (0);
}
int ms_line_pipe_split(t_cmd *cmd)
{
t_plst *tmp;
t_tmp idx;
ms_idx_init(&idx);
if (line_pipe_split_set(cmd, &tmp))
return (1);
while (idx.i < cmd->line_i)
{
tmp->pipe_split[(idx.k)++] = cmd->line_split[(idx.i)++];
if (cmd->line_split[idx.i] == NULL)
{
tmp->pipe_split[idx.k] = NULL;
break ;
}
if (ft_strnstr(cmd->line_split[idx.i], "|", 1) && \
ft_strlen(cmd->line_split[idx.i]) == 1)
{
cmd->sts.pipe_true = 1;
if (line_pipe_split_find(cmd, &tmp, &idx.i, &idx.k))
return (1);
}
tmp->pipe_split[idx.k] = NULL;
}
return (0);
}