diff --git a/42sh/Makefile b/42sh/Makefile index 64335c15..e647c32f 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -191,7 +191,6 @@ lexer/lexer_paren.c\ lexer/lexer_quote.c\ lexer/lexer_sep.c\ lexer/lexer_word.c\ -lexer/stack_to_prompt.c\ lexer/token_append.c\ lexer/token_cmp_type.c\ lexer/token_free.c\ @@ -219,7 +218,6 @@ main/data_exit.c\ main/data_init.c\ main/data_singleton.c\ main/ft_putast.c\ -main/ft_putast2.c\ main/main.c\ main/shell_exit.c\ main/shell_get_avdata.c\ @@ -235,12 +233,12 @@ parser/build_tree.c\ parser/error_syntax.c\ parser/eval_sym.c\ parser/ft_parse.c\ +parser/parser_init.c\ parser/pop_stack.c\ parser/produce_sym.c\ parser/push_stack.c\ parser/read_stack.c\ -parser/tree_wrapper.c\ -parser/parser_init.c +parser/tree_wrapper.c SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) diff --git a/42sh/includes/ft_readline.h b/42sh/includes/ft_readline.h index 9c6f2810..92c78218 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/02/21 14:27:57 by jhalford ### ########.fr */ +/* Updated: 2017/02/21 19:51:19 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -178,7 +178,7 @@ void ft_c(void); void ft_x(void); void ft_v(void); void ft_read_it(int input, size_t *pos, char **str); -char *readline(int fd, char *prompt); +int readline(int fd, int prompt, char **input); int ft_completion(int ret); struct termios *ft_save_termios(int save); diff --git a/42sh/includes/minishell.h b/42sh/includes/minishell.h index 1b77b4c1..23c31ae2 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/02/21 14:28:48 by jhalford ### ########.fr */ +/* Updated: 2017/02/21 18:51:18 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/includes/parser.h b/42sh/includes/parser.h index 7708a4d1..4960d21f 100644 --- a/42sh/includes/parser.h +++ b/42sh/includes/parser.h @@ -6,7 +6,6 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/01 12:15:54 by jhalford #+# #+# */ -/* Updated: 2017/02/21 20:28:27 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/exec_redir.c b/42sh/src/exec/exec_redir.c index 6be7340c..c5816600 100644 --- a/42sh/src/exec/exec_redir.c +++ b/42sh/src/exec/exec_redir.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 17:27:51 by jhalford #+# #+# */ -/* Updated: 2017/02/20 22:00:03 by jhalford ### ########.fr */ +/* Updated: 2017/02/21 20:14:41 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/launch_process.c b/42sh/src/exec/launch_process.c index 204a76bb..098c44c4 100644 --- a/42sh/src/exec/launch_process.c +++ b/42sh/src/exec/launch_process.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/13 14:20:45 by jhalford #+# #+# */ -/* Updated: 2017/02/20 21:03:48 by ariard ### ########.fr */ +/* Updated: 2017/02/21 20:09:54 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/job-control/builtin_fg.c b/42sh/src/job-control/builtin_fg.c index 373ba8a9..50d9cb69 100644 --- a/42sh/src/job-control/builtin_fg.c +++ b/42sh/src/job-control/builtin_fg.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/08 14:30:07 by jhalford #+# #+# */ -/* Updated: 2017/01/31 15:05:31 by jhalford ### ########.fr */ +/* Updated: 2017/02/21 20:09:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/lexer/stack_to_prompt.c b/42sh/src/lexer/stack_to_prompt.c deleted file mode 100644 index 77defb31..00000000 --- a/42sh/src/lexer/stack_to_prompt.c +++ /dev/null @@ -1,38 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* stack_to_prompt.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/09 21:25:26 by jhalford #+# #+# */ -/* Updated: 2017/02/20 22:13:54 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "lexer.h" - -char *stack_to_prompt(t_list *stack) -{ - t_flag top; - - if (!stack) - return (NULL); - top = *(int*)stack->content; - if (top == BACKSLASH) - return ("> "); - else if (top == QUOTE) - return ("quote> "); - else if (top == DQUOTE) - return ("dquote> "); - else if (top == BQUOTE) - return ("bquote> "); - else if (top == DQUOTE_BQUOTE) - return ("dquote bquote> "); - else if (top == PAREN) - return ("subsh> "); - else if (top == DLESS) - return ("heredoc> "); - else - return ("error> "); -} diff --git a/42sh/src/line-editing/readline.c b/42sh/src/line-editing/readline.c index a90789c9..383a4001 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/02/21 14:20:16 by jhalford ### ########.fr */ +/* Updated: 2017/02/21 20:04:31 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -76,7 +76,7 @@ void ft_init_termios(void) tcsetattr(0, TCSANOW, &term); } -void readline_init(char *prompt) +void readline_init(int prompt) { static int beg = 0; @@ -92,24 +92,23 @@ void readline_init(char *prompt) ft_strdel(&STR); data_singleton()->line.list_cur = data_singleton()->line.list_beg; POS = 0; - prompt ? ft_putstr(prompt) : ft_prompt(); + prompt ? ft_putstr("> ") : ft_prompt(); } -char *readline(int fd, char *prompt) +int readline(int fd, int prompt, char **input) { - char *input; - - if (fd != STDIN) + if (!SH_IS_INTERACTIVE(data_singleton()->opts)) { - get_next_line(fd, &input); - return (input); + if (get_next_line(fd, input) == 0) + return (1); + return (0); } readline_init(prompt); - input = ft_read_stdin(); + *input = ft_read_stdin(); ft_putchar('\n'); if (!prompt) - input = ft_history_parsing(); + *input = ft_history_parsing(); if (tcsetattr(0, TCSANOW, ft_save_termios(0)) == -1) - return (NULL); - return (input); + return (-1); + return (0); } diff --git a/42sh/src/main/ft_putast.c b/42sh/src/main/ft_putast.c index cd109ab4..43f53e0a 100644 --- a/42sh/src/main/ft_putast.c +++ b/42sh/src/main/ft_putast.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/14 18:18:04 by jhalford #+# #+# */ -/* Updated: 2017/02/20 22:19:40 by jhalford ### ########.fr */ +/* Updated: 2017/02/21 19:20:20 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,10 +15,6 @@ char *ft_putast(void *nodein) { t_astnode *node; - struct s_tmp{ - char str[5]; - t_type type; - }; node = nodein; if (node->type == TK_THEN) return ("THEN"); diff --git a/42sh/src/main/ft_putast2.c b/42sh/src/main/ft_putast2.c deleted file mode 100644 index d1bcb89b..00000000 --- a/42sh/src/main/ft_putast2.c +++ /dev/null @@ -1,59 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* tree_type.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 18:18:04 by jhalford #+# #+# */ -/* Updated: 2017/02/20 22:08:42 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -void ft_putast2(void *nodein) -{ - t_astnode *node; - - node = nodein; - if (node->type == TK_SEMI) - ft_putendl_fd("SEMI", 2); - else if (node->type == TK_PIPE) - ft_putendl_fd("PIPE", 2); - else if (node->type == TK_COMMAND) - { - ft_putstr_fd("COMMAND: ", 2); - ft_sstrprint_fd(2, node->data.sstr, ','); - ft_putchar_fd('\n', 2); - } - else if (TK_REDIR(node->type)) - { - ft_putnbr_fd(node->data.redir.n, 2); - if (node->type == TK_GREATAND || node->type == TK_LESSAND) - { - if (node->type == TK_GREATAND) - ft_putstr_fd(">&:", 2); - else - ft_putstr_fd("<&:", 2); - ft_putnbr_fd(node->data.redir.word.fd, 2); - if (node->data.redir.close) - ft_putstr_fd(" (closed)", 2); - } - else - { - if (node->type == TK_GREAT) - ft_putendl_fd(">:", 2); - else if (node->type == TK_LESS) - ft_putstr_fd("<:", 2); - else if (node->type == TK_DGREAT) - ft_putstr_fd(">>:", 2); - else if (node->type == TK_DLESS) - ft_putstr_fd("<<:", 2); - ft_putstr_fd(node->data.redir.word.word, 2); - } - ft_putchar_fd('\n', 2); - } - else - ft_putendl_fd("OTHER", 2); -} diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index 13178f42..2568d77e 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/02/21 18:51:41 by ariard ### ########.fr */ +/* Updated: 2017/02/21 20:31:43 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,16 +20,24 @@ int handle_instruction(int fd) t_parser parser; t_btree *ast; char *str; + int ret; lexer_init(&lexer); parser_init(&parser); token = NULL; ast = NULL; + /* str = NULL; */ + DG("START: state=%i", parser.state); while (1) { - str = readline(fd, stack_to_prompt(lexer.stack)); - if (parser.state == UNDEFINED && !str) - return (error_EOF()); + if ((ret = readline(fd, get_lexer_stack(lexer), &str))) + { + DG("ret=%i, str=%s, state=%i", ret, str, parser.state); + if (ret == -1) + return (-1); + return (parser.state == UNDEFINED ? error_EOF() : 1); + } + DG("ret=%i, str=%s", ret, str); ft_strappend(&lexer.str, str); if (get_lexer_stack(lexer) == BACKSLASH) pop(&lexer.stack); @@ -40,33 +48,48 @@ int handle_instruction(int fd) return (1); //token_print(token); if (get_lexer_stack(lexer)) - continue; + continue ; if (ft_parse(&ast, &token, &parser)) - continue; + continue ; + DG("AFTER PARSING: state=%i", parser.state); if (parser.state == SUCCESS) - break; - if (parser.state == ERROR) + break ; + else if (parser.state == ERROR) return (error_syntax(&token)); } + DG("succesful parsing:"); btree_print(STDBUG, ast, &ft_putast); -// if (ft_exec(&ast)) -// return (1); + /* if (ft_exec(&ast)) */ + /* return (1); */ ft_add_str_in_history(lexer.str); - return (1); + return (0); } int get_input_fd() { t_data *data; + char *file; + int fds[2]; + int fd; data = data_singleton(); + fd = STDIN; if (SH_IS_INTERACTIVE(data->opts)) - return (STDIN); - /* else if (data->opts & SHELL_OPTS_LC) */ - /* { */ - /* } */ + return (fd); + else if (data->opts & SH_OPTS_LC) + { + pipe(fds); + fd = fds[PIPE_READ]; + file = shell_get_avdata(); + write(fds[PIPE_WRITE], file, ft_strlen(file)); + close(fds[PIPE_WRITE]); + fcntl(fd, F_SETFD, FD_CLOEXEC); + return (fd); + } + else if ((file = shell_get_avdata())) + return (open(file, O_RDONLY)); else - return (open(shell_get_avdata(), O_RDONLY)); + return (STDIN); } int main(int ac, char **av) @@ -75,13 +98,15 @@ int main(int ac, char **av) setlocale(LC_ALL, ""); shell_init(ac, av); - // DG("{inv}{bol}{gre}start of shell{eoc} JOBC is %s", SH_HAS_JOBC(data->opts)?"ON":"OFF"); + DG("{inv}{bol}{gre}start of shell{eoc} JOBC is %s", + SH_HAS_JOBC(data_singleton()->opts)?"ON":"OFF"); fd = get_input_fd(); - while (handle_instruction(fd)) + while (handle_instruction(fd) == 0) { // lexer_clean; // parser_clean; ; } + shell_exit(); return (0); } diff --git a/42sh/src/main/shell_exit.c b/42sh/src/main/shell_exit.c index e1f7e052..30d4ab43 100644 --- a/42sh/src/main/shell_exit.c +++ b/42sh/src/main/shell_exit.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 17:37:04 by jhalford #+# #+# */ -/* Updated: 2017/02/20 21:04:01 by ariard ### ########.fr */ +/* Updated: 2017/02/21 20:14:43 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,9 +14,13 @@ void shell_exit(void) { -// DG("shell_exit()"); + t_data *data; + + /* DG("shell_exit()"); */ + data = data_singleton(); data_exit(); - if (SH_HAS_JOBC(data_singleton()->opts)) + if (SH_HAS_JOBC(data->opts)) job_kill_all(); - tcsetattr(STDIN, TCSANOW, &data_singleton()->jobc.shell_tmodes); + if (SH_IS_INTERACTIVE(data->opts)) + tcsetattr(STDIN, TCSANOW, &data_singleton()->jobc.shell_tmodes); } diff --git a/42sh/src/main/shell_init.c b/42sh/src/main/shell_init.c index 26c73eb6..4e64df18 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/02/20 21:00:32 by ariard ### ########.fr */ +/* Updated: 2017/02/21 20:14:44 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ void shell_init(int ac, char **av) data = data_singleton(); data->argc = ac; data->argv = ft_sstrdup(av); - atexit(&shell_exit); + /* atexit(&shell_exit); */ shell_get_opts(ac, av); if (SH_IS_INTERACTIVE(data->opts)) { diff --git a/42sh/src/parser/error_syntax.c b/42sh/src/parser/error_syntax.c index 7bee58f9..ab5655ca 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/02/21 18:13:47 by ariard ### ########.fr */ +/* Updated: 2017/02/21 19:27:59 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/ft_parse.c b/42sh/src/parser/ft_parse.c index 8cc4e169..1818c48c 100644 --- a/42sh/src/parser/ft_parse.c +++ b/42sh/src/parser/ft_parse.c @@ -6,7 +6,6 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/30 17:14:58 by jhalford #+# #+# */ -/* Updated: 2017/02/21 18:52:33 by ariard ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,25 +29,27 @@ int ft_parse(t_btree **ast, t_list **token, t_parser *parser) { while (*token) { - produce_sym(*parser->stack, parser->new_sym, token); + produce_sym(*parser->stack, parser->new_sym, token); DG("new sym %s", read_state(*parser->new_sym)); if (eval_sym(*parser->stack, *parser->new_sym)) parser->state = ERROR; else - { + { aggregate_sym(&parser->stack, parser->new_sym, &parser->state); push_stack(++parser->stack, *parser->new_sym); } - ft_putstr("\n"); if (*parser->stack == PROGRAM) parser->state = SUCCESS; + else + parser->state = UNDEFINED; build_tree(ast, token); btree_print(STDBUG, *ast, &ft_putast); - if ((end_instruction(*parser->stack) && !(*token)->next) - || *parser->stack == PROGRAM) + if ((end_instruction(*parser->stack) && !(*token)->next)) + /* || *parser->stack == PROGRAM) */ insert_linebreak(token); else ft_lst_delif(token, (*token)->content, &ft_addrcmp, &token_free); } + ft_read_stack(parser->stack); return (0); } diff --git a/42sh/src/parser/parser_init.c b/42sh/src/parser/parser_init.c index 2869bea3..49998c26 100644 --- a/42sh/src/parser/parser_init.c +++ b/42sh/src/parser/parser_init.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/21 16:14:04 by ariard #+# #+# */ -/* Updated: 2017/02/21 16:38:13 by ariard ### ########.fr */ +/* Updated: 2017/02/21 20:01:40 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ void parser_init(t_parser *parser) { - parser->state = UNDEFINED; + parser->state = SUCCESS; parser->new_sym = ft_memalloc(sizeof(t_sym)); parser->stack = ft_memalloc(sizeof(t_sym) * 1000); push_stack(parser->stack, LINEBREAK);