Example #1
0
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;
}