Annotation of 43BSD/games/backgammon/table.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)table.c    5.1 (Berkeley) 5/29/85";
                      9: #endif not lint
                     10: 
                     11: #include "back.h"
                     12: 
                     13: char   *help2[] = {
                     14:        "   Enter moves as <s>-<f> or <s>/<r> where <s> is the starting",
                     15:        "position, <f> is the finishing position, and <r> is the roll.",
                     16:        "Remember, each die roll must be moved separately.",
                     17:        0
                     18: };
                     19: 
                     20: struct state   {
                     21:        char    ch;
                     22:        int     fcode;
                     23:        int     newst;
                     24: };
                     25: 
                     26: struct state   atmata[] = {
                     27: 
                     28:        'R', 1, 0,      '?', 7, 0,      'Q', 0, -3,     'B', 8, 25,
                     29:        '9', 2, 25,     '8', 2, 25,     '7', 2, 25,     '6', 2, 25,
                     30:        '5', 2, 25,     '4', 2, 25,     '3', 2, 25,     '2', 2, 19,
                     31:        '1', 2, 15,     '0', 2, 25,     '.', 0, 0,      '9', 2, 25,
                     32:        '8', 2, 25,     '7', 2, 25,     '6', 2, 25,     '5', 2, 25,
                     33: 
                     34:        '4', 2, 25,     '3', 2, 25,     '2', 2, 25,     '1', 2, 25,
                     35:        '0', 2, 25,     '/', 0, 32,     '-', 0, 39,     '.', 0, 0,
                     36:        '/', 5, 32,     ' ', 6, 3,      ',', 6, 3,      '\n', 0, -1,
                     37:        '6', 3, 28,     '5', 3, 28,     '4', 3, 28,     '3', 3, 28,
                     38:        '2', 3, 28,     '1', 3, 28,     '.', 0, 0,      'H', 9, 61,
                     39: 
                     40:        '9', 4, 61,     '8', 4, 61,     '7', 4, 61,     '6', 4, 61,
                     41:        '5', 4, 61,     '4', 4, 61,     '3', 4, 61,     '2', 4, 53,
                     42:        '1', 4, 51,     '0', 4, 61,     '.', 0, 0,      '9', 4, 61,
                     43:        '8', 4, 61,     '7', 4, 61,     '6', 4, 61,     '5', 4, 61,
                     44:        '4', 4, 61,     '3', 4, 61,     '2', 4, 61,     '1', 4, 61,
                     45: 
                     46:        '0', 4, 61,     ' ', 6, 3,      ',', 6, 3,      '-', 5, 39,
                     47:        '\n', 0, -1,    '.', 0, 0
                     48: };
                     49: 
                     50: checkmove (ist)
                     51: 
                     52: int    ist;
                     53: 
                     54: {
                     55:        register int    j, n;
                     56:        register char   c;
                     57:        char            a;
                     58: 
                     59: domove:
                     60:        if (ist == 0)  {
                     61:                if (tflag)
                     62:                        curmove (curr,32);
                     63:                else
                     64:                        writel ("\t\t");
                     65:                writel ("Move:  ");
                     66:        }
                     67:        ist = mvl = ncin = 0;
                     68:        for (j = 0; j < 5; j++)
                     69:                p[j] = g[j] = -1;
                     70: 
                     71: dochar:
                     72:        c = readc();
                     73: 
                     74:        if (c == 'S')  {
                     75:                raflag = 0;
                     76:                save (1);
                     77:                if (tflag)  {
                     78:                        curmove (cturn == -1? 18: 19,39);
                     79:                        ist = -1;
                     80:                        goto domove;
                     81:                } else  {
                     82:                        proll ();
                     83:                        ist = 0;
                     84:                        goto domove;
                     85:                }
                     86:        }
                     87: 
                     88:        if (c == tty.sg_erase && ncin > 0)  {
                     89:                if (tflag)
                     90:                        curmove (curr,curc-1);
                     91:                else  {
                     92:                        if (tty.sg_erase == '\010')
                     93:                                writel ("\010 \010");
                     94:                        else
                     95:                                writec (cin[ncin-1]);
                     96:                }
                     97:                ncin--;
                     98:                n = rsetbrd();
                     99:                if (n == 0)  {
                    100:                        n = -1;
                    101:                        if (tflag)
                    102:                                refresh();
                    103:                }
                    104:                if ((ist = n) > 0)
                    105:                        goto dochar;
                    106:                goto domove;
                    107:        }
                    108: 
                    109:        if (c == tty.sg_kill && ncin > 0)  {
                    110:                if (tflag)  {
                    111:                        refresh();
                    112:                        curmove (curr,39);
                    113:                        ist = -1;
                    114:                        goto domove;
                    115:                } else  if (tty.sg_erase == '\010')  {
                    116:                        for (j = 0; j < ncin; j++)
                    117:                                writel ("\010 \010");
                    118:                        ist = -1;
                    119:                        goto domove;
                    120:                } else  {
                    121:                        writec ('\\');
                    122:                        writec ('\n');
                    123:                        proll ();
                    124:                        ist = 0;
                    125:                        goto domove;
                    126:                }
                    127:        }
                    128: 
                    129:        n = dotable(c,ist);
                    130:        if (n >= 0)  {
                    131:                cin[ncin++] = c;
                    132:                if (n > 2)
                    133:                if ((! tflag) || c != '\n')
                    134:                        writec (c);
                    135:                ist = n;
                    136:                if (n)
                    137:                        goto dochar;
                    138:                else
                    139:                        goto domove;
                    140:        }
                    141: 
                    142:        if (n == -1 && mvl >= mvlim)
                    143:                return(0);
                    144:        if (n == -1 && mvl < mvlim-1)
                    145:                return(-4);
                    146: 
                    147:        if (n == -6)  {
                    148:                if (! tflag)  {
                    149:                        if (movokay(mvl+1))  {
                    150:                                wrboard();
                    151:                                movback (mvl+1);
                    152:                        }
                    153:                        proll ();
                    154:                        writel ("\t\tMove:  ");
                    155:                        for (j = 0; j < ncin;)
                    156:                                writec (cin[j++]);
                    157:                } else  {
                    158:                        if (movokay(mvl+1))  {
                    159:                                refresh();
                    160:                                movback (mvl+1);
                    161:                        } else
                    162:                                curmove (cturn == -1? 18:19,ncin+39);
                    163:                }
                    164:                ist = n = rsetbrd();
                    165:                goto dochar;
                    166:        }
                    167: 
                    168:        if (n != -5)
                    169:                return(n);
                    170:        writec ('\007');
                    171:        goto dochar;
                    172: }
                    173: 
                    174: dotable (c,i)
                    175: char           c;
                    176: register int   i;
                    177: 
                    178: {
                    179:        register int    a, j;
                    180:        int             test;
                    181: 
                    182:        test = (c == 'R');
                    183: 
                    184:        while ( (a = atmata[i].ch) != '.')  {
                    185:                if (a == c || (test && a == '\n'))  {
                    186:                        switch  (atmata[i].fcode)  {
                    187: 
                    188:                        case 1:
                    189:                                wrboard();
                    190:                                if (tflag)  {
                    191:                                        curmove (cturn == -1? 18: 19,0);
                    192:                                        proll ();
                    193:                                        writel ("\t\t");
                    194:                                } else
                    195:                                        proll ();
                    196:                                break;
                    197: 
                    198:                        case 2:
                    199:                                if (p[mvl] == -1)
                    200:                                        p[mvl] = c-'0';
                    201:                                else
                    202:                                        p[mvl] = p[mvl]*10+c-'0';
                    203:                                break;
                    204: 
                    205:                        case 3:
                    206:                                if (g[mvl] != -1)  {
                    207:                                        if (mvl < mvlim)
                    208:                                                mvl++;
                    209:                                        p[mvl] = p[mvl-1];
                    210:                                }
                    211:                                g[mvl] = p[mvl]+cturn*(c-'0');
                    212:                                if (g[mvl] < 0)
                    213:                                        g[mvl] = 0;
                    214:                                if (g[mvl] > 25)
                    215:                                        g[mvl] = 25;
                    216:                                break;
                    217: 
                    218:                        case 4:
                    219:                                if (g[mvl] == -1)
                    220:                                        g[mvl] = c-'0';
                    221:                                else
                    222:                                        g[mvl] = g[mvl]*10+c-'0';
                    223:                                break;
                    224: 
                    225:                        case 5:
                    226:                                if (mvl < mvlim)
                    227:                                        mvl++;
                    228:                                p[mvl] = g[mvl-1];
                    229:                                break;
                    230: 
                    231:                        case 6:
                    232:                                if (mvl < mvlim)
                    233:                                        mvl++;
                    234:                                break;
                    235: 
                    236:                        case 7:
                    237:                                if (tflag)
                    238:                                        curmove (20,0);
                    239:                                else
                    240:                                        writec ('\n');
                    241:                                text (help2);
                    242:                                if (tflag)  {
                    243:                                        curmove (cturn == -1? 18: 19,39);
                    244:                                } else  {
                    245:                                        writec ('\n');
                    246:                                        proll();
                    247:                                        writel ("\t\tMove:  ");
                    248:                                }
                    249:                                break;
                    250: 
                    251:                        case 8:
                    252:                                p[mvl] = bar;
                    253:                                break;
                    254: 
                    255:                        case 9:
                    256:                                g[mvl] = home;
                    257:                        }
                    258: 
                    259:                        if (! test || a != '\n')
                    260:                                return (atmata[i].newst);
                    261:                        else
                    262:                                return (-6);
                    263:                }
                    264: 
                    265:                i++;
                    266:        }
                    267: 
                    268:        return (-5);
                    269: }
                    270: 
                    271: rsetbrd ()  {
                    272:        register int    i, j, n;
                    273: 
                    274:        n = 0;
                    275:        mvl = 0;
                    276:        for (i = 0; i < 4; i++)
                    277:                p[i] = g[i] = -1;
                    278:        for (j = 0; j < ncin; j++)
                    279:                n = dotable (cin[j],n);
                    280:        return (n);
                    281: }

unix.superglobalmegacorp.com

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