|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)misc.c 5.2 (Berkeley) 6/18/88";
20: #endif /* not lint */
21:
22: # include "monop.ext"
23: # include <ctype.h>
24: # include <signal.h>
25:
26: # define execsh(sh) execl(sh, shell_name[roll(1, num_names)-1], 0)
27:
28: static char *shell_def = "/bin/csh",
29: *shell_name[] = {
30: ".Hi Mom!",
31: ".Kick Me",
32: ".I'm really the next process down",
33: ".Hi Kids!",
34: ".This space for rent",
35: ".Singin' in the rain....",
36: ".I am but a Cog in the Wheel of Life",
37: ".Look out!!! Behind you!!!!!",
38: ".Looking for a good time, sailor?",
39: ".I don't get NO respect...",
40: ".Augghh! You peeked!"
41: };
42:
43: static int num_names = sizeof shell_name / sizeof (char *);;
44:
45: char *shell_in();
46:
47: /*
48: * This routine executes a truncated set of commands until a
49: * "yes or "no" answer is gotten.
50: */
51: getyn(prompt)
52: reg char *prompt; {
53:
54: reg int com;
55:
56: for (;;)
57: if ((com=getinp(prompt, yn)) < 2)
58: return com;
59: else
60: (*func[com-2])();
61: }
62: /*
63: * This routine tells the player if he's out of money.
64: */
65: notify() {
66:
67: if (cur_p->money < 0)
68: printf("That leaves you $%d in debt\n", -cur_p->money);
69: else if (cur_p->money == 0)
70: printf("that leaves you broke\n");
71: else if (fixing && !told_em && cur_p->money > 0) {
72: printf("-- You are now Solvent ---\n");
73: told_em = TRUE;
74: }
75: }
76: /*
77: * This routine switches to the next player
78: */
79: next_play() {
80:
81: player = ++player % num_play;
82: cur_p = &play[player];
83: num_doub = 0;
84: }
85: /*
86: * This routine gets an integer from the keyboard after the
87: * given prompt.
88: */
89: get_int(prompt)
90: reg char *prompt; {
91:
92: reg int num;
93: reg char *sp;
94: char buf[257];
95:
96: for (;;) {
97: inter:
98: printf(prompt);
99: num = 0;
100: for (sp = buf; (*sp=getchar()) != '\n'; sp++)
101: if (*sp == -1) /* check for interrupted system call */
102: goto inter;
103: if (sp == buf)
104: continue;
105: for (sp = buf; isspace(*sp); sp++)
106: continue;
107: for (; isdigit(*sp); sp++)
108: num = num * 10 + *sp - '0';
109: if (*sp == '\n')
110: return num;
111: else
112: printf("I can't understand that\n");
113: }
114: }
115: /*
116: * This routine sets the monopoly flag from the list given.
117: */
118: set_ownlist(pl)
119: int pl; {
120:
121: reg int num; /* general counter */
122: reg MON *orig; /* remember starting monop ptr */
123: reg OWN *op; /* current owned prop */
124: OWN *orig_op; /* origianl prop before loop */
125:
126: op = play[pl].own_list;
127: #ifdef DEBUG
128: printf("op [%d] = play[pl [%d] ].own_list;\n", op, pl);
129: #endif
130: while (op) {
131: #ifdef DEBUG
132: printf("op->sqr->type = %d\n", op->sqr->type);
133: #endif
134: switch (op->sqr->type) {
135: case UTIL:
136: #ifdef DEBUG
137: printf(" case UTIL:\n");
138: #endif
139: for (num = 0; op && op->sqr->type == UTIL; op = op->next)
140: num++;
141: play[pl].num_util = num;
142: #ifdef DEBUG
143: printf("play[pl].num_util = num [%d];\n", num);
144: #endif
145: break;
146: case RR:
147: #ifdef DEBUG
148: printf(" case RR:\n");
149: #endif
150: for (num = 0; op && op->sqr->type == RR; op = op->next) {
151: #ifdef DEBUG
152: printf("iter: %d\n", num);
153: printf("op = %d, op->sqr = %d, op->sqr->type = %d\n", op, op->sqr, op->sqr->type);
154: #endif
155: num++;
156: }
157: play[pl].num_rr = num;
158: #ifdef DEBUG
159: printf("play[pl].num_rr = num [%d];\n", num);
160: #endif
161: break;
162: case PRPTY:
163: #ifdef DEBUG
164: printf(" case PRPTY:\n");
165: #endif
166: orig = op->sqr->desc->mon_desc;
167: orig_op = op;
168: num = 0;
169: while (op && op->sqr->desc->mon_desc == orig) {
170: #ifdef DEBUG
171: printf("iter: %d\n", num);
172: #endif
173: num++;
174: #ifdef DEBUG
175: printf("op = op->next ");
176: #endif
177: op = op->next;
178: #ifdef DEBUG
179: printf("[%d];\n", op);
180: #endif
181: }
182: #ifdef DEBUG
183: printf("num = %d\n");
184: #endif
185: if (orig == 0) {
186: printf("panic: bad monopoly descriptor: orig = %d\n", orig);
187: printf("player # %d\n", pl+1);
188: printhold(pl);
189: printf("orig_op = %d\n", orig_op);
190: printf("orig_op->sqr->type = %d (PRPTY)\n", op->sqr->type);
191: printf("orig_op->next = %d\n", op->next);
192: printf("orig_op->sqr->desc = %d\n", op->sqr->desc);
193: printf("op = %d\n", op);
194: printf("op->sqr->type = %d (PRPTY)\n", op->sqr->type);
195: printf("op->next = %d\n", op->next);
196: printf("op->sqr->desc = %d\n", op->sqr->desc);
197: printf("num = %d\n", num);
198: }
199: #ifdef DEBUG
200: printf("orig->num_in = %d\n", orig->num_in);
201: #endif
202: if (num == orig->num_in)
203: is_monop(orig, pl);
204: else
205: isnot_monop(orig);
206: break;
207: }
208: }
209: }
210: /*
211: * This routine sets things up as if it is a new monopoly
212: */
213: is_monop(mp, pl)
214: reg MON *mp;
215: int pl; {
216:
217: reg char *sp;
218: reg int i;
219:
220: mp->owner = pl;
221: mp->num_own = mp->num_in;
222: for (i = 0; i < mp->num_in; i++)
223: mp->sq[i]->desc->monop = TRUE;
224: mp->name = mp->mon_n;
225: }
226: /*
227: * This routine sets things up as if it is no longer a monopoly
228: */
229: isnot_monop(mp)
230: reg MON *mp; {
231:
232: reg char *sp;
233: reg int i;
234:
235: mp->owner = -1;
236: for (i = 0; i < mp->num_in; i++)
237: mp->sq[i]->desc->monop = FALSE;
238: mp->name = mp->not_m;
239: }
240: /*
241: * This routine gives a list of the current player's routine
242: */
243: list() {
244:
245: printhold(player);
246: }
247: /*
248: * This routine gives a list of a given players holdings
249: */
250: list_all() {
251:
252: reg int pl;
253:
254: while ((pl=getinp("Whose holdings do you want to see? ", name_list)) < num_play)
255: printhold(pl);
256: }
257: /*
258: * This routine gives the players a chance before it exits.
259: */
260: quit() {
261:
262: putchar('\n');
263: if (getyn("Do you all really want to quit? ", yn) == 0)
264: exit(0);
265: signal(2, quit);
266: }
267: /*
268: * This routine copies one structure to another
269: */
270: cpy_st(s1, s2, size)
271: reg int *s1, *s2, size; {
272:
273: size /= 2;
274: while (size--)
275: *s1++ = *s2++;
276: }
277: /*
278: * This routine forks off a shell. It uses the users login shell
279: */
280: shell_out() {
281:
282: static char *shell = NULL;
283:
284: printline();
285: if (shell == NULL)
286: shell = shell_in();
287: fflush();
288: if (!fork()) {
289: signal(SIGINT, SIG_DFL);
290: execsh(shell);
291: }
292: ignoresigs();
293: wait();
294: resetsigs();
295: putchar('\n');
296: printline();
297: }
298: /*
299: * This routine looks up the users login shell
300: */
301: # include <pwd.h>
302:
303: struct passwd *getpwuid();
304:
305: char *getenv();
306:
307: char *
308: shell_in() {
309:
310: reg struct passwd *pp;
311: reg char *sp;
312:
313: if ((sp = getenv("SHELL")) == NULL) {
314: pp = getpwuid(getuid());
315: if (pp->pw_shell[0] != '\0')
316: return pp->pw_shell;
317: else
318: return shell_def;
319: /*return (*(pp->pw_shell) != '\0' ? pp->pw_shell : shell_def);*/
320: }
321: return sp;
322: }
323: /*
324: * This routine sets things up to ignore all the signals.
325: */
326: ignoresigs() {
327:
328: reg int i;
329:
330: for (i = 0; i < NSIG; i++)
331: signal(i, SIG_IGN);
332: }
333: /*
334: * This routine sets up things as they were before.
335: */
336: resetsigs() {
337:
338: reg int i;
339:
340: for (i = 0; i < NSIG; i++)
341: signal(i, SIG_DFL);
342: signal(2, quit);
343: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.