-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathminishell.c
112 lines (101 loc) · 2.66 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
112
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* minishell.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mkabissi <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/05/12 13:48:45 by amaarifa #+# #+# */
/* Updated: 2022/06/15 22:22:54 by mkabissi ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
void free_cmd_list(t_cmd_list *cmd_list)
{
int i;
i = 0;
if (!cmd_list)
return ;
free(cmd_list->source);
free(cmd_list->cmd_line);
if (cmd_list->tokens)
{
while ((cmd_list->tokens)[i])
{
delete_token((cmd_list->tokens) + i);
(cmd_list->tokens)[i] = NULL;
i++;
}
free(cmd_list->tokens);
}
free(cmd_list);
}
t_cmd_list *init_cmd_list(char *s)
{
t_cmd_list *cmd_list;
cmd_list = (t_cmd_list *)malloc(sizeof(t_cmd_list));
if (!cmd_list)
exit(1);
cmd_list->cmd_line = s;
cmd_list->source = ft_strtrim(cmd_list->cmd_line, " ");
cmd_list->tokens = NULL;
cmd_list->env = NULL;
if (!cmd_list->source)
exit(1);
return (cmd_list);
}
void run_cmd(t_env **env_lst, int *keep_reading, char *line)
{
t_cmd_list *cmd_list;
cmd_list = init_cmd_list(line);
cmd_list->exit = 0;
cmd_list->env = env_lst;
parser(cmd_list);
execution(cmd_list, env_lst);
*keep_reading -= cmd_list->exit;
free_cmd_list(cmd_list);
cmd_list = NULL;
}
void prompt(t_env **env_lst)
{
char *line;
int keep_reading;
keep_reading = 1;
while (keep_reading > 0 && g_exit_status >= 0)
{
signal(SIGINT, int_handler);
signal(SIGQUIT, int_handler);
line = readline("minishell$ ");
if (!line)
exit(g_exit_status);
if (line[0])
add_history(line);
if (line[0] == '\0' || !syntax_checker(line))
{
g_exit_status = 0;
free(line);
continue ;
}
add_history(line);
run_cmd(env_lst, &keep_reading, line);
}
}
int main(int ac, char **av, char **env)
{
t_env *env_lst;
struct termios termios_new;
env_lst = set_env(env);
(void)av;
(void)ac;
g_exit_status = 0;
while (1)
{
tcgetattr(0, &termios_new);
termios_new.c_lflag &= ~ECHOCTL;
tcsetattr(0, 0, &termios_new);
prompt(&env_lst);
if (g_exit_status < 0)
g_exit_status = 1;
}
return (0);
}