+/* $NetBSD: main.c,v 1.33 2020/07/26 15:38:22 nia 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[] = "@(#)main.c 5.5 (Berkeley) 2/28/91";
+#if 0
+static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93";
+#else
+__RCSID("$NetBSD: main.c,v 1.33 2020/07/26 15:38:22 nia Exp $");
+#endif
#endif /* not lint */
-# include "robots.h"
-# include <signal.h>
-# include <ctype.h>
+#include <ctype.h>
+#include <curses.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include "robots.h"
+
+extern const char *Scorefile;
+extern int Max_per_uid;
-main(ac, av)
-int ac;
-char **av;
+static bool another(void);
+
+int
+main(int argc, char **argv)
{
- register char *sp;
- register bool bad_arg;
- register bool show_only;
- extern char *Scorefile;
- extern int Max_per_uid;
- void quit();
-
- show_only = FALSE;
- if (ac > 1) {
- bad_arg = FALSE;
- for (++av; ac > 1 && *av[0]; av++, ac--)
- if (av[0][0] != '-')
- if (isdigit(av[0][0]))
- Max_per_uid = atoi(av[0]);
- else {
- setuid(getuid());
- setgid(getgid());
- Scorefile = av[0];
-# ifdef FANCY
- sp = rindex(Scorefile, '/');
- if (sp == NULL)
- sp = Scorefile;
- if (strcmp(sp, "pattern_roll") == 0)
- Pattern_roll = TRUE;
- else if (strcmp(sp, "stand_still") == 0)
- Stand_still = TRUE;
- if (Pattern_roll || Stand_still)
- Teleport = TRUE;
-# endif
- }
- else
- for (sp = &av[0][1]; *sp; sp++)
- switch (*sp) {
- case 's':
- show_only = TRUE;
- break;
- case 'r':
- Real_time = TRUE;
- break;
- case 'a':
- Start_level = 4;
- break;
- case 'j':
- Jump = TRUE;
- break;
- case 't':
- Teleport = TRUE;
- break;
- default:
- fprintf(stderr, "robots: uknown option: %c\n", *sp);
- bad_arg = TRUE;
- break;
- }
- if (bad_arg) {
- exit(1);
- /* NOTREACHED */
+ const char *word;
+ bool show_only;
+ int score_wfd; /* high score writable file descriptor */
+ int score_err = 0; /* hold errno from score file open */
+ int maximum = 0;
+ int ch, i;
+
+ 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;
+
+ while ((ch = getopt(argc, argv, "Aajnrst")) != -1) {
+ switch (ch) {
+ case 'A':
+ Auto_bot = true;
+ break;
+ case 'a':
+ Start_level = 4;
+ break;
+ case 'j':
+ Jump = true;
+ break;
+ case 'n':
+ Num_games++;
+ break;
+ case 'r':
+ Real_time = true;
+ break;
+ case 's':
+ show_only = true;
+ break;
+ case 't':
+ Teleport = true;
+ break;
+ default:
+ errx(1,
+ "Usage: robots [-Aajnrst] [maximum] [scorefile]");
+ break;
+ }
+ }
+
+ for (i = optind; i < argc; i++) {
+ word = argv[i];
+ if (isdigit((unsigned char)word[0])) {
+ maximum = atoi(word);
+ } else {
+ Scorefile = word;
+ Max_per_uid = maximum;
+ if (score_wfd >= 0)
+ close(score_wfd);
+ score_wfd = open(Scorefile, O_RDWR);
+ if (score_wfd < 0)
+ score_err = errno;
+#ifdef FANCY
+ word = strrchr(Scorefile, '/');
+ if (word == NULL)
+ word = Scorefile;
+ if (strcmp(word, "pattern_roll") == 0)
+ Pattern_roll = true;
+ else if (strcmp(word, "stand_still") == 0)
+ Stand_still = true;
+ if (Pattern_roll || Stand_still)
+ Teleport = true;
+#endif
}
}
/* 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) {
stdscr = newwin(Y_SIZE, X_SIZE, 0, 0);
}
- srand(getpid());
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(int dummy __unused)
{
- extern int _putchar();
-
- mvcur(0, COLS - 1, LINES - 1, 0);
- if (CE) {
- tputs(CE, 1, _putchar);
- endwin();
- }
- else {
- endwin();
- putchar('\n');
- }
+ endwin();
exit(0);
/* NOTREACHED */
}
* another:
* See if another game is desired
*/
-another()
+static bool
+another(void)
{
- register int y;
+ int y;
-#ifdef FANCY
+#ifdef FANCY
if ((Stand_still || Pattern_roll) && !Newscore)
- return TRUE;
+ return true;
#endif
if (query("Another game?")) {
}
refresh();
}
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}