]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - tetris/tetris.c
Add a little color. In order to minimize logic differences, keep 0 as the
[bsdgames-darwin.git] / tetris / tetris.c
index c5569c9b8192157be5d095871210f88fca344f61..9ccaa2f4bb129d84362c05d3a7ab7e6a9d3a120d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: tetris.c,v 1.6 1999/01/03 02:00:18 hubertf Exp $       */
+/*     $NetBSD: tetris.c,v 1.25 2014/06/11 16:47:39 christos Exp $     */
 
 /*-
  * Copyright (c) 1992, 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.
  *
@@ -40,8 +36,8 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\
      The Regents of the University of California.  All rights reserved.\n");
+__COPYRIGHT("@(#) Copyright (c) 1992, 1993\
The Regents of the University of California.  All rights reserved.");
 #endif /* not lint */
 
 /*
@@ -50,6 +46,8 @@ __COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\
 
 #include <sys/time.h>
 
+#include <err.h>
+#include <fcntl.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -61,15 +59,25 @@ __COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\
 #include "screen.h"
 #include "tetris.h"
 
-static void    elide __P((void));
-static void    setup_board __P((void));
-       int     main __P((int, char **));
-       void    onintr __P((int)) __attribute__((__noreturn__));
-       void    usage __P((void)) __attribute__((__noreturn__));
+cell   board[B_SIZE];          /* 1 => occupied, 0 => empty */
 
-struct shape *curshape;
-struct shape *nextshape;
+int    Rows, Cols;             /* current screen size */
 
+static const struct shape *curshape;
+const struct shape *nextshape;
+
+long   fallrate;               /* less than 1 million; smaller => faster */
+
+int    score;                  /* the obvious thing */
+gid_t  gid, egid;
+
+char   key_msg[100];
+int    showpreview;
+
+static void elide(void);
+static void setup_board(void);
+static void onintr(int) __dead;
+static void usage(void) __dead;
 
 /*
  * Set up the initial board.  The bottom display row is completely set,
@@ -77,28 +85,24 @@ struct shape *nextshape;
  * right edges are set.
  */
 static void
-setup_board()
+setup_board(void)
 {
-       register int i;
-       register cell *p;
+       int i;
+       cell *p;
 
        p = board;
        for (i = B_SIZE; i; i--)
-#ifndef mips
-               *p++ = i <= (2 * B_COLS) || (i % B_COLS) < 2;
-#else /* work around compiler bug */
-               *p++ = i <= (2 * B_COLS) || (i % B_COLS) < 2 ? 1 : 0;
-#endif
+               *p++ = (i <= (2 * B_COLS) || (i % B_COLS) < 2) ? 7 : 0;
 }
 
 /*
  * Elide any full active rows.
  */
 static void
-elide()
+elide(void)
 {
-       register int i, j, base;
-       register cell *p;
+       int i, j, base;
+       cell *p;
 
        for (i = A_FIRST; i < A_LAST; i++) {
                base = i * B_COLS + 1;
@@ -120,19 +124,27 @@ elide()
 }
 
 int
-main(argc, argv)
-       int argc;
-       char *argv[];
+main(int argc, char *argv[])
 {
-       register int pos, c;
-       register char *keys;
-       register int level = 2;
+       int pos, c;
+       const char *keys;
+       int level = 2;
        char key_write[6][10];
        int ch, i, j;
+       int fd;
+
+       gid = getgid();
+       egid = getegid();
+       setegid(gid);
+
+       fd = open("/dev/null", O_RDONLY);
+       if (fd < 3)
+               exit(1);
+       close(fd);
 
        keys = "jkl pq";
 
-       while ((ch = getopt(argc, argv, "k:l:s")) != -1)
+       while ((ch = getopt(argc, argv, "k:l:ps")) != -1)
                switch(ch) {
                case 'k':
                        if (strlen(keys = optarg) != 6)
@@ -141,12 +153,13 @@ main(argc, argv)
                case 'l':
                        level = atoi(optarg);
                        if (level < MINLEVEL || level > MAXLEVEL) {
-                               (void)fprintf(stderr,
-                                   "tetris: level must be from %d to %d",
-                                   MINLEVEL, MAXLEVEL);
-                               exit(1);
+                               errx(1, "level must be from %d to %d",
+                                    MINLEVEL, MAXLEVEL);
                        }
                        break;
+               case 'p':
+                       showpreview = 1;
+                       break;
                case 's':
                        showscores(0);
                        exit(0);
@@ -166,10 +179,7 @@ main(argc, argv)
        for (i = 0; i <= 5; i++) {
                for (j = i+1; j <= 5; j++) {
                        if (keys[i] == keys[j]) {
-                               (void)fprintf(stderr,
-                                   "%s: Duplicate command keys specified.\n",
-                                   argv[0]);
-                               exit (1);
+                               errx(1, "duplicate command keys specified.");
                        }
                }
                if (keys[i] == ' ')
@@ -180,7 +190,7 @@ main(argc, argv)
                }
        }
 
-       sprintf(key_msg,
+       snprintf(key_msg, sizeof(key_msg),
 "%s - left   %s - rotate   %s - right   %s - drop   %s - pause   %s - quit",
                key_write[0], key_write[1], key_write[2], key_write[3],
                key_write[4], key_write[5]);
@@ -249,7 +259,7 @@ main(argc, argv)
                                scr_msg(key_msg, 0);
                                scr_msg(msg, 1);
                                (void) fflush(stdout);
-                       } while (rwait((struct timeval *)NULL) == -1);
+                       } while (rwait(NULL) == -1);
                        scr_msg(msg, 0);
                        scr_msg(key_msg, 1);
                        place(curshape, pos, 0);
@@ -263,7 +273,7 @@ main(argc, argv)
                }
                if (c == keys[1]) {
                        /* turn */
-                       struct shape *new = &shapes[curshape->rot];
+                       const struct shape *new = &shapes[curshape->rot];
 
                        if (fits_in(new, pos))
                                curshape = new;
@@ -307,18 +317,18 @@ main(argc, argv)
        exit(0);
 }
 
-void
-onintr(signo)
-       int signo;
+static void
+onintr(int signo __unused)
 {
        scr_clear();
        scr_end();
        exit(0);
 }
 
-void
-usage()
+static void
+usage(void)
 {
-       (void)fprintf(stderr, "usage: tetris [-s] [-l level] [-keys]\n");
+       (void)fprintf(stderr, "usage: %s [-ps] [-k keys] [-l level]\n",
+           getprogname());
        exit(1);
 }