Annotation of 43BSDReno/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: (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: }

unix.superglobalmegacorp.com

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