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