/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Updated: 2017/03/17 10:51:23 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" static int do_readline_routine(char **stream) { int ret; int has_prompt; t_data *data; data = data_singleton(); has_prompt = !(get_lexer_stack(data->lexer) || data->parser.state == UNDEFINED || data->lexer.state == HEREDOC); ret = readline(has_prompt, stream); if (ret == -1) exit(1); if (ret == 1 && data->parser.state == UNDEFINED) error_eof(); return (ret); } static int handle_instruction(t_list **token, t_btree **ast) { int ret; char *stream; t_data *data; stream = NULL; data = data_singleton(); while (1) { if ((ret = do_readline_routine(&stream)) > 0) return (ret); if (do_lexer_routine(token, stream) > 0) continue ; if (do_parser_routine(token, ast) > 0) break ; } btree_print(STDBUG, *ast, &ft_putast); if (data->parser.state == SUCCESS && ft_exec(ast) < 0) exit(1); else if (data->parser.state != SUCCESS) set_exitstatus(1, 1); if (SH_IS_INTERACTIVE(data->opts) && data->lexer.str) ft_add_str_in_history(data->lexer.str); return (0); } int main(int ac, char **av) { int ret; t_data *data; t_list *token; t_btree *ast; g_argv = av; setlocale(LC_ALL, ""); DG("{inv}{bol}{gre}start of shell{eoc}"); if (shell_init(ac, av)) return (1); DG("JOBC is %s", SH_HAS_JOBC(data_singleton()->opts)?"ON":"OFF"); token = NULL; ast = NULL; data = data_singleton(); while (1) { ret = handle_instruction(&token, &ast); lexer_destroy(&data->lexer); parser_destroy(&data->parser); ft_lstdel(&token, &token_free); btree_del(&ast, &ast_free); if (ret == 1) break ; } builtin_exit(NULL, NULL, NULL); return (0); }