Home | History | Annotate | Line # | Download | only in common_source
table.c revision 1.4
      1  1.4  mycroft /*	$NetBSD: table.c,v 1.4 1995/04/29 00:44:16 mycroft 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.4  mycroft static char rcsid[] = "$NetBSD: table.c,v 1.4 1995/04/29 00:44:16 mycroft 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.4  mycroft 	if (c == old.c_cc[VERASE] && ncin > 0)  {
    122  1.1      cgd 		if (tflag)
    123  1.1      cgd 			curmove (curr,curc-1);
    124  1.1      cgd 		else  {
    125  1.4  mycroft 			if (old.c_cc[VERASE] == '\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.4  mycroft 	if (c == old.c_cc[VKILL] && 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.4  mycroft 		} else  if (old.c_cc[VERASE] == '\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