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