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