aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-06-19 14:38:15 +0200
committerCharles <sircharlesaze@gmail.com>2020-06-19 17:53:28 +0200
commite085451ec45c0551c80989a7d49b0e0deb4b9586 (patch)
tree0ecddd9b145318eaa84c6de2f9c251a6e2a0e195 /src
parent831cc03ff6c01fb78d77629b7a8f2a75d9e9f75a (diff)
downloadminishell-e085451ec45c0551c80989a7d49b0e0deb4b9586.tar.gz
minishell-e085451ec45c0551c80989a7d49b0e0deb4b9586.tar.bz2
minishell-e085451ec45c0551c80989a7d49b0e0deb4b9586.zip
Parenthesis working, Added getline loop in main
Diffstat (limited to 'src')
-rw-r--r--src/debug.c6
-rw-r--r--src/eval/op.c6
-rw-r--r--src/main.c183
-rwxr-xr-xsrc/parse/parse.c24
4 files changed, 129 insertions, 90 deletions
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 <charles.cabergs@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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, &param, 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 <cacharle@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <nahaddac@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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;
}