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