maxishell
Implementation of a shell for Linux-like systems
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* main.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: rmikhayl <marvin@42.fr> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2024/06/05 13:23:26 by rmikhayl #+# #+# */
9/* Updated: 2024/09/09 13:27:44 by dmdemirk ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include "tokens.h"
14#include "execute.h"
15#include "shell.h"
16#include "pipe.h"
17#include "signals.h"
18
19static int status_handler(int status, \
20 t_loop_data *loop_data, t_token *token_head);
21static void process_ast_and_io(t_ms_data *data, \
22 t_loop_data *loop_data, t_token *tokens_head);
23static void main_loop(t_ms_data *data, t_loop_data *loop_data);
24int main(int argc, char **argv, char **envp);
25
26static int status_handler(int status, \
27 t_loop_data *loop_data, t_token *tokens_head)
28{
29 if (status == WAIT_NEXT_COMMAND)
30 {
31 loop_cleanup(loop_data, tokens_head);
32 return (0);
33 }
34 return (1);
35}
36
37static void process_ast_and_io(t_ms_data *data, \
38 t_loop_data *loop_data, t_token *tokens_head)
39{
40 int status;
41
42 status = execute_ast(loop_data->tree, data);
43 if (status_handler(status, loop_data, tokens_head))
44 {
45 handle_io_fd(data);
46 loop_cleanup(loop_data, tokens_head);
47 }
48}
49
50static void main_loop(t_ms_data *data, t_loop_data *loop_data)
51{
52 t_token *tokens_start;
53
54 while (1)
55 {
57 loop_data->input = readline("🌴 maxishell> ");
59 if (!loop_data->input || !ft_strncmp(loop_data->input, "exit", 4))
60 {
61 write(STDOUT_FILENO, "exit\n", 5);
62 break ;
63 }
64 make_history(loop_data->input);
65 loop_data->trimmed_input = trim_input(loop_data->input);
66 if (input_error_checks(loop_data))
67 continue ;
68 loop_data->tokens = tokenise(loop_data->trimmed_input);
69 tokens_start = loop_data->tokens;
70 loop_data->tree = parse_tokens(&loop_data->tokens, data);
71 process_ast_and_io(data, loop_data, tokens_start);
72 }
74}
75
76int main(int argc, char **argv, char **envp)
77{
78 t_ms_data data;
79 t_loop_data loop_data;
80
82 init_ms_data(&data, argv, envp);
83 initialise(argc, argv);
84 main_loop(&data, &loop_data);
85 free_ms_data(&data);
87 return (0);
88}
int execute_ast(t_ast *node, t_ms_data *data)
execute Abstract Syntax Tree
Definition execute.c:38
void handle_io_fd(t_ms_data *data)
close temporary input/output file descriptors and reset them to -1
Definition utils_0.c:39
int ft_strncmp(const char *s1, const char *s2, size_t n)
Definition ft_strncmp.c:24
static int status_handler(int status, t_loop_data *loop_data, t_token *token_head)
Definition main.c:26
int main(int argc, char **argv, char **envp)
Definition main.c:76
static void main_loop(t_ms_data *data, t_loop_data *loop_data)
Definition main.c:50
static void process_ast_and_io(t_ms_data *data, t_loop_data *loop_data, t_token *tokens_head)
Definition main.c:37
#define WAIT_NEXT_COMMAND
Definition pipe.h:19
void set_signals_interactive(void)
Definition signals.c:51
void set_signals_noninteractive(void)
Definition signals.c:63
char * trimmed_input
Definition tokens.h:61
t_token * tokens
Definition tokens.h:62
char * input
Definition tokens.h:60
t_ast * tree
Definition tokens.h:63
void loop_cleanup(t_loop_data *loop_data, t_token *tokens_head)
Definition clean.c:67
t_ast * parse_tokens(t_token **tokens, t_ms_data *data)
Definition AST_utils.c:23
void initialise(int argc, char **argv)
Definition initialise.c:36
void print_maxishell(void)
Definition prompt.c:56
t_token * tokenise(char *str)
Definition tokeniser.c:22
int input_error_checks(t_loop_data *loop_data)
void make_history(char *line)
Definition aux.c:15
void init_ms_data(t_ms_data *data, char **argv, char **envp)
Definition initialise.c:20
char * trim_input(char *str)
void clear_history_file(void)
Definition exit.c:28
void free_ms_data(t_ms_data *data)
Definition clean.c:51