diff --git a/42sh/includes/ft_readline.h b/42sh/includes/ft_readline.h index ae9f9a38..15bc59a5 100644 --- a/42sh/includes/ft_readline.h +++ b/42sh/includes/ft_readline.h @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/23 10:35:44 by gwojda #+# #+# */ -/* Updated: 2017/03/16 13:55:48 by jhalford ### ########.fr */ +/* Updated: 2017/03/16 15:13:25 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -74,6 +74,7 @@ typedef struct s_list_history typedef struct s_line { char *input; + int fd; char *copy_tmp; size_t pos; int prompt_size; diff --git a/42sh/includes/minishell.h b/42sh/includes/minishell.h index c1d8fa3f..011445df 100644 --- a/42sh/includes/minishell.h +++ b/42sh/includes/minishell.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/10 13:07:44 by jhalford #+# #+# */ -/* Updated: 2017/03/16 15:04:04 by jhalford ### ########.fr */ +/* Updated: 2017/03/16 15:41:33 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -35,6 +35,7 @@ struct s_data { t_flag opts; + int fd; char **env; char **local_var; int argc; diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index 29755d63..bb370204 100644 --- a/42sh/includes/parser.h +++ b/42sh/includes/parser.h @@ -76,7 +76,7 @@ int pop_stack(t_list **stack, t_sym erase_sym); int pop_heredoc(t_list **lst); int error_syntax(t_list **token, t_parser *parser, t_btree **ast); -int error_eof(t_list **token, t_parser *parser, t_btree **ast); +int error_eof(void); int ft_read_stack(t_sym *stack); char *read_state(t_sym current); diff --git a/42sh/src/line-editing/init_line.c b/42sh/src/line-editing/init_line.c index 489d3286..3631a3fc 100644 --- a/42sh/src/line-editing/init_line.c +++ b/42sh/src/line-editing/init_line.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/07 17:34:44 by gwojda #+# #+# */ -/* Updated: 2017/03/16 14:58:45 by jhalford ### ########.fr */ +/* Updated: 2017/03/16 15:32:03 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,5 +41,5 @@ void readline_init(int has_prompt) data_singleton()->line.list_cur = data_singleton()->line.list_beg; POS = 0; has_prompt ? ft_prompt() : ft_putstr("> "); - data_singleton()->line.is_prompt = prompt ? 0 : 1; + data_singleton()->line.is_prompt = has_prompt ? 1 : 0; } diff --git a/42sh/src/line-editing/readline.c b/42sh/src/line-editing/readline.c index f2227e43..68aaef15 100644 --- a/42sh/src/line-editing/readline.c +++ b/42sh/src/line-editing/readline.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/15 14:19:48 by gwojda #+# #+# */ -/* Updated: 2017/03/16 14:58:47 by jhalford ### ########.fr */ +/* Updated: 2017/03/16 15:22:11 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/main/data_singleton.c b/42sh/src/main/data_singleton.c index b43daac3..4dc9731c 100644 --- a/42sh/src/main/data_singleton.c +++ b/42sh/src/main/data_singleton.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/10 11:36:39 by jhalford #+# #+# */ -/* Updated: 2017/03/09 15:22:54 by jhalford ### ########.fr */ +/* Updated: 2017/03/16 15:12:53 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 837914be..64f83380 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,46 +6,46 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/03/16 15:02:12 by jhalford ### ########.fr */ +/* Updated: 2017/03/16 15:45:57 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -static int do_lexer_routine(t_list **token, t_lexer *lexer) +static int do_lexer_routine(t_list **token, t_lexer *lexer, t_parser *parser, char *str) { t_list *ltoken; - if (lexer->state == HEREDOC) + if (lexer->state == HEREDOC || parser->state == UNDEFINED) { ft_strappend(&lexer->str, (char[]){'\n', 0}); lexer->pos++; } ft_strappend(&lexer->str, str); - if (get_lexer_stack(lexer) == BACKSLASH) + if (get_lexer_stack(*lexer) == BACKSLASH) pop(&lexer->stack); ltoken = ft_lstlast(*token); if (lexer_lex(token ? <oken : token, lexer) < 1) exit(1); - if (get_lexer_stack(lexer) > 2) + if (get_lexer_stack(*lexer) > 2) return (1); lexer->state = DEFAULT; return (0); } -static int do_parser_routine(t_list **token, t_lexer *lexer, t_parser *parser) +static int do_parser_routine(t_list **token, t_btree **ast, t_lexer *lexer, t_parser *parser) { if (get_reserved_words(token)) return (1); token_print(*token); if (insert_newline(token)) return (1); - ft_parse(ast, token, &parser); + ft_parse(ast, token, parser); if ((lexer->state = data_singleton()->heredoc_queue ? HEREDOC : DEFAULT)) return (0); - if (parse->state == ERROR) + if (parser->state == ERROR) { - error_syntax(token, &parser, ast); + error_syntax(token, parser, ast); return (1); } else if (parser->state == SUCCESS) @@ -53,103 +53,68 @@ static int do_parser_routine(t_list **token, t_lexer *lexer, t_parser *parser) return (0); } -static int do_readline_routine(t_list **token, t_lexer *lexer, t_parser *parser) +static int do_readline_routine(t_lexer *lexer, t_parser *parser, char **str) { int ret; - int prompt; - char *str; + int has_prompt; - has_prompt = !(get_lexer_stack(lexer) || parser->state == UNDEFINED || lexer->state == HEREDOC); - ret = readline(has_prompt, &str); - { - if (ret == -1) - return (-1); - return (parser.state == UNDEFINED ? error_eof(token, - &parser, ast) : 1); - } + has_prompt = !(get_lexer_stack(*lexer) || parser->state == UNDEFINED || lexer->state == HEREDOC); + ret = readline(has_prompt, str); + if (ret == -1) + exit(1); + if (ret == 1 && parser->state == UNDEFINED) + error_eof(); + return (ret); } -static int handle_instruction( t_list **token, - t_btree **ast, - t_lexer *lexer, - t_parser *parser) +static int handle_instruction(t_lexer *lexer, t_parser *parser) { + t_list *token; + t_btree *ast; + int ret; + char *str; + token = NULL; + ast = NULL; + str = NULL; while (1) { - if (do_readline_routine(lexer, parser) > 0) - if (do_lexer_routine(token, lexer) > 0) + if ((ret = do_readline_routine(lexer, parser, &str)) > 0) + return (ret); + if (do_lexer_routine(&token, lexer, parser, str) > 0) continue ; - if (do_parser_routine(token, lexer, parser) > 0) + if (do_parser_routine(&token, &ast, lexer, parser) > 0) break ; } /* btree_print(STDBUG, ast, &ft_putast); */ - if (parser->state == SUCCESS && ft_exec(ast) < 0) + if (parser->state == SUCCESS && ft_exec(&ast) < 0) exit(1); if (SH_IS_INTERACTIVE(data_singleton()->opts) && *lexer->str) ft_add_str_in_history(lexer->str); return (0); } -int get_input_fd(char **av) -{ - t_data *data; - char *file; - int fds[2]; - int fd; - struct stat buf; - - data = data_singleton(); - if (SH_IS_INTERACTIVE(data->opts)) - return (STDIN); - else if (data->opts & SH_OPTS_LC) - { - pipe(fds); - dup2_close(fds[PIPE_READ], 10); - fd = 10; - file = *cliopts_getdata(av); - write(fds[PIPE_WRITE], file, ft_strlen(file)); - close(fds[PIPE_WRITE]); - fcntl(fd, F_SETFD, FD_CLOEXEC); - return (fd); - } - else if ((file = *cliopts_getdata(av)) && !stat(file, &buf)) - { - fd = -1; - if (S_ISDIR(buf.st_mode)) - ft_printf("{red}%s: %s: is a directory\n{eoc}", av[0], file); - else if ((fd = open(file, O_RDONLY | O_CLOEXEC)) < 0) - ft_printf("{red}%s: %s: No such file or directory\n{eoc}", av[0], file); - if (fd > 0 && !dup2_close(fd, 10) && (fd = 10)) - return (fd); - } - return (STDIN); -} int main(int ac, char **av) { - int fd; - t_list *token; + int ret; t_lexer lexer; t_parser parser; - t_btree *ast; g_argv = av; setlocale(LC_ALL, ""); DG("{inv}{bol}{gre}start of shell{eoc}"); if (shell_init(ac, av)) return (1); - if ((fd = get_input_fd(av)) < 0) - return (1); - dup2_close(fd, STDIN); lexer_init(&lexer); parser_init(&parser); - token = NULL; - ast = NULL; - DG("JOBC is %s, fd=[%i]", SH_HAS_JOBC(data_singleton()->opts)?"ON":"OFF", fd); - while (handle_instruction(&token, &ast, lexer, parser) == 0) + DG("JOBC is %s", SH_HAS_JOBC(data_singleton()->opts)?"ON":"OFF"); + while (1) { - instruction_free(&token, &ast, &lexer, &parser); + ret = handle_instruction(&lexer, &parser); + /* instruction_free(&token, &ast, &lexer, &parser); */ + if (ret == 1) + break ; } builtin_exit(NULL, NULL, NULL); return (0); diff --git a/42sh/src/main/shell_init.c b/42sh/src/main/shell_init.c index 7d2fce00..ad394679 100644 --- a/42sh/src/main/shell_init.c +++ b/42sh/src/main/shell_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 17:23:59 by jhalford #+# #+# */ -/* Updated: 2017/03/15 13:55:49 by gwojda ### ########.fr */ +/* Updated: 2017/03/16 15:31:31 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,41 @@ static t_cliopts g_opts[] = {0, 0, 0, 0, 0}, }; +int get_input_fd(char **av) +{ + t_data *data; + char *file; + int fds[2]; + int fd; + struct stat buf; + + data = data_singleton(); + if (SH_IS_INTERACTIVE(data->opts)) + return (STDIN); + else if (data->opts & SH_OPTS_LC) + { + pipe(fds); + dup2_close(fds[PIPE_READ], 10); + fd = 10; + file = *cliopts_getdata(av); + write(fds[PIPE_WRITE], file, ft_strlen(file)); + close(fds[PIPE_WRITE]); + fcntl(fd, F_SETFD, FD_CLOEXEC); + return (fd); + } + else if ((file = *cliopts_getdata(av)) && !stat(file, &buf)) + { + fd = -1; + if (S_ISDIR(buf.st_mode)) + ft_printf("{red}%s: %s: is a directory\n{eoc}", av[0], file); + else if ((fd = open(file, O_RDONLY | O_CLOEXEC)) < 0) + ft_printf("{red}%s: %s: No such file or directory\n{eoc}", av[0], file); + if (fd > 0 && !dup2_close(fd, 10) && (fd = 10)) + return (fd); + } + return (STDIN); +} + static int interactive_settings(void) { int *shell_pgid; @@ -64,7 +99,7 @@ int shell_init(int ac, char **av) return (ft_perror()); if (SH_IS_INTERACTIVE(data->opts)) interactive_settings(); - else - DG("not interactive"); + if ((data->fd = get_input_fd(av)) < 0) + return (1); return (0); } diff --git a/42sh/src/parser/error_syntax.c b/42sh/src/parser/error_syntax.c index b4dc6225..d1d79d72 100644 --- a/42sh/src/parser/error_syntax.c +++ b/42sh/src/parser/error_syntax.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/09 20:15:35 by ariard #+# #+# */ -/* Updated: 2017/03/16 14:12:14 by jhalford ### ########.fr */ +/* Updated: 2017/03/16 15:34:39 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -77,11 +77,8 @@ int error_syntax(t_list **lst, t_parser *parser, return (0); } -int error_eof(t_list **lst, t_parser *parser, t_btree **ast) +int error_eof(void) { - (void)lst; - (void)parser; - (void)ast; ft_putstr_fd("syntax error near unexpected EOF", 2); - return (0); + return (1); }