aboutsummaryrefslogtreecommitdiff
path: root/src/eval/read.c
blob: 1364fca8190575a4ea5605048a7c71a91fce30b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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));
}