Annotation of researchv10no/games/pacman/util.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <signal.h>
                      3: #ifdef BELL3.0
                      4: #include <fcntl.h>
                      5: #include <termio.h>
                      6: #else
                      7: #include <sgtty.h>
                      8: #endif
                      9: #include <pwd.h>
                     10: #include "pacdefs.h"
                     11: 
                     12: #ifndef BELL3.0
                     13: #define        O_RDWR  2
                     14: #define        O_CREAT 0
                     15: #define        O_RDONLY 0
                     16: #define        O_NDELAY 0
                     17: #endif
                     18: 
                     19: extern char
                     20:        *BC,
                     21:        *UP;
                     22: 
                     23: extern int
                     24:        putch();
                     25: 
                     26: extern char
                     27:        *tgoto(),
                     28:        *mktemp();
                     29: 
                     30: extern int
                     31:        delay,
                     32:        errno,
                     33:        goldcnt;
                     34: 
                     35: extern long
                     36:        time();
                     37: 
                     38: extern struct pac
                     39:        *pacptr;
                     40: 
                     41: extern struct pac
                     42:        monst[];
                     43: 
                     44: #ifndef MSG
                     45: int    comfile;
                     46: #else
                     47: struct mstruct
                     48: {
                     49:        int     frompid;
                     50:        int     mtype;
                     51: };
                     52: 
                     53: #endif
                     54: 
                     55: #ifndef NODELAY
                     56: 
                     57: #ifndef MSG
                     58: char   *fnam;
                     59: #endif
                     60: 
                     61: #endif
                     62: 
                     63: /*
                     64:  * initbrd is used to re-initialize the display
                     65:  * array once a new game is started.
                     66:  */
                     67: char   initbrd[BRDY][BRDX] =
                     68: {
                     69: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
                     70: "O + + + * + + + + OOO + + + + * + + + O",
                     71: "O X OOO + OOOOO + OOO + OOOOO + OOO X O",
                     72: "O * + + * + * + * + + * + * + * + + * O",
                     73: "O + OOO + O + OOOOOOOOOOO + O + OOO + O",
                     74: "O + + + * O + + + OOO + + + O * + + + O",
                     75: "OOOOOOO + OOOOO + OOO + OOOOO + OOOOOOO",
                     76: "      O + O + + * + + * + + O + O      ",
                     77: "      O + O + OOO - - OOO + O + O      ",
                     78: "OOOOOOO + O + O         O + O + OOOOOOO",
                     79: "        * + * O         O * + *        ",
                     80: "OOOOOOO + O + O         O + O + OOOOOOO",
                     81: "      O + O + OOOOOOOOOOO + O + O      ",
                     82: "      O + O * + + + + + + * O + O      ",
                     83: "OOOOOOO + O + OOOOOOOOOOO + O + OOOOOOO",
                     84: "O + + + * + * + + OOO + + * + * + + + O",
                     85: "O X OOO + OOOOO + OOO + OOOOO + OOO X O",
                     86: "O + + O * + * + * + + * + * + * O + + O",
                     87: "OOO + O + O + OOOOOOOOOOO + O + O + OOO",
                     88: "O + * + + O + + + OOO + + + O + + * + O",
                     89: "O + OOOOOOOOOOO + OOO + OOOOOOOOOOO + O",
                     90: "O + + + + + + + * + + * + + + + + + + O",
                     91: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
                     92: };
                     93: 
                     94: /*
                     95:  * brd is kept for historical reasons.
                     96:  * It should only be used in the routine "which"
                     97:  * to determine the next move for a monster or
                     98:  * in the routine "monster" to determine if it
                     99:  * was a valid move. Admittedly this is redundant
                    100:  * and could be replaced by initbrd, but it is kept
                    101:  * so that someday additional intelligence or
                    102:  * optimization could be added to the choice of
                    103:  * the monster's next move. Hence, note the symbol
                    104:  * CHOICE at most points that a move decision
                    105:  * logically HAS to be made.
                    106:  */
                    107: char   brd[BRDY][BRDX] =
                    108: {
                    109: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
                    110: "O + + + * + + + + OOO + + + + * + + + O",
                    111: "O X OOO + OOOOO + OOO + OOOOO + OOO X O",
                    112: "O * + + * + * + * + + * + * + * + + * O",
                    113: "O + OOO + O + OOOOOOOOOOO + O + OOO + O",
                    114: "O + + + * O + + + OOO + + + O * + + + O",
                    115: "OOOOOOO + OOOOO + OOO + OOOOO + OOOOOOO",
                    116: "      O + O + + * + + * + + O + O      ",
                    117: "      O + O + OOO - - OOO + O + O      ",
                    118: "OOOOOOO + O + O         O + O + OOOOOOO",
                    119: "        * + * O         O * + *        ",
                    120: "OOOOOOO + O + O         O + O + OOOOOOO",
                    121: "      O + O + OOOOOOOOOOO + O + O      ",
                    122: "      O + O * + + + + + + * O + O      ",
                    123: "OOOOOOO + O + OOOOOOOOOOO + O + OOOOOOO",
                    124: "O + + + * + * + + OOO + + * + * + + + O",
                    125: "O X OOO + OOOOO + OOO + OOOOO + OOO X O",
                    126: "O + + O * + * + * + + * + * + * O + + O",
                    127: "OOO + O + O + OOOOOOOOOOO + O + O + OOO",
                    128: "O + * + + O + + + OOO + + + O + + * + O",
                    129: "O + OOOOOOOOOOO + OOO + OOOOOOOOOOO + O",
                    130: "O + + + + + + + * + + * + + + + + + + O",
                    131: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
                    132: };
                    133: 
                    134: /*
                    135:  * display reflects the screen on the player's
                    136:  * terminal at any point in time.
                    137:  */
                    138: char   display[BRDY][BRDX] =
                    139: {
                    140: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
                    141: "O + + + + + + + + OOO + + + + + + + + O",
                    142: "O X OOO + OOOOO + OOO + OOOOO + OOO X O",
                    143: "O + + + + + + + + + + + + + + + + + + O",
                    144: "O + OOO + O + OOOOOOOOOOO + O + OOO + O",
                    145: "O + + + + O + + + OOO + + + O + + + + O",
                    146: "OOOOOOO + OOOOO + OOO + OOOOO + OOOOOOO",
                    147: "      O + O + + + + + + + + O + O      ",
                    148: "      O + O + OOO - - OOO + O + O      ",
                    149: "OOOOOOO + O + O         O + O + OOOOOOO",
                    150: "        + + + O         O + + +        ",
                    151: "OOOOOOO + O + O         O + O + OOOOOOO",
                    152: "      O + O + OOOOOOOOOOO + O + O      ",
                    153: "      O + O + + + + + + + + O + O      ",
                    154: "OOOOOOO + O + OOOOOOOOOOO + O + OOOOOOO",
                    155: "O + + + + + + + + OOO + + + + + + + + O",
                    156: "O X OOO + OOOOO + OOO + OOOOO + OOO X O",
                    157: "O + + O + + + + + + + + + + + + O + + O",
                    158: "OOO + O + O + OOOOOOOOOOO + O + O + OOO",
                    159: "O + + + + O + + + OOO + + + O + + + + O",
                    160: "O + OOOOOOOOOOO + OOO + OOOOOOOOOOO + O",
                    161: "O + + + + + + + + + + + + + + + + + + O",
                    162: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
                    163: };
                    164: 
                    165: /* terminal type from environment and /etc/termcap ala ex & vi */
                    166: char    *vs_cl  = "",           /* clear screen sequence */
                    167:        *vs_cm  = "",           /* cursor positioning sequence */
                    168:        *vs_vb  = "";
                    169: 
                    170: char   combuf[BUFSIZ],
                    171:        message[81],    /* temporary message buffer */
                    172:        inbuf[2];
                    173: 
                    174: int    ppid,
                    175:        cpid,
                    176:        game,
                    177:        killcnt = 0,
                    178:        vs_rows,
                    179:        vs_cols;
                    180: 
                    181: unsigned
                    182:        pscore;
                    183: 
                    184: long   timein;
                    185: 
                    186: #ifdef BELL3.0
                    187: struct termio
                    188:        savetty,
                    189:        newtty;
                    190: #else
                    191: struct sgttyb
                    192:        savetty, newtty;
                    193: #endif
                    194: 
                    195: struct uscore
                    196: {
                    197:        unsigned score; /* same type as pscore */
                    198:        int uid;        /* uid of player */
                    199: };
                    200: 
                    201: struct scorebrd
                    202: {
                    203:        struct uscore entry[MSSAVE];
                    204: } scoresave[MGTYPE] = 
                    205:        {
                    206:                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    207:                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    208:                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    209:                0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                    210:        };
                    211: 
                    212: update()
                    213: {
                    214:        char    str[10];
                    215: 
                    216:        (void) sprintf(str, "%6d", pscore);
                    217:        SPLOT(0, 52, str);
                    218:        (void) sprintf(str, "%6d", goldcnt);
                    219:        SPLOT(21, 57, str);
                    220: }
                    221: 
                    222: reinit()
                    223: {
                    224:        register int locx, locy;
                    225:        register char tmp;
                    226: 
                    227:        for (locy = 0; locy < BRDY; locy++)
                    228:        {
                    229:                for (locx = 0; locx < BRDX; locx++)
                    230:                {
                    231:                        tmp = initbrd[locy][locx];
                    232:                        brd[locy][locx] = tmp;
                    233:                        if ((display[locy][locx] = tmp) == CHOICE)
                    234:                        {
                    235:                                display[locy][locx] = GOLD;
                    236:                        };
                    237:                };
                    238:        };
                    239:        goldcnt = GOLDCNT;
                    240:        delay -= (delay / 10);  /* hot it up */
                    241: }
                    242: 
                    243: errgen(string)
                    244: char   *string;
                    245: {
                    246:        SPLOT(23,45,string);
                    247: }
                    248: 
                    249: dokill(mnum)
                    250:        int mnum;
                    251: {
                    252:        register struct pac *mptr;
                    253: 
                    254:        PLOT(0, 0, BEEP);
                    255:        if (pacptr->danger == TRUE)
                    256:        {
                    257:                if (++killcnt == MAXMONSTER)
                    258:                {
                    259:                        if (display[TRYPOS][TRXPOS] == GOLD)
                    260:                        {
                    261:                                goldcnt--;
                    262:                        };
                    263:                        display[TRYPOS][TRXPOS] = TREASURE;
                    264:                        PLOT(TRYPOS, TRXPOS, TREASURE);
                    265:                        killcnt = 0;
                    266:                };
                    267:                SPLOT(5, 45, "MONSTERS KILLED: ");
                    268:                (void) sprintf(message, "%1d", killcnt);
                    269:                SPLOT(5, 62, message);
                    270:                mptr = (&monst[mnum]);
                    271:                mptr->ypos = MSTARTY;
                    272:                mptr->xpos = MSTARTX + (2 * mnum);
                    273:                mptr->stat = START;
                    274:                PLOT(mptr->ypos, mptr->xpos, MONSTER);
                    275:                pscore += KILLSCORE;
                    276:                return(GOTONE);
                    277:        };
                    278:        return(TURKEY);
                    279: }
                    280: 
                    281: /*
                    282: /* clr -- issues an escape sequence to clear the display
                    283: */
                    284: 
                    285: clr()
                    286: {
                    287:        (void) fprintf(stdout, "%s", vs_cl);
                    288:        fflush(stdout);
                    289:        nap(2);
                    290: }
                    291: 
                    292: /*
                    293:  *     display initial instructions
                    294:  */
                    295: 
                    296: instruct()
                    297: {
                    298:        clr();
                    299:        POS(0, 0);
                    300:        (void) fprintf(stdout, "Attention: you are in a dungeon, being chased by monsters!\r\n\n");
                    301:        (void) fprintf(stdout, "There are gold coins scattered uniformly in the dungeon, marked by \"+\".\r\n");
                    302:        (void) fprintf(stdout, "One magic potion is available at each spot marked \"X\". Each potion will\r\n");
                    303:        (void) fprintf(stdout, "enable you to kill monsters by touch for a limited duration. It will also\r\n");
                    304:        (void) fprintf(stdout, "scare them away. When you kill a monster it is regenerated, but this takes\r\n");
                    305:        (void) fprintf(stdout, "time. You can also regenerate yourself %d times. Killing all the monsters\r\n", MAXPAC);
                    306:        (void) fprintf(stdout, "results in further treasure appearing magically somewhere in the dungeon,\r\n");
                    307:        (void) fprintf(stdout, "marked by \"$\". There is a magic tunnel connecting the center left and\r\n");
                    308:        (void) fprintf(stdout, "center right parts of the dungeon. The monsters know about it!\r\n\n");
                    309:        (void) fprintf(stdout, "        Type:   h       to move left\r\n");
                    310:        (void) fprintf(stdout, "                l       to move right\r\n");
                    311:        (void) fprintf(stdout, "                k or w  to move up\r\n");
                    312:        (void) fprintf(stdout, "                j or x  to move down\r\n");
                    313:        (void) fprintf(stdout, "                <space> to halt \r\n");
                    314:        (void) fprintf(stdout, "                q       to quit\r\n\n");
                    315:        (void) fprintf(stdout, "        Type:   1       normal game\r\n");
                    316:        (void) fprintf(stdout, "                2       blinking monsters\r\n");
                    317:        (void) fprintf(stdout, "                3       intelligent monsters\r\n");
                    318:        (void) fprintf(stdout, "                4       blinking intelligent monsters\r\n");
                    319: }
                    320: 
                    321: /*
                    322:  * over -- game over processing
                    323:  */
                    324: 
                    325: over()
                    326: {
                    327:        register int i;
                    328:        register int line;
                    329:        int scorefile = 0;
                    330:        struct passwd *getpwuid(), *p;
                    331: 
                    332:        fflush(stdout);
                    333:        sleep(5);       /* for slow readers */
                    334:        poll(0);        /* flush and discard input from player */
                    335:        clr();
                    336:        /* high score to date processing */
                    337:        if (game != 0)
                    338:        {
                    339:                line = 7;
                    340:                POS(line++, 20);
                    341:                (void) fprintf(stdout, " ___________________________ ");
                    342:                POS(line++, 20);
                    343:                (void) fprintf(stdout, "|                           |");
                    344:                POS(line++, 20);
                    345:                (void) fprintf(stdout, "| G A M E   O V E R         |");
                    346:                POS(line++, 20);
                    347:                (void) fprintf(stdout, "|                           |");
                    348:                POS(line++, 20);
                    349:                (void) fprintf(stdout, "| Game type: %1d              |",game);
                    350:                if ((scorefile = open(MAXSCORE, O_RDWR | O_CREAT, 0666)) != -1)
                    351:                {
                    352:                        read(scorefile, (char *)scoresave, sizeof(scoresave));
                    353:                        for (i = MSSAVE - 1; i >= 0; i--) {
                    354:                                if (scoresave[game - 1].entry[i].score < pscore)
                    355:                                {
                    356:                                        if (i < MSSAVE - 1)
                    357:                                        {
                    358:                                                scoresave[game - 1].entry[i + 1].score =
                    359:                                                        scoresave[game - 1].entry[i].score;
                    360:                                                scoresave[game - 1].entry[i + 1].uid =
                    361:                                                        scoresave[game - 1].entry[i].uid;
                    362:                                        };
                    363:                                        scoresave[game - 1].entry[i].score = pscore;
                    364:                                        scoresave[game - 1].entry[i].uid = getuid();
                    365:                                };
                    366:                        };
                    367:                        lseek(scorefile, 0l, 0);
                    368:                        write(scorefile, (char *)scoresave, sizeof(scoresave));
                    369:                        close(scorefile);
                    370:                        POS(line++, 20);
                    371:                        (void) fprintf(stdout, "| High Scores to date:      |");
                    372:                        for (i = 0; i < MSSAVE; i++)
                    373:                        {
                    374:                                setpwent();
                    375:                                p = getpwuid(scoresave[game - 1].entry[i].uid);
                    376:                                POS(line++, 20);
                    377:                                (void) fprintf(stdout, "| Player : %-8s  %5u  |", p->pw_name,
                    378:                                        scoresave[game - 1].entry[i].score);
                    379:                        };
                    380:                }
                    381:                else
                    382:                {
                    383:                        POS(line++, 20);
                    384:                        (void) fprintf(stdout, "|                           |");
                    385:                        POS(line++, 20);
                    386:                        (void) fprintf(stdout, "| Please create a 'paclog'  |");
                    387:                        POS(line++, 20);
                    388:                        (void) fprintf(stdout, "| file. See 'MAXSCORE' in   |");
                    389:                        POS(line++, 20);
                    390:                        (void) fprintf(stdout, "| 'pacdefs.h'.              |");
                    391:                };
                    392:                POS(line++, 20);
                    393:                (void) fprintf(stdout, "|                           |");
                    394:                POS(line++, 20);
                    395:                (void) fprintf(stdout, "| Your score: %-5u         |", pscore);
                    396:                POS(line, 20);
                    397:                (void) fprintf(stdout, "|___________________________|");
                    398:        };
                    399:        leave();
                    400: }
                    401: 
                    402: /*
                    403:  * leave -- flush buffers,kill the Child, reset tty, and delete tempfile
                    404:  */
                    405: 
                    406: leave()
                    407: {
                    408:        POS(23, 0);
                    409:        (void) fflush(stdout);
                    410:        sleep(1);
                    411: 
                    412: #ifndef NODELAY
                    413:        kill(cpid, SIGKILL);
                    414: #endif
                    415: 
                    416: #ifdef BELL3.0
                    417:        ioctl(0, TCSETAW, &savetty);
                    418: #else
                    419:        ioctl(0, TIOCSETP, &savetty);
                    420: #endif
                    421: 
                    422: #ifndef NODELAY
                    423: 
                    424: #ifndef MSG
                    425:        close(comfile);
                    426:        unlink(fnam);
                    427: #endif
                    428: 
                    429: #endif
                    430:        exit(0);
                    431: }
                    432: 
                    433: /*
                    434:  * init -- does global initialization and spawns a child process to read
                    435:  *      the input terminal.
                    436:  */
                    437: 
                    438: init()
                    439: {
                    440:        register int tries = 0;
                    441:        static int lastchar = DELETE;
                    442:        extern short ospeed;            /* baud rate for crt (for tputs()) */
                    443: 
                    444:        errno = 0;
                    445:        (void) time(&timein);   /* get start time */
                    446:        srand((unsigned)timein);        /* start rand randomly */
                    447:        /*
                    448:         * verify CRT and get proper cursor control sequence.
                    449:         */
                    450: 
                    451: #ifdef NODELAY
                    452: 
                    453: #ifndef BELL3.0
                    454:        close(0);
                    455:        if (open("/dev/tty", O_RDONLY | O_NDELAY) != 0)
                    456:        {
                    457:                perror("Unable to open /dev/tty");
                    458:                exit(1);
                    459:        };
                    460: #endif
                    461: 
                    462: #endif
                    463:        vsinit();
                    464:        /*
                    465:         * setup raw mode, no echo
                    466:         */
                    467: #ifdef BELL3.0
                    468:        ioctl(0, TCGETA, &savetty);
                    469:        newtty = savetty;
                    470:        if ((savetty.c_cflag & CBAUD) == B9600)
                    471:        {
                    472:                delay = 1000 * (nrand(10) + 5);
                    473:        }
                    474:        else
                    475:        {
                    476:                delay = 1000;
                    477:        };
                    478:        ospeed = savetty.c_cflag & CBAUD;       /* for tputs() */
                    479: #ifdef NODELAY
                    480:        newtty.c_cc[VTIME] = 7;
                    481:        newtty.c_cc[VMIN] = 0;
                    482: #else
                    483:        newtty.c_cc[VMIN] = 1;
                    484: #endif
                    485:        newtty.c_iflag = 0;
                    486:        newtty.c_oflag &= ~OPOST;
                    487:        newtty.c_cflag &= ~(PARENB | CSIZE);
                    488:        newtty.c_cflag |= CS8;
                    489:        newtty.c_lflag &= ~(ECHO | ECHOE | ISIG | ICANON | XCASE);
                    490:        ioctl(0, TCSETAW, &newtty);
                    491: #else
                    492:        ioctl(0, TIOCGETP, &savetty);
                    493:        newtty = savetty;
                    494:        if (savetty.sg_ospeed >= B9600)
                    495:                delay = 1000 * (nrand(10) + 5);
                    496:        else
                    497:                delay = 1000;
                    498:        ospeed = savetty.sg_ospeed;             /* for tputs() */
                    499:        newtty.sg_flags |= CBREAK;
                    500:        newtty.sg_flags &= ~ECHO;
                    501:        ioctl(0, TIOCSETP, &newtty);
                    502: #endif
                    503: 
                    504:        /*
                    505:         * set up communications
                    506:         */
                    507: 
                    508: #ifndef NODELAY
                    509: 
                    510: #ifndef MSG
                    511:        fnam = mktemp(TMPF);
                    512:        if ((comfile = creat(fnam, 0666)) == -1)
                    513:        {
                    514:                (void) sprintf(message, "Cannot create %s", fnam);
                    515:                perror(message);
                    516:                leave();
                    517:        };
                    518:        /*
                    519:         * initialize semaphore
                    520:         */
                    521:        lseek(comfile, 0l, 0);
                    522:        combuf[1] = EMPTY;
                    523:        write(comfile, combuf, 2);
                    524:        close(comfile);
                    525: #endif
                    526: #endif
                    527: 
                    528: #ifndef NODELAY
                    529:        /*
                    530:         * fork off a child to read the input
                    531:         */
                    532:        ppid = getpid();
                    533:        if ((cpid = fork()) == 0)
                    534:        {
                    535: #ifndef MSG
                    536:                comfile = open(fnam, O_RDWR);
                    537: #endif
                    538:                for (;;)
                    539:                {
                    540:                        read(0, inbuf, 1);
                    541:                        if (lastchar != inbuf[0])
                    542:                        {
                    543: #ifdef MSG
                    544:                                if (inbuf[0] == DELETE || inbuf[0] == ABORT)
                    545:                                        leave();
                    546:                                send(inbuf, 1, ppid, 64);
                    547: #else
                    548:                                lseek(comfile, 0l, 0);
                    549:                                read(comfile, combuf, 2);
                    550:                                if (combuf[1] == EMPTY)
                    551:                                {
                    552:                                        lseek(comfile, 0l, 0);
                    553:                                        combuf[0] = inbuf[0];
                    554:                                        combuf[1] = FULL;
                    555:                                        write(comfile, combuf, 2);
                    556:                                };
                    557: #endif
                    558:                        };
                    559:                        lastchar = DELETE;
                    560:                };
                    561:        };
                    562: 
                    563: #ifndef MSG
                    564:        comfile = open(fnam, O_RDWR);
                    565: #else
                    566:        msgenab();
                    567: #endif
                    568: 
                    569: #endif
                    570:        /*
                    571:         * New game starts here
                    572:         */
                    573:        game = 0;
                    574:        instruct();
                    575:        while ((game == 0) && (tries++ < 300))
                    576:        {
                    577:                poll(1);
                    578:        };
                    579:        if (tries >= 300)
                    580:        {
                    581:                /* I give up. Let's call it quits. */
                    582:                leave();
                    583:        };
                    584:        goldcnt = GOLDCNT;
                    585:        pscore = 0;
                    586:        clr();
                    587: }
                    588: 
                    589: /*
                    590:  * poll -- read characters sent by input subprocess and set global flags
                    591:  */
                    592: 
                    593: poll(sltime)
                    594: {
                    595:        int stop;
                    596:        register int charcnt;
                    597:        int junk;
                    598: 
                    599: #ifndef NODELAY
                    600: #ifdef MSG
                    601:        struct mstruct msghead;
                    602: #endif
                    603: #endif
                    604: 
                    605:        stop = 0;
                    606: readin:
                    607: 
                    608: #ifdef NODELAY
                    609:        fflush(stdout);
                    610:        charcnt = 0;
                    611:        nap(12);
                    612: #ifndef BELL3.0
                    613:        ioctl(0, FIONREAD, &junk);
                    614:        if (junk)
                    615: #endif
                    616:                charcnt = read(0, combuf, 1);
                    617:        switch (charcnt)
                    618:        {
                    619: 
                    620:        case 0:
                    621:                combuf[1] = EMPTY;
                    622:                break;
                    623: 
                    624:        case -1:
                    625:                errgen("READ ERROR IN POLL");
                    626:                abort();
                    627: 
                    628:        default:
                    629:                combuf[0] = combuf[charcnt-1];
                    630:                combuf[1] = FULL;
                    631:                break;
                    632:        };
                    633: #else
                    634: 
                    635: #ifdef MSG
                    636:        combuf[1] = (recv(combuf, 1, &msghead, 0) == -1) ? EMPTY : FULL;
                    637: #else
                    638:        lseek(comfile, 0l, 0);  /* rewind */
                    639:        read(comfile, combuf, 2);       /* read 2 chars */
                    640: #endif
                    641: 
                    642: #endif
                    643:        if (combuf[1] == EMPTY) 
                    644:        {
                    645: #ifndef BELL3.0
                    646: 
                    647: #ifndef NODELAY
                    648:                if (sltime > 0)
                    649:                {
                    650:                        sleep(sltime);
                    651:                };
                    652: #endif
                    653: 
                    654: #endif
                    655:                if (stop)
                    656:                {
                    657:                        goto readin;
                    658:                };
                    659:                return;
                    660:        };
                    661:        combuf[1] = EMPTY;
                    662: 
                    663: #ifndef NODELAY
                    664: 
                    665: #ifndef MSG
                    666:        lseek(comfile, 0l, 0);  /* another rewind */
                    667:        write(comfile, combuf, 2);
                    668: #endif
                    669: #endif
                    670: 
                    671:        switch(combuf[0] & 0177)
                    672:        {
                    673:        case LEFT:
                    674:                pacptr->dirn = DLEFT;
                    675:                break;
                    676: 
                    677:        case RIGHT:
                    678:                pacptr->dirn = DRIGHT;
                    679:                break;
                    680: 
                    681:        case NORTH:
                    682:        case NNORTH:
                    683:                pacptr->dirn = DUP;
                    684:                break;
                    685: 
                    686:        case DOWN:
                    687:        case NDOWN:
                    688:                pacptr->dirn = DDOWN;
                    689:                break;
                    690: 
                    691:        case HALT:
                    692:                pacptr->dirn = DNULL;
                    693:                break;
                    694: 
                    695:        case ABORT:
                    696:        case DELETE:
                    697:        case QUIT:
                    698:                over();
                    699:                break;
                    700: 
                    701:        case CNTLS:
                    702:                stop = 1;
                    703:                goto readin;
                    704: 
                    705:        case GAME1:
                    706:                game = 1;
                    707:                break;
                    708: 
                    709:        case GAME2:
                    710:                game = 2;
                    711:                break;
                    712: 
                    713:        case GAME3:
                    714:                game = 3;
                    715:                break;
                    716: 
                    717:        case GAME4:
                    718:                game = 4;
                    719:                break;
                    720: 
                    721:        default:
                    722:                goto readin;
                    723:        }
                    724: }
                    725: 
                    726: vsinit()
                    727: {
                    728:        char buf[1024];
                    729:        char tspace[256], *aoftspace;
                    730:        char *tgetstr();
                    731:        extern char *UP, *BC;   /* defined in tgoto.c (from ex's termlib */
                    732:        extern char PC;         /* defined in tputs.c (from termlib) */
                    733: 
                    734:        tgetent(buf, getenv("TERM"));
                    735:        aoftspace = tspace;
                    736:        vs_cl = tgetstr("cl", &aoftspace);
                    737:        vs_cm = tgetstr("cm", &aoftspace);
                    738:        BC = tgetstr("bc", &aoftspace);
                    739:        UP = tgetstr("up", &aoftspace);
                    740:        PC = *tgetstr("pc", &aoftspace);
                    741:        vs_vb = tgetstr("vb", &aoftspace);
                    742:        vs_rows = tgetnum("li");
                    743:        vs_cols = tgetnum("co");
                    744:        if ((vs_vb == 0) || (*vs_vb == '\0'))
                    745:        {
                    746:                vs_vb = aoftspace;
                    747:                *vs_vb++ = '';
                    748:                *vs_vb++ = '\0';
                    749:                aoftspace += 2;
                    750:        };
                    751:        if ((vs_cl == 0) || (*vs_cl == '\0') ||
                    752:                (vs_cm == 0) || (*vs_cm == '\0'))
                    753:        {
                    754:                (void) fprintf(stderr, "\nPacman is designed for CRT's with addressable cursors.\n");
                    755:                (void) fprintf(stderr, "Verify that the TERM environment variable is a proper\n");
                    756:                (void) fprintf(stderr, "type and is export-ed, and try it again...\n\n");
                    757:                exit(2);
                    758:        };
                    759: }
                    760: 
                    761: /* dfp - real function for tputs function to use */
                    762: putch( ch )
                    763:        register int ch;
                    764: {
                    765:        putchar( ch );
                    766: }

unix.superglobalmegacorp.com

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