aboutsummaryrefslogtreecommitdiff
path: root/src/eval/op.c
diff options
context:
space:
mode:
authornass1pro <nass1pro@gmail.com>2020-06-18 14:05:42 +0200
committernass1pro <nass1pro@gmail.com>2020-06-18 14:05:42 +0200
commit1e53dcdbd4f94a11a6d23687bc518fdd8aee0bd9 (patch)
tree64c9fdfb2f9d055404d72160e9d0f679809e7426 /src/eval/op.c
parent70459a3ab97b13df9bf829e29ed91becfba1ea03 (diff)
parent52bc3c1a6035dae4e45015c48a8c65681a31512a (diff)
downloadminishell-1e53dcdbd4f94a11a6d23687bc518fdd8aee0bd9.tar.gz
minishell-1e53dcdbd4f94a11a6d23687bc518fdd8aee0bd9.tar.bz2
minishell-1e53dcdbd4f94a11a6d23687bc518fdd8aee0bd9.zip
Merge branch 'master' into parse_cmd
Diffstat (limited to 'src/eval/op.c')
-rw-r--r--src/eval/op.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/eval/op.c b/src/eval/op.c
new file mode 100644
index 0000000..e47698b
--- /dev/null
+++ b/src/eval/op.c
@@ -0,0 +1,49 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* op.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/06/17 15:27:22 by charles #+# #+# */
+/* Updated: 2020/06/17 17:03:48 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "eval.h"
+
+// TODO: add parent tag on first operation of parent to fork
+int eval_op(int fds[2], t_env env, t_path path, t_op *op)
+{
+ int status;
+ int left_fds[2];
+ int right_fds[2];
+ int p[2];
+
+ left_fds[FDS_READ] = fds[FDS_READ];
+ left_fds[FDS_WRITE] = MS_NO_FD;
+ right_fds[FDS_READ] = MS_NO_FD;
+ right_fds[FDS_WRITE] = fds[FDS_WRITE];
+ if (op->sep == TAG_PIPE)
+ {
+ pipe(p);
+ left_fds[FDS_WRITE] = p[FDS_WRITE];
+ right_fds[FDS_READ] = p[FDS_READ];
+ }
+ if ((status = eval(left_fds, env, path, op->left)) == -1)
+ return (-1);
+ if ((op->sep == TAG_AND && status != 0) ||
+ (op->sep == TAG_PIPE && status != 0) ||
+ (op->sep == TAG_OR && status == 0))
+ return (status);
+ return (eval(right_fds, env, path, op->right));
+}
+
+int eval(int fds[2], t_env env, t_path path, t_ast *ast)
+{
+ if (ast->tag == AST_OP)
+ return (eval_op(fds, env, path, &ast->op));
+ if (ast->tag == AST_CMD)
+ return (eval_cmd(fds, env, path, ast));
+ return (-1);
+}