int main(int argc, char **argv) { int fd; sigset_t mask; /* Make sure std* are open, for suid safety. */ do fd = open("/dev/null", O_RDONLY); while (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO); close(fd); /* Block ^Z to prevent holding locks on the attachtab. */ sigemptyset(&mask); sigaddset(&mask, SIGTSTP); sigaddset(&mask, SIGTTOU); sigaddset(&mask, SIGTTIN); sigprocmask(SIG_BLOCK, &mask, NULL); if (argc > 1 && !strncmp(argv[1], "-P", 2)) { whoami = argv[1] + 2; argv++; argc--; } else { whoami = strrchr(argv[0], '/'); if (whoami) whoami++; else whoami = argv[0]; } if (!strcmp(whoami, "add")) exit(add_main(argc, argv)); else if (!strcmp(whoami, "attach")) exit(attach_main(argc, argv)); else if (!strcmp(whoami, "detach")) exit(detach_main(argc, argv)); else if (!strcmp(whoami, "fsid") || !strcmp(whoami, "nfsid")) exit(fsid_main(argc, argv)); else if (!strcmp(whoami, "zinit")) exit(zinit_main(argc, argv)); fprintf(stderr, "Not invoked with attach, detach, nfsid, fsid, zinit, add, or attachandrun!\n"); exit(1); }
tree_node* alex_parsing(token_list* t_lt) { token* tk_p = NULL; tree_node* r_tn = NULL; if(t_lt == NULL) return NULL; while(tk_p=at_token(t_lt)) { switch(tk_p->token_type) { case token_type_var: // 定义变量 { r_tn = syn_var_def(t_lt); if(r_tn) add_main(r_tn); else return NULL; } break; case token_type_ide: { r_tn = syn_exp_stmt(t_lt); if(r_tn) add_main(r_tn); else return NULL; } break; case token_type_using: // 引入dll { r_tn = syn_using(t_lt); if(r_tn) add_main(r_tn); else return NULL; } break; case token_type_func: // 定义函数 { r_tn = syn_func_def(t_lt); if(r_tn) { if(look_table(global_table, r_tn->b_v.name.s_ptr)==NULL) { add_g_table(new_func_st(r_tn->b_v.name.s_ptr)); add_func(r_tn); } else { print("parsing[erro line %d]: the function %s is redef!\n", tk_p->token_line, r_tn->b_v.name.s_ptr); free_tree(r_tn); return NULL; } } else return NULL; } break; default: { print("parsing[error line %d]: not allow token \"%s\" at globle code seg!\n", tk_p->token_line, tk_p->token_name); next_token(t_lt); } free_tree(r_tn); return NULL; } } return r_tn; }