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