Ejemplo n.º 1
0
int		exec_tree(t_tree_op *node)
{
	if (!node)
		return (-1);
	if (node->type == NODE_EXPR)
		return (exec_node(node));
	if (node->type == NODE_OPERATOR && is_pipe(node->data))
		return (piped_node(node));
	if (node->type == NODE_OPERATOR && is_semi_colon(node->data))
	{
		exec_tree(node->left);
		exec_tree(node->right);
	}
	return (0);
}
Ejemplo n.º 2
0
int main(int ac, char** av) {    
    if(ac <= 1) {
        printf ("Usage: ./graphexec <filename.txt>\n");
        return 1;
    }
    in_fp = av[1];
    struct node *n_array = get_node_array();
    int id;
    int i;
    int j;
    int has_cycle = 1;
    
    for(i=0; i<linenum; i++) {
        if(n_array[i].num_parent == 0) {
            has_cycle = 0;
            break;
        }
    }

    if(has_cycle) {
        fprintf(stderr, "Cycles exist in the graph!\n");
        return(1);
    }

    exec_tree(n_array);

    free(n_array);

    return(0);
}
Ejemplo n.º 3
0
int		piped_node(t_tree_op *node)
{
	pid_t	l_pid;
	pid_t	r_pid;
	int		n;
	int		m;
	int		fd[2];

	pipe(fd);
	l_pid = fork();
	if (l_pid == 0)
	{
		close(fd[0]);
		dup2(fd[1], 1);
		exit(exec_tree(node->left));
	}
	else
	{
		r_pid = fork();
		if (r_pid == 0)
		{
			close(fd[1]);
			dup2(fd[0], 0);
			exit(exec_tree(node->right));
		}
		else
		{
			n = wait(NULL);
			if (n == r_pid)
				close(fd[0]);
			else
				close(fd[1]);
			m = wait(NULL);
			if (m == l_pid)
				close(fd[1]);
			else
				close(fd[0]);
			debug_log("sub_process ended");
		}
	}
	return (0);
}
Ejemplo n.º 4
0
Archivo: vm.c Proyecto: cjxgm/clabs
int exec_tree(tree_t * tree)
{
	tree_op_t * op;
	int rv;

	while (tree) {
		rv = 0;

		switch ((int)tree->type) {
			case TREE_CNST:
				rv = ((tree_cnst_t *)tree)->value;
				break;
			case TREE_IDENT:
				rv = sym[((tree_ident_t *)tree)->id];
				break;
			case TREE_OP:
				op = (tree_op_t *) tree;
				switch (op->opr) {
					case '+':
						rv = exec_tree(op->ops[0])
							+ exec_tree(op->ops[1]);
						break;
					case '-':
						rv = exec_tree(op->ops[0])
							- exec_tree(op->ops[1]);
						break;
					case '=':
						sym[((tree_ident_t *)op->ops[0])->id] =
							exec_tree(op->ops[1]);
						break;
					case KPRINT:
						printf("%d\n", exec_tree(op->ops[0]));
						break;
					case KWHILE:
						while (exec_tree(op->ops[0]))
							exec_tree(op->ops[1]);
						break;
				}
				break;
		}
		tree = tree->next;
	}

	return rv;
}
Ejemplo n.º 5
0
int		parsexec(char *cmd, t_shell *shell)
{
	int		ret;
	t_cmd	*cmd_data;
	t_tree	*cmd_tree;

	g_is_a_term = 0;
	if ((cmd = add_some_space(cmd)) == NULL
		|| (cmd_data = get_cmd_data(cmd)) == NULL)
		return (-1);
	lexing(cmd_data);
	if ((ret = replace_var(cmd_data, shell)) != -1
		&& ret != -2 && parsing(cmd_data))
	{
		if ((cmd_tree = get_tree(cmd_data)) == NULL
			|| exec_tree(cmd_tree, shell) == -1)
			return (-1);
		clean_memory(cmd_tree, cmd_data, cmd);
	}
	return (ret);
}