diff options
Diffstat (limited to 'src/eval/read.c')
| -rw-r--r-- | src/eval/read.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/eval/read.c b/src/eval/read.c new file mode 100644 index 0000000..1364fca --- /dev/null +++ b/src/eval/read.c @@ -0,0 +1,89 @@ +/** +** \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)); +} |
