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