]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - robots/main.c
We don't need a private #define "unsgn" for "unsigned", especially since
[bsdgames-darwin.git] / robots / main.c
index 47a113a266d76ecbf08fff854ec4276b677e8d72..98e2ff29a210bfa15267ba0f55ddc958fa0d6d05 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: main.c,v 1.5 1995/04/22 10:08:54 cgd Exp $     */
+/*     $NetBSD: main.c,v 1.24 2008/08/08 16:10:47 drochner Exp $       */
 
 /*
  * Copyright (c) 1980, 1993
  * 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
-static char copyright[] =
-"@(#) Copyright (c) 1980, 1993\n\
-       The Regents of the University of California.  All rights reserved.\n";
+__COPYRIGHT("@(#) Copyright (c) 1980, 1993\
+ The Regents of the University of California.  All rights reserved.");
 #endif /* not lint */
 
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)main.c     8.1 (Berkeley) 5/31/93";
 #else
-static char rcsid[] = "$NetBSD: main.c,v 1.5 1995/04/22 10:08:54 cgd Exp $";
+__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)
@@ -88,6 +100,9 @@ char **av;
                        else
                                for (sp = &av[0][1]; *sp; sp++)
                                        switch (*sp) {
+                                         case 'A':
+                                               Auto_bot = TRUE;
+                                               break;
                                          case 's':
                                                show_only = TRUE;
                                                break;
@@ -97,14 +112,18 @@ char       **av;
                                          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;
                                        }
@@ -120,9 +139,17 @@ char       **av;
                /* 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) {
@@ -140,24 +167,29 @@ char      **av;
        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();
-}
-
-void
-__cputchar(ch)
-       int ch;
-{
-       (void)putchar(ch);
+               Num_games = 1;
+       } while (!Auto_bot && another());
+       quit(0);
+       /* NOTREACHED */
+       return(0);
 }
 
 /*
@@ -165,7 +197,8 @@ __cputchar(ch)
  *     Leave the program elegantly.
  */
 void
-quit()
+quit(dummy)
+       int dummy __unused;
 {
        endwin();
        exit(0);
@@ -176,9 +209,10 @@ quit()
  * another:
  *     See if another game is desired
  */
+bool
 another()
 {
-       register int    y;
+       int     y;
 
 #ifdef FANCY
        if ((Stand_still || Pattern_roll) && !Newscore)