From e085451ec45c0551c80989a7d49b0e0deb4b9586 Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 19 Jun 2020 14:38:15 +0200 Subject: Parenthesis working, Added getline loop in main --- libft | 2 +- minishell_test | 2 +- src/debug.c | 6 +- src/eval/op.c | 6 +- src/main.c | 183 +++++++++++++++++++++++++++++++----------------------- src/parse/parse.c | 24 +++++-- 6 files changed, 131 insertions(+), 92 deletions(-) diff --git a/libft b/libft index 6bedda0..13cf7ba 160000 --- a/libft +++ b/libft @@ -1 +1 @@ -Subproject commit 6bedda03a7f4f3c6ea190c506800f3aa1a3ac833 +Subproject commit 13cf7ba8ba259c4c68c32021d4b96f7bf8de0687 diff --git a/minishell_test b/minishell_test index 9ae06d1..b463bfa 160000 --- a/minishell_test +++ b/minishell_test @@ -1 +1 @@ -Subproject commit 9ae06d1ada7828f986b8aa1ab9364ac2f9f0cbd7 +Subproject commit b463bfa34471c1d3e65dfd4e22a99f4c84d7c5c6 diff --git a/src/debug.c b/src/debug.c index b23fe51..c2b416e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -34,9 +34,8 @@ void ast_print(int level, t_ast *ast) ft_lstiter(ast->redirs, token_put); printf(" ]\n"); ast_print(level + 1, ast->parent_ast); - } - if (ast->tag == AST_CMD) + else if (ast->tag == AST_CMD) { print_level(level); printf("cmd: [ "); @@ -45,8 +44,7 @@ void ast_print(int level, t_ast *ast) ft_lstiter(ast->redirs, token_put); printf(" ]"); } - else - { + else if (ast->tag == AST_OP) { /* printf("SEP: %d\n", ast->op.sep); */ print_level(level); /* printf("redirs: ["); */ diff --git a/src/eval/op.c b/src/eval/op.c index e022fc1..1f85bc1 100644 --- a/src/eval/op.c +++ b/src/eval/op.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/17 15:27:22 by charles #+# #+# */ -/* Updated: 2020/06/19 13:34:28 by charles ### ########.fr */ +/* Updated: 2020/06/19 17:32:43 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,13 +60,13 @@ int eval_parent(int fds[2], t_env env, t_path path, t_ast *ast) param.env = env; param.path = path; ast->tag ^= AST_PARENT; - param.ast = ast; + param.ast = ast->parent_ast; return (fork_wrap(fds, ¶m, wrapped_eval)); } int eval(int fds[2], t_env env, t_path path, t_ast *ast) { - if (ast->tag & AST_PARENT) + if (ast->tag == AST_PARENT) return (eval_parent(fds, env, path, ast)); if (ast->tag == AST_OP) return (eval_op(fds, env, path, ast)); diff --git a/src/main.c b/src/main.c index 77f4070..80ed74c 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/06/19 13:37:42 by charles ### ########.fr */ +/* Updated: 2020/06/19 17:46:59 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,22 +42,49 @@ int main(int argc, char **argv, char **envp) if (lex_out == NULL) return (1); - //ft_lstiter(lex_out, token_debug); + /* ft_lstiter(lex_out, token_debug); */ + t_ret *parser_out = parse(lex_out); - t_ret *parser_out = parse(lex_out); - if (parser_out == NULL || parser_out->unexpected != NULL) - return (1); - ast_print(0, parser_out->ast); + /* t_ret *parser_out = parse(lex_out); */ + /* if (parser_out == NULL || parser_out->unexpected != NULL) */ + /* return (1); */ + + /* ast_print(0, parser_out->ast); */ + /* printf("\n"); */ + /* fflush(stdout); */ + /* fflush(stderr); */ /* printf("===cmd_argv===\n"); */ /* ft_lstiter(parser_out->ast->cmd_argv, token_debug); */ /* printf("===redirs===\n"); */ /* ft_lstiter(parser_out->ast->redirs, token_debug); */ - /* int fds[2] = {MS_NO_FD, MS_NO_FD}; */ - /* int eval_out = eval(fds, env, path, parser_out->ast); */ - /* (void)eval_out; */ + int fds[2] = {MS_NO_FD, MS_NO_FD}; + int eval_out = eval(fds, env, path, parser_out->ast); + (void)eval_out; + } + else + { + int ret; + char *line; + + printf("> "); + fflush(stdout); + while ((ret = ft_getline(STDOUT_FILENO, &line)) == FTGL_OK) + { + t_ftlst *lex_out = lexer(line); + if (lex_out == NULL) + return (1); + + t_ret *parser_out = parse(lex_out); + + int fds[2] = {MS_NO_FD, MS_NO_FD}; + int eval_out = eval(fds, env, path, parser_out->ast); + (void)eval_out; + printf("> "); + fflush(stdout); + } } ft_htdestroy(path, free); @@ -73,75 +100,75 @@ int main(int argc, char **argv, char **envp) /* int main(int argc, char **argv, char **envp) */ /* { */ - /* (void)argc; */ - /* (void)argv; */ - /* (void)envp; */ - /* t_path path; */ - /* t_env env; */ - /* char *line; */ - /* int ret; */ - /* env = env_from_array(envp); */ - /* path = path_update(NULL, env_search(env, "PATH")); */ - - /* t_ftlst *args1 = NULL; */ - /* ft_lstpush_back(&args1, ft_lstnew(token_new(TAG_STR, "ls"))); */ - /* ft_lstpush_back(&args1, ft_lstnew(token_new(TAG_STR, "-l"))); */ - - /* t_ftlst *args2 = NULL; */ - /* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "cat"))); */ - /* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "-e"))); */ - /* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "je"))); */ - - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "*.c"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src.c include*.h"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ - /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); */ - - /* t_ftlst *redirs = NULL; */ - /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); */ - /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); */ - /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_APPEND, NULL))); */ - /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo"))); */ - /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); */ - /* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo1"))); */ - - /* t_ast *cmd1 = ast_new(AST_CMD); */ - /* cmd1->cmd_argv = args1; */ - /* cmd1->redirs = NULL; */ - - /* t_ast *cmd2 = ast_new(AST_CMD); */ - /* cmd2->cmd_argv = args2; */ - /* cmd2->redirs = NULL; */ - - /* t_ast *op_ast = ast_new(AST_OP); */ - /* op_ast->op.left = cmd1; */ - /* op_ast->op.right = cmd2; */ - /* op_ast->op.sep = TAG_PIPE; */ - - - /* int fds[2] = {MS_NO_FD, MS_NO_FD}; */ - /* printf("eval %d\n", eval_cmd(fds, env, path, cmd1)); */ - - /* char **as = preprocess(l, env); */ - /* printf("%p\n", as); */ - /* printf("%p\n", *as); */ - /* char **tmp = as; */ - /* while (*as != NULL) */ - /* puts(*as++); */ - /* ft_split_destroy(tmp); */ +/* (void)argc; */ +/* (void)argv; */ +/* (void)envp; */ +/* t_path path; */ +/* t_env env; */ +/* char *line; */ +/* int ret; */ +/* env = env_from_array(envp); */ +/* path = path_update(NULL, env_search(env, "PATH")); */ + +/* t_ftlst *args1 = NULL; */ +/* ft_lstpush_back(&args1, ft_lstnew(token_new(TAG_STR, "ls"))); */ +/* ft_lstpush_back(&args1, ft_lstnew(token_new(TAG_STR, "-l"))); */ + +/* t_ftlst *args2 = NULL; */ +/* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "cat"))); */ +/* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "-e"))); */ +/* ft_lstpush_back(&args2, ft_lstnew(token_new(TAG_STR, "je"))); */ + +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "*.c"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src.c include*.h"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ +/* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); */ + +/* t_ftlst *redirs = NULL; */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_APPEND, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo"))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); */ +/* ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo1"))); */ + +/* t_ast *cmd1 = ast_new(AST_CMD); */ +/* cmd1->cmd_argv = args1; */ +/* cmd1->redirs = NULL; */ + +/* t_ast *cmd2 = ast_new(AST_CMD); */ +/* cmd2->cmd_argv = args2; */ +/* cmd2->redirs = NULL; */ + +/* t_ast *op_ast = ast_new(AST_OP); */ +/* op_ast->op.left = cmd1; */ +/* op_ast->op.right = cmd2; */ +/* op_ast->op.sep = TAG_PIPE; */ + + +/* int fds[2] = {MS_NO_FD, MS_NO_FD}; */ +/* printf("eval %d\n", eval_cmd(fds, env, path, cmd1)); */ + +/* char **as = preprocess(l, env); */ +/* printf("%p\n", as); */ +/* printf("%p\n", *as); */ +/* char **tmp = as; */ +/* while (*as != NULL) */ +/* puts(*as++); */ +/* ft_split_destroy(tmp); */ /* ft_htdestroy(path, free); */ /* ft_vecdestroy(env, free); */ /* return (0); */ diff --git a/src/parse/parse.c b/src/parse/parse.c index 02357da..71eb0e4 100755 --- a/src/parse/parse.c +++ b/src/parse/parse.c @@ -6,7 +6,7 @@ /* By: nahaddac +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/17 18:09:04 by nahaddac #+# #+# */ -/* Updated: 2020/06/19 13:38:23 by charles ### ########.fr */ +/* Updated: 2020/06/19 16:03:42 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,7 +60,12 @@ t_ret *parse_cmd(t_ftlst *input) { push_token(&ast->redirs, input->data); if (tag & TAG_IS_STR && tag & TAG_STICK) + { input = input->next; + tag = ((t_token *)input->data)->tag; + if (!(tag & TAG_IS_STR) || !(tag & TAG_IS_REDIR)) + return ret_wrap_ast(ast, input); + } else if (tag & TAG_IS_REDIR) input = input->next; else @@ -84,7 +89,7 @@ t_ret *parse_op(t_ftlst *input) t_ast *ast; t_ret *left_ret; t_ret *right_ret; - enum e_token_tag sep_tag; + enum e_token_tag tag; left_ret = parse_expr(input); input = left_ret->rest; @@ -92,7 +97,7 @@ t_ret *parse_op(t_ftlst *input) if (input == NULL || ((t_token*)input->data)->tag == TAG_PARENT_CLOSE) return ret_wrap_ast(left_ret->ast, input); - sep_tag = ((t_token*)input->data)->tag; + tag = ((t_token*)input->data)->tag; input = input->next; right_ret = parse_op(input); @@ -100,7 +105,7 @@ t_ret *parse_op(t_ftlst *input) ast = ast_new(AST_OP); ast->op.left = left_ret->ast; ast->op.right = right_ret->ast; - ast->op.sep = sep_tag; + ast->op.sep = tag; return ret_wrap_ast(ast, right_ret->rest); } @@ -108,6 +113,7 @@ t_ret *parse_expr(t_ftlst *input) { t_ret *tmp; enum e_token_tag tag; + tag = ((t_token*)input->data)->tag; if (tag == TAG_PARENT_OPEN) { @@ -117,13 +123,19 @@ t_ret *parse_expr(t_ftlst *input) if (tag != TAG_PARENT_CLOSE) return (NULL); input = input->next; + t_ast *new_ast = ast_new(AST_PARENT); new_ast->parent_ast = tmp->ast; tmp->ast = new_ast; + if (input == NULL) + return tmp; + + tag = ((t_token*)input->data)->tag; if (tag & TAG_IS_REDIR) { while(input != NULL) { + tag = ((t_token *)input->data)->tag; push_token(&tmp->ast->redirs, input->data); if (tag & TAG_IS_STR && tag & TAG_STICK) input = input->next; @@ -131,9 +143,11 @@ t_ret *parse_expr(t_ftlst *input) input = input->next; else break; - tag = ((t_token *)input->data)->tag; } + input = input->next; } + /* token_debug(input->data); */ + tmp->rest = input; return tmp; } -- cgit