-
Notifications
You must be signed in to change notification settings - Fork 0
/
minishell.c
111 lines (101 loc) · 2.57 KB
/
minishell.c
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* minishell.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lweglarz <lweglarz@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/06/08 12:15:48 by lweglarz #+# #+# */
/* Updated: 2021/09/28 13:00:52 by lweglarz ### ########.fr */
/* */
/* ************************************************************************** */
#include "includes/minishell.h"
void sig_handler(int signum)
{
if (signum == SIGINT)
{
write(1, "\n", 1);
rl_on_new_line();
rl_replace_line("", 0);
rl_redisplay();
}
}
void free_after_line(char *line)
{
struct stat *buf;
char *join;
join = ft_strjoin(TMPDIR, ".heredoc");
buf = malloc(sizeof(struct stat) * 1);
if (stat(join, buf) == 0)
unlink(join);
free(buf);
free(join);
if (line)
{
free(line);
line = NULL;
}
}
void treat_cmd(int nb_cmd, t_pars *exp, t_env_l *env, char *line)
{
t_cmd *cmd;
char *expanded;
expanded = expand_env_value(exp, line, env);
nb_cmd = parse_command(expanded);
cmd = malloc(sizeof(t_cmd) * (nb_cmd + 1));
fill_cmd_array(expanded, cmd, env);
del_quotes(cmd, nb_cmd);
parse_cmd_array(cmd, env, nb_cmd);
free(expanded);
free_cmd(cmd);
free_after_line(line);
}
void init_token(t_env_l *env)
{
char **var_contents;
int i;
int j;
env->token = malloc(sizeof(char **) * (nb_env(env->list) + 1));
var_contents = get_env_content(env->list);
i = 0;
while (var_contents[i])
{
env->token[i] = ft_split(var_contents[i], ' ');
i++;
}
env->token[i] = NULL;
i = 0;
while (var_contents[i])
{
free(var_contents[i]);
i++;
}
free(var_contents);
}
int main(int ac, char **av, char **envp)
{
t_pars exp;
char *line;
t_env_l env;
int nb_cmd;
env.list = init_env(envp, ac, av);
init_token(&env);
nb_cmd = 0;
line = NULL;
while (1)
{
signal(SIGQUIT, SIG_IGN);
signal(SIGINT, sig_handler);
line = readline("Minishell>");
if (line)
add_history(line);
if (line == NULL)
exit_free_env(&env, 0);
nb_cmd = parse_command(line);
if (nb_cmd >= 0)
treat_cmd(nb_cmd, &exp, &env, line);
else
free_after_line(line);
}
return (1);
}