From 808d1499f5708ad4eda3612416e62efe6fdff021 Mon Sep 17 00:00:00 2001 From: Charles Date: Tue, 31 Mar 2020 21:31:26 +0200 Subject: More specific AST struct and evaluation start --- src/eval/eval.c | 128 ++++++++++++++++++++++---------------------------------- src/eval/read.c | 89 --------------------------------------- src/eval/val.c | 69 ------------------------------ 3 files changed, 51 insertions(+), 235 deletions(-) delete mode 100644 src/eval/read.c delete mode 100644 src/eval/val.c (limited to 'src/eval') diff --git a/src/eval/eval.c b/src/eval/eval.c index 8fca2c1..a5e2c71 100644 --- a/src/eval/eval.c +++ b/src/eval/eval.c @@ -3,101 +3,75 @@ ** \brief Evaluation of an AST */ -#include "minishell.h" +#include "ms_eval.h" - -static bool check_node(t_ast *ast) +static int eval_line(t_eval_state *state, t_line *line) { + int status; + if (line->right == NULL) + return (ms_eval(state, line->left)); + status = ms_eval(state, line->left); + if ((line->sep == SEP_AND && status != 0) || + (line->sep == SEP_OR && status == 0)) + return (status); + return (ms_eval(state, line->right)); } -static int eval_sep(t_ast *ast) +static char *search_exec_path(t_path path, char *path_var, char *exec_name) { - if (ast->children_num != 2) - return (-1); - if (ast->tag == TAG_ENDCMD) - { - ms_eval(path, env, ast->children[0]); - return (ms_eval(path, env, ast->children[1])); - } - if (ast->tag == TAG_AND) - { - status = ms_eval(path, env, ast->children[0]); - if (status == 0) - return (ms_eval(path, env, ast->children[1])); - else - return (status); - } - if (ast->tag == TAG_OR) + char *exec_path; + + // try current first + if ((exec_path = ft_htget(path, exec_name)) == NULL) { - status = ms_eval(path, env, ast->children[0]); - if (status != 0) - return (ms_eval(path, env, ast->children[1])); - else - return (status); + if (ms_path_update(path, path_var) == NULL) + return (NULL); + if ((exec_path = ft_htget(path, exec_name)) == NULL) + return (NULL); } - return (-1); + return exec_path; } -static char **get_args(t_ast *ast) +static int eval_cmd(t_eval_state *state, t_cmd *cmd) { - int i; - int counter; - char **argv; + int child_pid; + char *exec_path; - if (ast->tag != TAG_CMD) - return (NULL); - counter = 0; - i = -1; - while (++i < ast->children_num) - if (ast->children[i]->tag == TAG_ARG) - counter++; - if ((argv = (char**)ft_calloc(counter + 1, sizeof(char*))) == NULL) - return (NULL); - counter = 0; - i = -1; - while (++i < ast->children_num) + if ((exec_path = search_exec_path(state->path, ft_htget(state->env, "PATH"), cmd->argv[0])) == NULL) + return (-1); + if (cmd->in != NULL) { - if (ast->children[i]->tag != TAG_ARG) - continue ; - if ((argv[counter] = ft_strdup(ast->children[i]->content)) == NULL) - { - ft_split_destroy(argv); - return (NULL); - } + if ((state->in_pipe[PIPE_WRITE] = open(cmd->in, O_RDONLY)) < 0) + return (-1); + } + if (cmd->out != NULL) + { + if ((state->out_pipe[PIPE_READ] = open(cmd->out, + (cmd->is_append ? O_WRONLY : O_APPEND) | O_CREAT)) < 0) + return (-1); } - return (argv); - - /* maybe - int i; - char *tmp; - t_vec *vec; - if ((vec = ft_vecnew(sizeof(char*))) == NULL) - return (NULL); - i = -1; - while (++i < ast->children_num) + if ((child_pid = fork()) == -1) + return (-1); + if (child_pid == 0) { - if (ast->children[i]->tag != TAG_ARG) - continue ; - if ((tmp = ft_strdup(ast->children[i]->content)) == NULL - || ft_vecpush(vec, tmp) == NULL)) - { - ft_vecdestroy(vec, free); - return (NULL); - } + if (state->in_pipe[PIPE_READ] != PIPE_CLOSED) + dup2(STDIN_FILENO, state->in_pipe[PIPE_READ]); + if (state->out_pipe[PIPE_WRITE] != PIPE_CLOSED) + dup2(STDOUT_FILENO, state->out_pipe[PIPE_WRITE]); + if (execve(exec_path, cmd->argv, NULL /*env_array*/) == -1) + exit(EXIT_FAILURE); } - return (vec); - */ + wait(&child_pid); + return (WEXITSTATUS(child_pid)); } -//reduce? -int ms_eval(t_path path, t_env env, t_ast *ast) +int ms_eval(t_eval_state *state, t_ast *ast) { - int status; - - if (ast->tag == TAG_ENDCMD || ast->tag == TAG_AND - || ast->tag == TAG_OR || ast->tag == TAG_PIPE) - return (eval_sep(ast)); - + if (ast->tag == TAG_LINE) + return eval_line(state, &ast->data.line); + if (ast->tag == TAG_CMD) + return eval_cmd(state, &ast->data.cmd); + return (-1); } diff --git a/src/eval/read.c b/src/eval/read.c deleted file mode 100644 index 1364fca..0000000 --- a/src/eval/read.c +++ /dev/null @@ -1,89 +0,0 @@ -/** -** \file read.c -** \brief Convert AST to value tree -*/ - -#include "ms_evalue.h" - -static t_value *read_cmd_args(t_value *value_cmd, t_ast *cmd) -{ - -} - -/* static void arg_count_iterator(int *counter, t_ast *child) */ -/* { */ -/* if (child == TAG_STRING) */ -/* (*counter)++; */ -/* } */ -/* */ -/* static void arg_add_iterator(t_value *value_cmd, t_ast *child) */ -/* { */ -/* if (child != TAG_STRING) */ -/* return ; */ -/* value_cmd_push( */ -/* } */ - -/** -** \brief Convert a command AST to a value -** \param cmd Command AST -** \return Converted value -*/ - -static t_value *read_cmd(t_ast *cmd) -{ - int i; - int arg_num; - t_value *value_cmd; - - if (ast->children_num < 1 || ast->children[0]->type != TAG_STRING) - return (value_new_string(VAL_ERR, "Empty command"); - arg_num = 0; - i = -1; - while (++i < ast->children_num) - if (ast->children[i]->type == TAG_STRING) - arg_num++; - if ((value_cmd = value_new_cmd(arg_num)) == NULL) - return (NULL); - i = -1; - while (++i < ast->children_num) - if (ast->children[i]->type == TAG_STRING) - { - if ((value_cmd->args[arg_num++] = - ft_strdup(ast->children[i]->contents)) == NULL) - return (NULL); - } - while (i-- > 0) - if (ast->children[i]->type != TAG_STRING) - { - if (ast->children[i]->tag == TAG_REDIR_IN - && value_cmd->in == NULL) - value_cmd->in = value_new_redir(VAL_REDIR_IN); // check null - else if (ast->children[i]->tag == TAG_REDIR_OUT - && value_cmd->out == NULL)) - value_cmd->out = value_new_redir(VAL_REDIR_OUT); - else if (ast->children[i]->tag == TAG_REDIR_APPEND - && value_cmd->append == NULL)) - value_cmd->append = value_new_redir(VAL_REDIR_APPEND); - } - return (value_cmd); -} - -/** -** \brief Convert an AST to value -** \param ast AST to convert -** \return Converted value -*/ - -t_value *eval_read(t_ast *ast) -{ - t_value *value; - - /* if (ast->tag == TAG_REDIR_IN) */ - /* return (value_new_redir(VAL_REDIR_IN)); */ - /* else if (ast->tag == TAG_REDIR_OUT) */ - /* return (value_new_redir(VAL_REDIR_OUT)); */ - /* else if (ast->tag == TAG_REDIR_APPEND) */ - /* return (value_new_redir(VAL_REDIR_APPEND)); */ - else if (ast->tag == TAG_CMD) - return (read_cmd(ast)); -} diff --git a/src/eval/val.c b/src/eval/val.c deleted file mode 100644 index 3293972..0000000 --- a/src/eval/val.c +++ /dev/null @@ -1,69 +0,0 @@ -/** -** \file val.c -** \brief Evaluation value manipulation -*/ - -#include "ms_evalue.h" - -/** -** \brief Allocate memory for a t_value and set his type -** \param type Type of valueue -** \return The allocated value -*/ - -t_value *value_new(t_value_type type) -{ - t_value *value; - - if ((value = (t_value*)malloc(sizeof(t_value*))) == NULL) - return (NULL); - value->type = type; - return (value); -} - -/** -** \brief Create a new redirection value from a filename -** \param type Type of redirection and value -** \param filename Name of the file to open -** \return Redirection value -** \warning Undefined behavior on none redirection type. -*/ - -t_value *value_new_redir(t_value_type type, char *filename) -{ - t_value *value; - - if ((value = value_new(type)) == NULL) - return (NULL); - if (type == VAL_REDIR_IN) - value->data.fd = open(filename, O_RDONLY); - else if (type == VAL_REDIR_OUT) - value->data.fd = open(filename, O_WRONLY | O_CREAT); - else if (type == VAL_REDIR_APPEND) - value->data.fd = open(filename, O_APPEND | O_CREAT); - if (value->data.fd < 0) - { - free(value); - return (NULL); - } - return (value); -} - -/** -** \brief Create a new string value (i.e error, arg, cmd) -** \param type String value type -** \param str String data -** \return String value -*/ - -t_value *value_new_string(t_value_type type, char *str) -{ - t_value *value; - - if ((value == malloc(sizeof(t_value))) == NULL) - return (NULL); - value->type = type; - if ((value->data.str = ft_strdup(str)) == NULL) - return (NULL); - return (value); -} -- cgit