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); }
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); }
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); }
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; }
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); }