aboutsummaryrefslogtreecommitdiff
path: root/src/eval/eval.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-03-30 22:27:16 +0200
committerCharles <sircharlesaze@gmail.com>2020-03-30 22:27:16 +0200
commit941099778b59da6b904c284e8a82affe4766124b (patch)
tree4457787a1b09408fcd1a5607109cc1c902c80af8 /src/eval/eval.c
parent74787eefa2ac85d85b484d0ca5dffc6a2a13331d (diff)
downloadminishell-941099778b59da6b904c284e8a82affe4766124b.tar.gz
minishell-941099778b59da6b904c284e8a82affe4766124b.tar.bz2
minishell-941099778b59da6b904c284e8a82affe4766124b.zip
Added doc
Diffstat (limited to 'src/eval/eval.c')
-rw-r--r--src/eval/eval.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/eval/eval.c b/src/eval/eval.c
new file mode 100644
index 0000000..8fca2c1
--- /dev/null
+++ b/src/eval/eval.c
@@ -0,0 +1,103 @@
+/**
+** \file eval.c
+** \brief Evaluation of an AST
+*/
+
+#include "minishell.h"
+
+
+static bool check_node(t_ast *ast)
+{
+
+}
+
+static int eval_sep(t_ast *ast)
+{
+ 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)
+ {
+ status = ms_eval(path, env, ast->children[0]);
+ if (status != 0)
+ return (ms_eval(path, env, ast->children[1]));
+ else
+ return (status);
+ }
+ return (-1);
+}
+
+static char **get_args(t_ast *ast)
+{
+ int i;
+ int counter;
+ char **argv;
+
+ 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 (ast->children[i]->tag != TAG_ARG)
+ continue ;
+ if ((argv[counter] = ft_strdup(ast->children[i]->content)) == NULL)
+ {
+ ft_split_destroy(argv);
+ return (NULL);
+ }
+ }
+ 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 (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);
+ }
+ }
+ return (vec);
+ */
+}
+
+//reduce?
+int ms_eval(t_path path, t_env env, 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));
+
+}