aboutsummaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-03-31 21:31:26 +0200
committerCharles <sircharlesaze@gmail.com>2020-03-31 21:31:26 +0200
commit808d1499f5708ad4eda3612416e62efe6fdff021 (patch)
tree1a2da935d99724de64dfc9b77347c1f5805d9256 /src/eval
parent941099778b59da6b904c284e8a82affe4766124b (diff)
downloadminishell-808d1499f5708ad4eda3612416e62efe6fdff021.tar.gz
minishell-808d1499f5708ad4eda3612416e62efe6fdff021.tar.bz2
minishell-808d1499f5708ad4eda3612416e62efe6fdff021.zip
More specific AST struct and evaluation start
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/eval.c128
-rw-r--r--src/eval/read.c89
-rw-r--r--src/eval/val.c69
3 files changed, 51 insertions, 235 deletions
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);
-}