+/* $NetBSD: teach.c,v 1.23 2012/10/13 19:25:22 dholland Exp $ */
+
/*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1980, 1993
+ * The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
#ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1980 Regents of the University of California.\n\
- All rights reserved.\n";
-#endif /* not lint */
+__COPYRIGHT("@(#) Copyright (c) 1980, 1993\
+ The Regents of the University of California. All rights reserved.");
+#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)teach.c 5.6 (Berkeley) 6/1/90";
-#endif /* not lint */
+#if 0
+static char sccsid[] = "@(#)teach.c 8.1 (Berkeley) 5/31/93";
+#else
+__RCSID("$NetBSD: teach.c,v 1.23 2012/10/13 19:25:22 dholland Exp $");
+#endif
+#endif /* not lint */
#include "back.h"
+#include "tutor.h"
-char *hello[];
-char *list[];
-char *intro1[];
-char *intro2[];
-char *moves[];
-char *remove[];
-char *hits[];
-char *endgame[];
-char *doubl[];
-char *stragy[];
-char *prog[];
-char *lastch[];
-
-extern char ospeed; /* tty output speed for termlib */
-
-char *helpm[] = {
+static const char *const helpm[] = {
"\nEnter a space or newline to roll, or",
" b to display the board",
" d to double",
0
};
-char *contin[] = {
+static const char *const contin[] = {
"",
0
};
-main (argc,argv)
-int argc;
-char **argv;
-
+int
+main(int argc __unused, char *argv[])
{
- register int i;
-
- signal (2,getout);
- if (gtty (0,&tty) == -1) /* get old tty mode */
- errexit ("teachgammon(gtty)");
- old = tty.sg_flags;
-#ifdef V7
- raw = ((noech = old & ~ECHO) | CBREAK); /* set up modes */
-#else
- raw = ((noech = old & ~ECHO) | RAW); /* set up modes */
-#endif
- ospeed = tty.sg_ospeed; /* for termlib */
- tflag = getcaps (getenv ("TERM"));
-#ifdef V7
+ int i;
+ struct move mmstore, *mm;
+
+ /* revoke setgid privileges */
+ setgid(getgid());
+
+ signal(SIGINT, getout);
+ if (tcgetattr(0, &old) == -1) /* get old tty mode */
+ errexit("teachgammon(gtty)");
+ noech = old;
+ noech.c_lflag &= ~ECHO;
+ raw = noech;
+ raw.c_lflag &= ~ICANON; /* set up modes */
+ ospeed = cfgetospeed(&old); /* for termlib */
+ tflag = getcaps(getenv("TERM"));
+
+ /* need this now beceause getarg() may try to load a game */
+ mm = &mmstore;
+ move_init(mm);
while (*++argv != 0)
-#else
- while (*++argv != -1)
-#endif
- getarg (&argv);
- if (tflag) {
- noech &= ~(CRMOD|XTABS);
- raw &= ~(CRMOD|XTABS);
+ getarg(mm, &argv);
+ if (tflag) {
+ noech.c_oflag &= ~(ONLCR | OXTABS);
+ raw.c_oflag &= ~(ONLCR | OXTABS);
clear();
}
- text (hello);
- text (list);
- i = text (contin);
+ wrtext(hello);
+ wrtext(list);
+ i = wrtext(contin);
if (i == 0)
i = 2;
init();
while (i)
- switch (i) {
-
+ switch (i) {
case 1:
leave();
-
+
case 2:
- if (i = text(intro1))
+ if ((i = wrtext(intro1)) != 0)
break;
wrboard();
- if (i = text(intro2))
+ if ((i = wrtext(intro2)) != 0)
break;
-
+
case 3:
- if (i = text(moves))
+ if ((i = wrtext(moves)) != 0)
break;
-
+
case 4:
- if (i = text(remove))
+ if ((i = wrtext(removepiece)) != 0)
break;
-
+
case 5:
- if (i = text(hits))
+ if ((i = wrtext(hits)) != 0)
break;
-
+
case 6:
- if (i = text(endgame))
+ if ((i = wrtext(endgame)) != 0)
break;
-
+
case 7:
- if (i = text(doubl))
+ if ((i = wrtext(doubl)) != 0)
break;
-
+
case 8:
- if (i = text(stragy))
+ if ((i = wrtext(stragy)) != 0)
break;
-
+
case 9:
- if (i = text(prog))
+ if ((i = wrtext(prog)) != 0)
break;
-
+
case 10:
- if (i = text(lastch))
+ if ((i = wrtext(lastch)) != 0)
break;
}
- tutor();
+ tutor(mm);
+ /* NOTREACHED */
+ return (0);
}
-leave() {
+void
+leave(void)
+{
if (tflag)
clear();
else
- writec ('\n');
- fixtty(old);
- execl (EXEC,"backgammon",args,"n",0);
- writel ("Help! Backgammon program is missing\007!!\n");
- exit (-1);
+ writec('\n');
+ fixtty(&old);
+ execl(EXEC, "backgammon", "-n", args[0]?args:0, (char *) 0);
+ writel("Help! Backgammon program is missing\007!!\n");
+ exit(1);
}