⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
# include	"monop.ext"# include	<ctype.h># include	<signal.h># define	execsh(sh)	execl(sh, shell_name[roll(1, num_names)-1], 0)static char	*shell_def	= "/bin/csh",		*shell_name[]	= {			".Hi Mom!",			".Kick Me",			".I'm really the next process down",			".Hi Kids!",			".This space for rent",			".Singin' in the rain....",			".I am but a Cog in the Wheel of Life",			".Look out!!! Behind you!!!!!",			".Looking for a good time, sailor?",			".I don't get NO respect...",			".Augghh!  You peeked!"		};static int	num_names	= sizeof shell_name / sizeof (char *);;char	*shell_in();/* *	This routine executes a truncated set of commands until a * "yes or "no" answer is gotten. */getyn(prompt)reg char	*prompt; {	reg int	com;	for (;;)		if ((com=getinp(prompt, yn)) < 2)			return com;		else			(*func[com-2])();}/* *	This routine tells the player if he's out of money. */notify() {	if (cur_p->money < 0)		printf("That leaves you $%d in debt\n", -cur_p->money);	else if (cur_p->money == 0)		printf("that leaves you broke\n");	else if (fixing && !told_em && cur_p->money > 0) {		printf("-- You are now Solvent ---\n");		told_em = TRUE;	}}/* *	This routine switches to the next player */next_play() {	player = ++player % num_play;	cur_p = &play[player];	num_doub = 0;}/* *	This routine gets an integer from the keyboard after the * given prompt. */get_int(prompt)reg char	*prompt; {	reg int		num;	reg char	*sp;	char		buf[257];	for (;;) {inter:		printf(prompt);		num = 0;		for (sp = buf; (*sp=getchar()) != '\n'; sp++)			if (*sp == -1)	/* check for interrupted system call */				goto inter;		if (sp == buf)			continue;		for (sp = buf; isspace(*sp); sp++)			continue;		for (; isdigit(*sp); sp++)			num = num * 10 + *sp - '0';		if (*sp == '\n')			return num;		else			printf("I can't understand that\n");	}}/* *	This routine sets the monopoly flag from the list given. */set_ownlist(pl)int	pl; {	reg int	num;		/* general counter		*/	reg MON	*orig;		/* remember starting monop ptr	*/	reg OWN	*op;		/* current owned prop		*/	OWN	*orig_op;		/* origianl prop before loop	*/	op = play[pl].own_list;#ifdef DEBUG	printf("op [%d] = play[pl [%d] ].own_list;\n", op, pl);#endif	while (op) {#ifdef DEBUG		printf("op->sqr->type = %d\n", op->sqr->type);#endif		switch (op->sqr->type) {		  case UTIL:#ifdef DEBUG			printf("  case UTIL:\n");#endif			for (num = 0; op && op->sqr->type == UTIL; op = op->next)				num++;			play[pl].num_util = num;#ifdef DEBUG			printf("play[pl].num_util = num [%d];\n", num);#endif			break;		  case RR:#ifdef DEBUG			printf("  case RR:\n");#endif			for (num = 0; op && op->sqr->type == RR; op = op->next) {#ifdef DEBUG				printf("iter: %d\n", num);				printf("op = %d, op->sqr = %d, op->sqr->type = %d\n", op, op->sqr, op->sqr->type);#endif				num++;			}			play[pl].num_rr = num;#ifdef DEBUG			printf("play[pl].num_rr = num [%d];\n", num);#endif			break;		  case PRPTY:#ifdef DEBUG			printf("  case PRPTY:\n");#endif			orig = op->sqr->desc->mon_desc;			orig_op = op;			num = 0;			while (op && op->sqr->desc->mon_desc == orig) {#ifdef DEBUG				printf("iter: %d\n", num);#endif				num++;#ifdef DEBUG				printf("op = op->next ");#endif				op = op->next;#ifdef DEBUG				printf("[%d];\n", op);#endif			}#ifdef DEBUG			printf("num = %d\n");#endif			if (orig == 0) {				printf("panic:  bad monopoly descriptor: orig = %d\n", orig);				printf("player # %d\n", pl+1);				printhold(pl);				printf("orig_op = %d\n", orig_op);				printf("orig_op->sqr->type = %d (PRPTY)\n", op->sqr->type);				printf("orig_op->next = %d\n", op->next);				printf("orig_op->sqr->desc = %d\n", op->sqr->desc);				printf("op = %d\n", op);				printf("op->sqr->type = %d (PRPTY)\n", op->sqr->type);				printf("op->next = %d\n", op->next);				printf("op->sqr->desc = %d\n", op->sqr->desc);				printf("num = %d\n", num);			}#ifdef DEBUG			printf("orig->num_in = %d\n", orig->num_in);#endif			if (num == orig->num_in)				is_monop(orig, pl);			else				isnot_monop(orig);			break;		}	}}/* *	This routine sets things up as if it is a new monopoly */is_monop(mp, pl)reg MON	*mp;int	pl; {	reg char	*sp;	reg int		i;	mp->owner = pl;	mp->num_own = mp->num_in;	for (i = 0; i < mp->num_in; i++)		mp->sq[i]->desc->monop = TRUE;	mp->name = mp->mon_n;}/* *	This routine sets things up as if it is no longer a monopoly */isnot_monop(mp)reg MON	*mp; {	reg char	*sp;	reg int		i;	mp->owner = -1;	for (i = 0; i < mp->num_in; i++)		mp->sq[i]->desc->monop = FALSE;	mp->name = mp->not_m;}/* *	This routine gives a list of the current player's routine */list() {	printhold(player);}/* *	This routine gives a list of a given players holdings */list_all() {	reg int	pl;	while ((pl=getinp("Whose holdings do you want to see? ", name_list)) < num_play)		printhold(pl);}/* *	This routine gives the players a chance before it exits. */quit() {	putchar('\n');	if (getyn("Do you all really want to quit? ", yn) == 0)		exit(0);	signal(2, quit);}/* *	This routine copies one structure to another */cpy_st(s1, s2, size)reg int	*s1, *s2, size; {	size /= 2;	while (size--)		*s1++ = *s2++;}/* *	This routine forks off a shell.  It uses the users login shell */shell_out() {	static char	*shell = NULL;	printline();	if (shell == NULL)		shell = shell_in();	fflush();	if (!fork()) {		signal(SIGINT, SIG_DFL);		execsh(shell);	}	ignoresigs();	wait();	resetsigs();	putchar('\n');	printline();}/* *	This routine looks up the users login shell */# include	<pwd.h>struct passwd	*getpwuid();char		*getenv();char *shell_in() {	reg struct passwd	*pp;	reg char		*sp;	if ((sp = getenv("SHELL")) == NULL) {		pp = getpwuid(getuid());		if (pp->pw_shell[0] != '\0')			return pp->pw_shell;		else			return shell_def;		/*return (*(pp->pw_shell) != '\0' ? pp->pw_shell : shell_def);*/	}	return sp;}/* *	This routine sets things up to ignore all the signals. */ignoresigs() {	reg int	i;	for (i = 0; i < NSIG; i++)		signal(i, SIG_IGN);}/* *	This routine sets up things as they were before. */resetsigs() {	reg int	i;	for (i = 0; i < NSIG; i++)		signal(i, SIG_DFL);	signal(2, quit);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -