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