Annotation of 43BSDTahoe/games/monop/misc.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.