table.c revision 1.3 1 1.3 cgd /* $NetBSD: table.c,v 1.3 1995/03/21 15:05:58 cgd Exp $ */
2 1.3 cgd
3 1.1 cgd /*
4 1.3 cgd * Copyright (c) 1980, 1993
5 1.3 cgd * The Regents of the University of California. All rights reserved.
6 1.1 cgd *
7 1.1 cgd * Redistribution and use in source and binary forms, with or without
8 1.1 cgd * modification, are permitted provided that the following conditions
9 1.1 cgd * are met:
10 1.1 cgd * 1. Redistributions of source code must retain the above copyright
11 1.1 cgd * notice, this list of conditions and the following disclaimer.
12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 cgd * notice, this list of conditions and the following disclaimer in the
14 1.1 cgd * documentation and/or other materials provided with the distribution.
15 1.1 cgd * 3. All advertising materials mentioning features or use of this software
16 1.1 cgd * must display the following acknowledgement:
17 1.1 cgd * This product includes software developed by the University of
18 1.1 cgd * California, Berkeley and its contributors.
19 1.1 cgd * 4. Neither the name of the University nor the names of its contributors
20 1.1 cgd * may be used to endorse or promote products derived from this software
21 1.1 cgd * without specific prior written permission.
22 1.1 cgd *
23 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 1.1 cgd * SUCH DAMAGE.
34 1.1 cgd */
35 1.1 cgd
36 1.1 cgd #ifndef lint
37 1.3 cgd #if 0
38 1.3 cgd static char sccsid[] = "@(#)table.c 8.1 (Berkeley) 5/31/93";
39 1.3 cgd #else
40 1.3 cgd static char rcsid[] = "$NetBSD: table.c,v 1.3 1995/03/21 15:05:58 cgd Exp $";
41 1.3 cgd #endif
42 1.1 cgd #endif /* not lint */
43 1.1 cgd
44 1.1 cgd #include "back.h"
45 1.1 cgd
46 1.1 cgd char *help2[] = {
47 1.1 cgd " Enter moves as <s>-<f> or <s>/<r> where <s> is the starting",
48 1.1 cgd "position, <f> is the finishing position, and <r> is the roll.",
49 1.1 cgd "Remember, each die roll must be moved separately.",
50 1.1 cgd 0
51 1.1 cgd };
52 1.1 cgd
53 1.1 cgd struct state {
54 1.1 cgd char ch;
55 1.1 cgd int fcode;
56 1.1 cgd int newst;
57 1.1 cgd };
58 1.1 cgd
59 1.1 cgd struct state atmata[] = {
60 1.1 cgd
61 1.1 cgd 'R', 1, 0, '?', 7, 0, 'Q', 0, -3, 'B', 8, 25,
62 1.1 cgd '9', 2, 25, '8', 2, 25, '7', 2, 25, '6', 2, 25,
63 1.1 cgd '5', 2, 25, '4', 2, 25, '3', 2, 25, '2', 2, 19,
64 1.1 cgd '1', 2, 15, '0', 2, 25, '.', 0, 0, '9', 2, 25,
65 1.1 cgd '8', 2, 25, '7', 2, 25, '6', 2, 25, '5', 2, 25,
66 1.1 cgd
67 1.1 cgd '4', 2, 25, '3', 2, 25, '2', 2, 25, '1', 2, 25,
68 1.1 cgd '0', 2, 25, '/', 0, 32, '-', 0, 39, '.', 0, 0,
69 1.1 cgd '/', 5, 32, ' ', 6, 3, ',', 6, 3, '\n', 0, -1,
70 1.1 cgd '6', 3, 28, '5', 3, 28, '4', 3, 28, '3', 3, 28,
71 1.1 cgd '2', 3, 28, '1', 3, 28, '.', 0, 0, 'H', 9, 61,
72 1.1 cgd
73 1.1 cgd '9', 4, 61, '8', 4, 61, '7', 4, 61, '6', 4, 61,
74 1.1 cgd '5', 4, 61, '4', 4, 61, '3', 4, 61, '2', 4, 53,
75 1.1 cgd '1', 4, 51, '0', 4, 61, '.', 0, 0, '9', 4, 61,
76 1.1 cgd '8', 4, 61, '7', 4, 61, '6', 4, 61, '5', 4, 61,
77 1.1 cgd '4', 4, 61, '3', 4, 61, '2', 4, 61, '1', 4, 61,
78 1.1 cgd
79 1.1 cgd '0', 4, 61, ' ', 6, 3, ',', 6, 3, '-', 5, 39,
80 1.1 cgd '\n', 0, -1, '.', 0, 0
81 1.1 cgd };
82 1.1 cgd
83 1.1 cgd checkmove (ist)
84 1.1 cgd
85 1.1 cgd int ist;
86 1.1 cgd
87 1.1 cgd {
88 1.1 cgd register int j, n;
89 1.1 cgd register char c;
90 1.1 cgd char a;
91 1.1 cgd
92 1.1 cgd domove:
93 1.1 cgd if (ist == 0) {
94 1.1 cgd if (tflag)
95 1.1 cgd curmove (curr,32);
96 1.1 cgd else
97 1.1 cgd writel ("\t\t");
98 1.1 cgd writel ("Move: ");
99 1.1 cgd }
100 1.1 cgd ist = mvl = ncin = 0;
101 1.1 cgd for (j = 0; j < 5; j++)
102 1.1 cgd p[j] = g[j] = -1;
103 1.1 cgd
104 1.1 cgd dochar:
105 1.1 cgd c = readc();
106 1.1 cgd
107 1.1 cgd if (c == 'S') {
108 1.1 cgd raflag = 0;
109 1.1 cgd save (1);
110 1.1 cgd if (tflag) {
111 1.1 cgd curmove (cturn == -1? 18: 19,39);
112 1.1 cgd ist = -1;
113 1.1 cgd goto domove;
114 1.1 cgd } else {
115 1.1 cgd proll ();
116 1.1 cgd ist = 0;
117 1.1 cgd goto domove;
118 1.1 cgd }
119 1.1 cgd }
120 1.1 cgd
121 1.1 cgd if (c == tty.sg_erase && ncin > 0) {
122 1.1 cgd if (tflag)
123 1.1 cgd curmove (curr,curc-1);
124 1.1 cgd else {
125 1.1 cgd if (tty.sg_erase == '\010')
126 1.1 cgd writel ("\010 \010");
127 1.1 cgd else
128 1.1 cgd writec (cin[ncin-1]);
129 1.1 cgd }
130 1.1 cgd ncin--;
131 1.1 cgd n = rsetbrd();
132 1.1 cgd if (n == 0) {
133 1.1 cgd n = -1;
134 1.1 cgd if (tflag)
135 1.1 cgd refresh();
136 1.1 cgd }
137 1.1 cgd if ((ist = n) > 0)
138 1.1 cgd goto dochar;
139 1.1 cgd goto domove;
140 1.1 cgd }
141 1.1 cgd
142 1.1 cgd if (c == tty.sg_kill && ncin > 0) {
143 1.1 cgd if (tflag) {
144 1.1 cgd refresh();
145 1.1 cgd curmove (curr,39);
146 1.1 cgd ist = -1;
147 1.1 cgd goto domove;
148 1.1 cgd } else if (tty.sg_erase == '\010') {
149 1.1 cgd for (j = 0; j < ncin; j++)
150 1.1 cgd writel ("\010 \010");
151 1.1 cgd ist = -1;
152 1.1 cgd goto domove;
153 1.1 cgd } else {
154 1.1 cgd writec ('\\');
155 1.1 cgd writec ('\n');
156 1.1 cgd proll ();
157 1.1 cgd ist = 0;
158 1.1 cgd goto domove;
159 1.1 cgd }
160 1.1 cgd }
161 1.1 cgd
162 1.1 cgd n = dotable(c,ist);
163 1.1 cgd if (n >= 0) {
164 1.1 cgd cin[ncin++] = c;
165 1.1 cgd if (n > 2)
166 1.1 cgd if ((! tflag) || c != '\n')
167 1.1 cgd writec (c);
168 1.1 cgd ist = n;
169 1.1 cgd if (n)
170 1.1 cgd goto dochar;
171 1.1 cgd else
172 1.1 cgd goto domove;
173 1.1 cgd }
174 1.1 cgd
175 1.1 cgd if (n == -1 && mvl >= mvlim)
176 1.1 cgd return(0);
177 1.1 cgd if (n == -1 && mvl < mvlim-1)
178 1.1 cgd return(-4);
179 1.1 cgd
180 1.1 cgd if (n == -6) {
181 1.1 cgd if (! tflag) {
182 1.1 cgd if (movokay(mvl+1)) {
183 1.1 cgd wrboard();
184 1.1 cgd movback (mvl+1);
185 1.1 cgd }
186 1.1 cgd proll ();
187 1.1 cgd writel ("\t\tMove: ");
188 1.1 cgd for (j = 0; j < ncin;)
189 1.1 cgd writec (cin[j++]);
190 1.1 cgd } else {
191 1.1 cgd if (movokay(mvl+1)) {
192 1.1 cgd refresh();
193 1.1 cgd movback (mvl+1);
194 1.1 cgd } else
195 1.1 cgd curmove (cturn == -1? 18:19,ncin+39);
196 1.1 cgd }
197 1.1 cgd ist = n = rsetbrd();
198 1.1 cgd goto dochar;
199 1.1 cgd }
200 1.1 cgd
201 1.1 cgd if (n != -5)
202 1.1 cgd return(n);
203 1.1 cgd writec ('\007');
204 1.1 cgd goto dochar;
205 1.1 cgd }
206 1.1 cgd
207 1.1 cgd dotable (c,i)
209 1.1 cgd char c;
210 1.1 cgd register int i;
211 1.1 cgd
212 1.1 cgd {
213 1.1 cgd register int a, j;
214 1.1 cgd int test;
215 1.1 cgd
216 1.1 cgd test = (c == 'R');
217 1.1 cgd
218 1.1 cgd while ( (a = atmata[i].ch) != '.') {
219 1.1 cgd if (a == c || (test && a == '\n')) {
220 1.1 cgd switch (atmata[i].fcode) {
221 1.1 cgd
222 1.1 cgd case 1:
223 1.1 cgd wrboard();
224 1.1 cgd if (tflag) {
225 1.1 cgd curmove (cturn == -1? 18: 19,0);
226 1.1 cgd proll ();
227 1.1 cgd writel ("\t\t");
228 1.1 cgd } else
229 1.1 cgd proll ();
230 1.1 cgd break;
231 1.1 cgd
232 1.1 cgd case 2:
233 1.1 cgd if (p[mvl] == -1)
234 1.1 cgd p[mvl] = c-'0';
235 1.1 cgd else
236 1.1 cgd p[mvl] = p[mvl]*10+c-'0';
237 1.1 cgd break;
238 1.1 cgd
239 1.1 cgd case 3:
240 1.1 cgd if (g[mvl] != -1) {
241 1.1 cgd if (mvl < mvlim)
242 1.1 cgd mvl++;
243 1.1 cgd p[mvl] = p[mvl-1];
244 1.1 cgd }
245 1.1 cgd g[mvl] = p[mvl]+cturn*(c-'0');
246 1.1 cgd if (g[mvl] < 0)
247 1.1 cgd g[mvl] = 0;
248 1.1 cgd if (g[mvl] > 25)
249 1.1 cgd g[mvl] = 25;
250 1.1 cgd break;
251 1.1 cgd
252 1.1 cgd case 4:
253 1.1 cgd if (g[mvl] == -1)
254 1.1 cgd g[mvl] = c-'0';
255 1.1 cgd else
256 1.1 cgd g[mvl] = g[mvl]*10+c-'0';
257 1.1 cgd break;
258 1.1 cgd
259 1.1 cgd case 5:
260 1.1 cgd if (mvl < mvlim)
261 1.1 cgd mvl++;
262 1.1 cgd p[mvl] = g[mvl-1];
263 1.1 cgd break;
264 1.1 cgd
265 1.1 cgd case 6:
266 1.1 cgd if (mvl < mvlim)
267 1.1 cgd mvl++;
268 1.1 cgd break;
269 1.1 cgd
270 1.1 cgd case 7:
271 1.1 cgd if (tflag)
272 1.1 cgd curmove (20,0);
273 1.1 cgd else
274 1.1 cgd writec ('\n');
275 1.1 cgd text (help2);
276 1.1 cgd if (tflag) {
277 1.1 cgd curmove (cturn == -1? 18: 19,39);
278 1.1 cgd } else {
279 1.1 cgd writec ('\n');
280 1.1 cgd proll();
281 1.1 cgd writel ("\t\tMove: ");
282 1.1 cgd }
283 1.1 cgd break;
284 1.1 cgd
285 1.1 cgd case 8:
286 1.1 cgd p[mvl] = bar;
287 1.1 cgd break;
288 1.1 cgd
289 1.1 cgd case 9:
290 1.1 cgd g[mvl] = home;
291 1.1 cgd }
292 1.1 cgd
293 1.1 cgd if (! test || a != '\n')
294 1.1 cgd return (atmata[i].newst);
295 1.1 cgd else
296 1.1 cgd return (-6);
297 1.1 cgd }
298 1.1 cgd
299 1.1 cgd i++;
300 1.1 cgd }
301 1.1 cgd
302 1.1 cgd return (-5);
303 1.1 cgd }
304 1.1 cgd
305 1.1 cgd rsetbrd () {
307 1.1 cgd register int i, j, n;
308 1.1 cgd
309 1.1 cgd n = 0;
310 1.1 cgd mvl = 0;
311 1.1 cgd for (i = 0; i < 4; i++)
312 1.1 cgd p[i] = g[i] = -1;
313 1.1 cgd for (j = 0; j < ncin; j++)
314 1.1 cgd n = dotable (cin[j],n);
315 return (n);
316 }
317