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