xref: /netbsd/games/backgammon/teachgammon/teach.c (revision bf9ec67e)
1 /*	$NetBSD: teach.c,v 1.13 2001/04/06 11:13:52 wiz Exp $	*/
2 
3 /*
4  * Copyright (c) 1980, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed by the University of
18  *	California, Berkeley and its contributors.
19  * 4. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include <sys/cdefs.h>
37 #ifndef lint
38 __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
39 	The Regents of the University of California.  All rights reserved.\n");
40 #endif				/* not lint */
41 
42 #ifndef lint
43 #if 0
44 static char sccsid[] = "@(#)teach.c	8.1 (Berkeley) 5/31/93";
45 #else
46 __RCSID("$NetBSD: teach.c,v 1.13 2001/04/06 11:13:52 wiz Exp $");
47 #endif
48 #endif				/* not lint */
49 
50 #include "back.h"
51 #include "tutor.h"
52 
53 const char   *const helpm[] = {
54 	"\nEnter a space or newline to roll, or",
55 	"     b   to display the board",
56 	"     d   to double",
57 	"     q   to quit\n",
58 	0
59 };
60 
61 const char   *const contin[] = {
62 	"",
63 	0
64 };
65 
66 int
67 main(argc, argv)
68 	int     argc;
69 	char   *argv[];
70 {
71 	int     i;
72 
73 	/* revoke setgid privileges */
74 	setgid(getgid());
75 
76 	signal(SIGINT, getout);
77 	if (tcgetattr(0, &old) == -1)	/* get old tty mode */
78 		errexit("teachgammon(gtty)");
79 	noech = old;
80 	noech.c_lflag &= ~ECHO;
81 	raw = noech;
82 	raw.c_lflag &= ~ICANON;	/* set up modes */
83 	ospeed = cfgetospeed(&old);	/* for termlib */
84 	tflag = getcaps(getenv("TERM"));
85 #ifdef V7
86 	while (*++argv != 0)
87 #else
88 	while (*++argv != -1)
89 #endif
90 		getarg(&argv);
91 	if (tflag) {
92 		noech.c_oflag &= ~(ONLCR | OXTABS);
93 		raw.c_oflag &= ~(ONLCR | OXTABS);
94 		clear();
95 	}
96 	text(hello);
97 	text(list);
98 	i = text(contin);
99 	if (i == 0)
100 		i = 2;
101 	init();
102 	while (i)
103 		switch (i) {
104 		case 1:
105 			leave();
106 
107 		case 2:
108 			if ((i = text(intro1)) != 0)
109 				break;
110 			wrboard();
111 			if ((i = text(intro2)) != 0)
112 				break;
113 
114 		case 3:
115 			if ((i = text(moves)) != 0)
116 				break;
117 
118 		case 4:
119 			if ((i = text(removepiece)) != 0)
120 				break;
121 
122 		case 5:
123 			if ((i = text(hits)) != 0)
124 				break;
125 
126 		case 6:
127 			if ((i = text(endgame)) != 0)
128 				break;
129 
130 		case 7:
131 			if ((i = text(doubl)) != 0)
132 				break;
133 
134 		case 8:
135 			if ((i = text(stragy)) != 0)
136 				break;
137 
138 		case 9:
139 			if ((i = text(prog)) != 0)
140 				break;
141 
142 		case 10:
143 			if ((i = text(lastch)) != 0)
144 				break;
145 		}
146 	tutor();
147 	/* NOTREACHED */
148 	return (0);
149 }
150 
151 void
152 leave()
153 {
154 	if (tflag)
155 		clear();
156 	else
157 		writec('\n');
158 	fixtty(&old);
159 	execl(EXEC, "backgammon", "-n", args[0]?args:0, 0);
160 	writel("Help! Backgammon program is missing\007!!\n");
161 	exit(1);
162 }
163