+/* $NetBSD: main.c,v 1.24 2008/08/08 16:10:47 drochner 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";
+__COPYRIGHT("@(#) Copyright (c) 1980, 1993\
+ The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#ifndef lint
-/*static char sccsid[] = "from: @(#)main.c 5.5 (Berkeley) 2/28/91";*/
-static char rcsid[] = "$Id: main.c,v 1.3 1993/08/10 02:40:55 mycroft Exp $";
+#if 0
+static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93";
+#else
+__RCSID("$NetBSD: main.c,v 1.24 2008/08/08 16:10:47 drochner Exp $");
+#endif
#endif /* not lint */
# include "robots.h"
-# include <signal.h>
-# include <ctype.h>
+int main(int, char **);
+
+extern const char *Scorefile;
+extern int Max_per_uid;
+
+int
main(ac, av)
-int ac;
-char **av;
+ int ac;
+ char **av;
{
- register char *sp;
- register bool bad_arg;
- register bool show_only;
- extern char *Scorefile;
- extern int Max_per_uid;
- void quit();
+ const char *sp;
+ bool bad_arg;
+ bool show_only;
+ int score_wfd; /* high score writable file descriptor */
+ int score_err = 0; /* hold errno from score file open */
+
+ score_wfd = open(Scorefile, O_RDWR);
+ if (score_wfd < 0)
+ score_err = errno;
+ else if (score_wfd < 3)
+ exit(1);
+
+ /* Revoke setgid privileges */
+ setgid(getgid());
show_only = FALSE;
+ Num_games = 1;
if (ac > 1) {
bad_arg = FALSE;
for (++av; ac > 1 && *av[0]; av++, ac--)
if (av[0][0] != '-')
- if (isdigit(av[0][0]))
+ if (isdigit((unsigned char)av[0][0]))
Max_per_uid = atoi(av[0]);
else {
- setuid(getuid());
- setgid(getgid());
Scorefile = av[0];
+ if (score_wfd >= 0)
+ close(score_wfd);
+ score_wfd = open(Scorefile, O_RDWR);
+ if (score_wfd < 0)
+ score_err = errno;
# ifdef FANCY
- sp = rindex(Scorefile, '/');
+ sp = strrchr(Scorefile, '/');
if (sp == NULL)
sp = Scorefile;
if (strcmp(sp, "pattern_roll") == 0)
else
for (sp = &av[0][1]; *sp; sp++)
switch (*sp) {
+ case 'A':
+ Auto_bot = TRUE;
+ break;
case 's':
show_only = TRUE;
break;
case 'a':
Start_level = 4;
break;
+ case 'n':
+ Num_games++;
+ break;
case 'j':
Jump = TRUE;
break;
case 't':
Teleport = TRUE;
break;
+
default:
- fprintf(stderr, "robots: uknown option: %c\n", *sp);
+ fprintf(stderr, "robots: unknown option: %c\n", *sp);
bad_arg = TRUE;
break;
}
/* NOTREACHED */
}
- initscr();
+ if (score_wfd < 0) {
+ errno = score_err;
+ warn("%s", Scorefile);
+ warnx("High scores will not be recorded!");
+ sleep(2);
+ }
+
+ if (!initscr())
+ errx(0, "couldn't initialize screen");
signal(SIGINT, quit);
- crmode();
+ cbreak();
noecho();
nonl();
if (LINES != Y_SIZE || COLS != X_SIZE) {
if (Real_time)
signal(SIGALRM, move_robots);
do {
- init_field();
- for (Level = Start_level; !Dead; Level++) {
- make_level();
- play_level();
+ while (Num_games--) {
+ init_field();
+ for (Level = Start_level; !Dead; Level++) {
+ make_level();
+ play_level();
+ if (Auto_bot)
+ sleep(1);
+ }
+ move(My_pos.y, My_pos.x);
+ printw("AARRrrgghhhh....");
+ refresh();
+ if (Auto_bot)
+ sleep(1);
+ score(score_wfd);
+ if (Auto_bot)
+ sleep(1);
+ refresh();
}
- move(My_pos.y, My_pos.x);
- printw("AARRrrgghhhh....");
- refresh();
- score();
- } while (another());
- quit();
+ Num_games = 1;
+ } while (!Auto_bot && another());
+ quit(0);
+ /* NOTREACHED */
+ return(0);
}
/*
* Leave the program elegantly.
*/
void
-quit()
+quit(dummy)
+ int dummy __unused;
{
- mvcur(0, COLS - 1, LINES - 1, 0);
- insertln();
- refresh();
endwin();
exit(0);
/* NOTREACHED */
* another:
* See if another game is desired
*/
+bool
another()
{
- register int y;
+ int y;
#ifdef FANCY
if ((Stand_still || Pattern_roll) && !Newscore)