diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval/cmd.c | 4 | ||||
| -rw-r--r-- | src/eval/eval.c | 4 | ||||
| -rw-r--r-- | src/eval/operation.c | 20 | ||||
| -rw-r--r-- | src/eval/parenthesis.c | 12 | ||||
| -rw-r--r-- | src/main.c | 4 | ||||
| -rw-r--r-- | src/signal.c | 7 |
6 files changed, 40 insertions, 11 deletions
diff --git a/src/eval/cmd.c b/src/eval/cmd.c index d107ce2..5bc397d 100644 --- a/src/eval/cmd.c +++ b/src/eval/cmd.c @@ -6,7 +6,7 @@ /* By: charles <charles@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/14 10:41:31 by charles #+# #+# */ -/* Updated: 2020/10/10 11:32:36 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 12:57:23 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -78,6 +78,6 @@ int eval_cmd(int fds[2], t_env env, t_ast *ast) param.env = env; status = fork_wrap(fds, ¶m, (t_wrapped_func)st_wrapped_cmd); ft_split_destroy(argv); - g_state.last_status = status; + g_state.last_status = g_state.killed ? g_state.last_status : status; return (status); } diff --git a/src/eval/eval.c b/src/eval/eval.c index f78e8ee..c2aaf8c 100644 --- a/src/eval/eval.c +++ b/src/eval/eval.c @@ -6,7 +6,7 @@ /* By: charles <me@cacharle.xyz> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/09/13 20:38:06 by charles #+# #+# */ -/* Updated: 2020/10/10 11:28:12 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 13:00:11 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,6 +57,8 @@ int fork_wrap(int fds[2], void *passed, t_wrapped_func wrapped) int eval(int fds[2], t_env env, t_ast *ast) { + if (g_state.killed) + return (0); if (ast->tag == AST_OP) return (eval_operation(fds, env, ast)); if (ast->tag == AST_CMD) diff --git a/src/eval/operation.c b/src/eval/operation.c index 826727a..3b6275a 100644 --- a/src/eval/operation.c +++ b/src/eval/operation.c @@ -6,12 +6,21 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/17 15:27:22 by charles #+# #+# */ -/* Updated: 2020/10/09 20:39:33 by charles ### ########.fr */ +/* Updated: 2020/10/10 13:01:56 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "eval.h" +/* +** \brief Evaluate an operation &&/||/; +** \param fds Input/output filedescriptor +** \param env Environment +** \param ast Operation AST node +** \return Status code of the left hand side if short circuit, +** stat code of the right hand side otherwise. +*/ + int eval_operation(int fds[2], t_env env, t_ast *ast) { int status; @@ -24,9 +33,9 @@ int eval_operation(int fds[2], t_env env, t_ast *ast) right_fds[FD_WRITE] = fds[FD_WRITE]; if ((status = eval(left_fds, env, ast->op.left)) == EVAL_FATAL) return (EVAL_FATAL); - g_state.last_status = status; if (g_state.killed) return (status); + g_state.last_status = status; if ((ast->op.sep == TAG_AND && status != 0) || (ast->op.sep == TAG_OR && status == 0)) return (status); @@ -62,6 +71,13 @@ static int st_run_piped( return (pid); } +/* +** \brief Evaluate a pipeline +** \param env Environment +** \param ast Pipeline AST node +** \return Status of the last command in the pipeline +*/ + int eval_pipeline(t_env env, t_ast *ast) { t_ftlst *curr; diff --git a/src/eval/parenthesis.c b/src/eval/parenthesis.c index 6f4f9e0..c7bc2d2 100644 --- a/src/eval/parenthesis.c +++ b/src/eval/parenthesis.c @@ -6,7 +6,7 @@ /* By: charles <me@cacharle.xyz> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/09/13 20:38:29 by charles #+# #+# */ -/* Updated: 2020/10/07 15:56:09 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 12:44:59 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,16 @@ int wrapped_eval(t_fork_param_args *param) return (eval(param->fds, param->env, param->ast)); } +/* +** \brief Evaluate a parenthesized expression +** Extract parenthesis redirection and evaluate +** the expression contained in the parenthesis in a fork +** \param fds Input/output filedescriptor +** \param env Environment +** \param ast Parenthesis AST node +** \return Expression status code +*/ + int eval_parenthesis(int fds[2], t_env env, t_ast *ast) { int status; @@ -6,7 +6,7 @@ /* By: cacharle <cacharle@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/10/10 09:25:52 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 12:57:07 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,7 +34,7 @@ int run_eval(t_env env, t_parsed *parser_out) free(parser_out); if (status == EVAL_FATAL) exit(1); - g_state.last_status = status; + g_state.last_status = g_state.killed ? g_state.last_status : status; return (status); } diff --git a/src/signal.c b/src/signal.c index 5d88368..e4a72ad 100644 --- a/src/signal.c +++ b/src/signal.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/07/16 09:16:16 by charles #+# #+# */ -/* Updated: 2020/10/10 11:23:47 by cacharle ### ########.fr */ +/* Updated: 2020/10/10 13:00:42 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,7 +27,7 @@ void signal_sigint(int signum) return ; if (g_child_pid != -1) { - g_state.last_status = 1; + g_state.last_status = 130; if (kill(g_child_pid, SIGINT) != -1) ft_putchar('\n'); g_state.killed = true; @@ -54,7 +54,8 @@ void signal_sigquit(int signum) { g_state.last_status = 131; kill(g_child_pid, SIGQUIT); - ft_putstr("Quit (core dumped)\n"); + g_state.killed = true; + ft_putstr("Quit: 3\n"); } } |
