aboutsummaryrefslogtreecommitdiff
path: root/src/eval/eval.c
blob: c1b580ffd3453418430328e93df891b55decd6f0 (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
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   eval.c                                             :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: charles <charles.cabergs@gmail.com>        +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/04/01 17:05:21 by charles           #+#    #+#             */
/*   Updated: 2020/06/14 10:42:37 by charles          ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

/*
** \file   eval.c
** \brief  Evaluation of an AST
*/

/* #include "eval.h" */

/* #<{(| */
/* ** \brief        Evaluate a line */
/* ** \param state  State of the evaluation */
/* ** \param line   Line to evaluate */
/* ** \return       Last Executed command status or -1 on error */
/* |)}># */
/*  */
/* static int	eval_line(void *param) */
/* { */
/* 	int				status; */
/* 	t_eval_state	*state; */
/* 	t_line			*line; */
/* 	int fd_in; */
/* 	int fd_out; */
/*  */
/* 	state = ((t_fork_param_line*)param)->state; */
/* 	line = ((t_fork_param_line*)param)->line; */
/* 	fd_in = ((t_fork_param_line*)param)->fd_in; */
/* 	fd_out = ((t_fork_param_line*)param)->fd_out; */
/*  */
/* 	#<{(| if (line->right == NULL) |)}># */
/* 	#<{(| 	return (eval(state, line->left)); |)}># */
/*  */
/* 	#<{(| if (line->sep == SEP_PIPE) |)}># */
/* 	#<{(| 	pipe(state->p); |)}># */
/*  */
/* 	if (line->left->tag == AST_LINE) */
/* 	{ */
/* 		return (fork_wrap(fd_in, fd_out, param, &eval_line)); */
/* 	} */
/* 	if ((status = eval(fd_in, fd_out, state, line->left)) == -1) */
/* 		return (-1); */
/* 	if ((line->sep == SEP_AND && status != 0) || */
/* 		(line->sep == SEP_OR && status == 0)) */
/* 		return (status); */
/*  */
/* 	return (eval(fd_in, fd_out, state, line->right)); */
/* } */
/*  */
/* #<{(| */
/* ** \brief        Evaluate an AST */
/* ** \param state  State of the evaluation */
/* ** \param ast    Abstract syntax tree to evaluate */
/* ** \return       Last command status or -1 on error */
/* |)}># */
/*  */
/* int			eval(int fd_in, int fd_out, t_eval_state *state, t_ast *ast) */
/* { */
/* 	t_fork_param_line param; */
/*  */
/* 	errno = 0; */
/* 	if (ast->tag == TAG_LINE) */
/* 	{ */
/* 		param.state = state; */
/* 		param.line = &ast->line; */
/* 		param.fd_in = fd_in; */
/* 		param.fd_out = fd_out; */
/* 		return (eval_line(&param)); */
/* 	} */
/* 	if (ast->tag == TAG_CMD) */
/* 		return (eval_cmd(fd_in, fd_out, state, &ast->cmd)); */
/* 	return (-1); */
/* } */