From 94f7111734cf9f400b87b61ebb32ebc9cf1870b5 Mon Sep 17 00:00:00 2001 From: savalet Date: Thu, 17 Apr 2025 15:27:44 +0200 Subject: [PATCH] Add single && and || handling --- src/visit_condition.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/visitor.c | 39 ++++++++++++++++++++++++++++++++------- src/visitor.h | 19 +++++++++++++++++++ 3 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 src/visit_condition.c create mode 100644 src/visitor.h diff --git a/src/visit_condition.c b/src/visit_condition.c new file mode 100644 index 0000000..7e1bf06 --- /dev/null +++ b/src/visit_condition.c @@ -0,0 +1,40 @@ +/* +** EPITECH PROJECT, 2025 +** __ +** File description: +** _ +*/ + +#include + +#include "ast.h" +#include "common.h" +#include "exec.h" +#include "u_str.h" +#include "visitor.h" + +int visit_and(ef_t *ef, ast_t *node) +{ + int result = RETURN_FAILURE; + + if (!node->binary.left || !node->binary.right) + return WRITE_CONST(STDERR_FILENO, "Invalid null l/r command.\n"), + RETURN_FAILURE; + result = visit_list(ef, node->binary.left); + if (!result) + result = visit_list(ef, node->binary.right); + return result; +} + +int visit_or(ef_t *ef, ast_t *node) +{ + int result = RETURN_FAILURE; + + if (!node->binary.left || !node->binary.right) + return WRITE_CONST(STDERR_FILENO, "Invalid null l/r command.\n"), + RETURN_FAILURE; + result = visit_list(ef, node->binary.left); + if (result) + result = visit_list(ef, node->binary.right); + return result; +} diff --git a/src/visitor.c b/src/visitor.c index af50f04..e9414d4 100644 --- a/src/visitor.c +++ b/src/visitor.c @@ -16,6 +16,7 @@ #include "exec.h" #include "redirects.h" #include "u_str.h" +#include "visitor.h" #include "debug.h" @@ -92,27 +93,47 @@ int visit_pipes(ef_t *ef) return result; } -static int visit_list(ef_t *ef, ast_t *node) { int result = RETURN_FAILURE; + if (node->type == N_CMD) { + ef->act_node = node; + return visit_cmd(ef); + } if (node->tok.type == T_PIPE) { ef->act_node = node; return visit_pipes(ef); } + return result; +} + +static +int visit_condition(ef_t *ef, ast_t *node) +{ + if (node->tok.type == T_AND) + return visit_and(ef, node); + if (node->tok.type == T_OR) + return visit_or(ef, node); + return RETURN_FAILURE; +} + +static +int visit_semi(ef_t *ef, ast_t *node) +{ + int result = RETURN_FAILURE; + for (size_t i = 0; i < node->list.sz; i++) { ef->flags &= ~F_PIPE; ef->act_node = node->list.nodes[i]; - if (node->list.nodes[i]->type == N_LST && - node->list.nodes[i]->tok.type == T_PIPE) - result = visit_pipes(ef); + if (node->list.nodes[i]->tok.type & (T_AND | T_OR)) + result = visit_condition(ef, node->list.nodes[i]); + if (node->list.nodes[i]->type == N_LST) + result = visit_list(ef, node->list.nodes[i]); ef->pin_fd = STDIN_FILENO; ef->pout_fd = STDOUT_FILENO; if (node->list.nodes[i]->type == N_CMD) result = visit_cmd(ef); - if (node->tok.type == T_AT) - sleep(3); } return result; } @@ -130,7 +151,11 @@ int visitor_launcher(ef_t *ef) U_DEBUG_CALL(print_ast, ef->ctx->ast, ef->ctx, 0); if (ef->ctx->ast->type == N_LOP) result = visit_loop(ef, ef->ctx->ast); - if (ef->ctx->ast->type == N_LST) + if (ef->ctx->ast->tok.type == T_SEMICOLON) + result = visit_semi(ef, ef->ctx->ast); + if (ef->ctx->ast->tok.type & (T_AND | T_OR)) + result = visit_condition(ef, ef->ctx->ast); + if (ef->ctx->ast->tok.type == T_PIPE) result = visit_list(ef, ef->ctx->ast); if (ef->ctx->ast->type == N_CMD) { ef->act_node = ef->ctx->ast; diff --git a/src/visitor.h b/src/visitor.h new file mode 100644 index 0000000..9e63620 --- /dev/null +++ b/src/visitor.h @@ -0,0 +1,19 @@ +/* +** EPITECH PROJECT, 2025 +** __ +** File description: +** _ +*/ + +#ifndef VISITOR_H + #define VISITOR_H + #include "ast.h" + #include "exec.h" + +// List (pipe, ...) +int visit_list(ef_t *ef, ast_t *node); + +// Conditions +int visit_and(ef_t *ef, ast_t *node); +int visit_or(ef_t *ef, ast_t *node); +#endif /* VISITOR_H */