Annotation of 42BSD/games/monop/misc.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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