]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - rain/rain.c
Fix merge conflicts
[bsdgames-darwin.git] / rain / rain.c
index ee8c32adfd1818cb44a808346cbcf949a41927a1..ae75966a06c7a82eaa16f28f698a9115dbd4d998 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: rain.c,v 1.6 1995/04/22 10:26:09 cgd Exp $     */
+/*     $NetBSD: rain.c,v 1.22 2020/10/14 18:32:04 nia 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[] = "@(#)rain.c     8.1 (Berkeley) 5/31/93";
 #else
-static char rcsid[] = "$NetBSD: rain.c,v 1.6 1995/04/22 10:26:09 cgd Exp $";
+__RCSID("$NetBSD: rain.c,v 1.22 2020/10/14 18:32:04 nia Exp $");
 #endif
 #endif /* not lint */
 
@@ -53,211 +49,105 @@ static char rcsid[] = "$NetBSD: rain.c,v 1.6 1995/04/22 10:26:09 cgd Exp $";
  */
 
 #include <sys/types.h>
-#include <stdio.h>
-#ifdef USG
-#include <termio.h>
-#else
-#include <sgtty.h>
-#endif
+#include <curses.h>
+#include <err.h>
 #include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <limits.h>
 
-#define        cursor(c, r)    tputs(tgoto(CM, c, r), 1, fputchar)
+static volatile sig_atomic_t sig_caught = 0;
 
-#ifdef USG
-static struct termio sg, old_tty;
-#else
-static struct sgttyb sg, old_tty;
-#endif
+int main(int, char **);
+static void onsig(int);
 
-void   fputchar __P((int));
-char   *LL, *TE, *tgoto();
 
-main(argc, argv)
-       int argc;
-       char **argv;
+int
+main(int argc, char **argv)
 {
-       extern short ospeed;
-       extern char *UP;
-       register int x, y, j;
-       register char *CM, *BC, *DN, *ND, *term;
-       char *TI, *tcp, *mp, tcb[100],
-               *malloc(), *getenv(), *strcpy(), *tgetstr();
-       long cols, lines, random();
+       int x, y, j;
+       long cols, lines;
+       unsigned int delay = 120000;
+       unsigned long val = 0;
+       int ch;
+       char *ep;
        int xpos[5], ypos[5];
-       static void onsig();
-#ifdef TIOCGWINSZ
-       struct winsize ws;
-#endif
 
-       if (!(term = getenv("TERM"))) {
-               fprintf(stderr, "%s: TERM: parameter not set\n", *argv);
-               exit(1);
-       }
-       if (!(mp = malloc((u_int)1024))) {
-               fprintf(stderr, "%s: out of space.\n", *argv);
-               exit(1);
-       }
-       if (tgetent(mp, term) <= 0) {
-               fprintf(stderr, "%s: %s: unknown terminal type\n", *argv, term);
-               exit(1);
-       }
-       tcp = tcb;
-       if (!(CM = tgetstr("cm", &tcp))) {
-               fprintf(stderr, "%s: terminal not capable of cursor motion\n", *argv);
-               exit(1);
-       }
-       if (!(BC = tgetstr("bc", &tcp)))
-               BC = "\b";
-       if (!(DN = tgetstr("dn", &tcp)))
-               DN = "\n";
-       if (!(ND = tgetstr("nd", &tcp)))
-               ND = " ";
-#ifdef TIOCGWINSZ
-       if (ioctl(fileno(stdout), TIOCGWINSZ, &ws) != -1 &&
-           ws.ws_col && ws.ws_row) {
-               cols = ws.ws_col;
-               lines = ws.ws_row;
-       } else
-#endif
-       {
-               if ((cols = tgetnum("co")) == -1)
-                       cols = 80;
-               if ((lines = tgetnum("li")) == -1)
-                       lines = 24;
-       }
-       cols -= 4;
-       lines -= 4;
-       TE = tgetstr("te", &tcp);
-       TI = tgetstr("ti", &tcp);
-       UP = tgetstr("up", &tcp);
-       if (!(LL = tgetstr("ll", &tcp))) {
-               if (!(LL = malloc((u_int)10))) {
-                       fprintf(stderr, "%s: out of space.\n", *argv);
-                       exit(1);
+       while ((ch = getopt(argc, argv, "d:")) != -1)
+               switch (ch) {
+               case 'd':
+                       val = strtoul(optarg, &ep, 0);
+                       if (ep == optarg || *ep)
+                               errx(1, "Invalid delay `%s'", optarg);
+                       if (errno == ERANGE && val == ULONG_MAX)
+                               err(1, "Invalid delay `%s'", optarg);
+                       if (val >= 1000)
+                               errx(1, "Invalid delay `%s' (1-999)", optarg);
+                       delay = (unsigned int)val * 1000;  /* ms -> us */
+                       break;
+               default:
+                       (void)fprintf(stderr, "Usage: %s [-d delay]\n",
+                           getprogname());
+                       return 1;
                }
-               (void)strcpy(LL, tgoto(CM, 0, 23));
-       }
-#ifdef USG
-       ioctl(1, TCGETA, &sg);
-       ospeed = sg.c_cflag&CBAUD;
-#else
-       gtty(1, &sg);
-       ospeed = sg.sg_ospeed;
-#endif
+
+       if (!initscr())
+               errx(0, "couldn't initialize screen");
+       cols = COLS - 4;
+       lines = LINES - 4;
+
        (void)signal(SIGHUP, onsig);
        (void)signal(SIGINT, onsig);
-       (void)signal(SIGQUIT, onsig);
-       (void)signal(SIGSTOP, onsig);
-       (void)signal(SIGTSTP, onsig);
        (void)signal(SIGTERM, onsig);
-#ifdef USG
-       ioctl(1, TCGETA, &old_tty);     /* save tty bits for exit */
-       ioctl(1, TCGETA, &sg);
-       sg.c_iflag &= ~ICRNL;
-       sg.c_oflag &= ~ONLCR;
-       sg.c_lflag &= ~ECHO;
-       ioctl(1, TCSETAW, &sg);
-#else
-       gtty(1, &old_tty);              /* save tty bits for exit */
-       gtty(1, &sg);
-       sg.sg_flags &= ~(CRMOD|ECHO);
-       stty(1, &sg);
-#endif
-       if (TI)
-               tputs(TI, 1, fputchar);
-       tputs(tgetstr("cl", &tcp), 1, fputchar);
-       (void)fflush(stdout);
+
+       (void)curs_set(0);
        for (j = 4; j >= 0; --j) {
                xpos[j] = random() % cols + 2;
                ypos[j] = random() % lines + 2;
        }
        for (j = 0;;) {
+               if (sig_caught) {
+                       (void)endwin();
+                       exit(0);
+               }
                x = random() % cols + 2;
                y = random() % lines + 2;
-               cursor(x, y);
-               fputchar('.');
-               cursor(xpos[j], ypos[j]);
-               fputchar('o');
+               (void)mvaddch(y, x, '.');
+               (void)mvaddch(ypos[j], xpos[j], 'o');
                if (!j--)
                        j = 4;
-               cursor(xpos[j], ypos[j]);
-               fputchar('O');
+               (void)mvaddch(ypos[j], xpos[j], 'O');
                if (!j--)
                        j = 4;
-               cursor(xpos[j], ypos[j] - 1);
-               fputchar('-');
-               tputs(DN, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               fputs("|.|", stdout);
-               tputs(DN, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               fputchar('-');
+               (void)mvaddch(ypos[j] - 1, xpos[j], '-');
+               (void)mvaddstr(ypos[j], xpos[j] - 1, "|.|");
+               (void)mvaddch(ypos[j] + 1, xpos[j], '-');
                if (!j--)
                        j = 4;
-               cursor(xpos[j], ypos[j] - 2);
-               fputchar('-');
-               tputs(DN, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               fputs("/ \\", stdout);
-               cursor(xpos[j] - 2, ypos[j]);
-               fputs("| O |", stdout);
-               cursor(xpos[j] - 1, ypos[j] + 1);
-               fputs("\\ /", stdout);
-               tputs(DN, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               fputchar('-');
+               (void)mvaddch(ypos[j] - 2, xpos[j], '-');
+               (void)mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\");
+               (void)mvaddstr(ypos[j], xpos[j] - 2, "| O |");
+               (void)mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /");
+               (void)mvaddch(ypos[j] + 2, xpos[j], '-');
                if (!j--)
                        j = 4;
-               cursor(xpos[j], ypos[j] - 2);
-               fputchar(' ');
-               tputs(DN, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               fputchar(' ');
-               tputs(ND, 1, fputchar);
-               fputchar(' ');
-               cursor(xpos[j] - 2, ypos[j]);
-               fputchar(' ');
-               tputs(ND, 1, fputchar);
-               fputchar(' ');
-               tputs(ND, 1, fputchar);
-               fputchar(' ');
-               cursor(xpos[j] - 1, ypos[j] + 1);
-               fputchar(' ');
-               tputs(ND, 1, fputchar);
-               fputchar(' ');
-               tputs(DN, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               tputs(BC, 1, fputchar);
-               fputchar(' ');
+               (void)mvaddch(ypos[j] - 2, xpos[j], ' ');
+               (void)mvaddstr(ypos[j] - 1, xpos[j] - 1, "   ");
+               (void)mvaddstr(ypos[j], xpos[j] - 2, "     ");
+               (void)mvaddstr(ypos[j] + 1, xpos[j] - 1, "   ");
+               (void)mvaddch(ypos[j] + 2, xpos[j], ' ');
                xpos[j] = x;
                ypos[j] = y;
-               (void)fflush(stdout);
+               (void)refresh();
+               if (delay) (void)usleep(delay);
        }
 }
 
+/* ARGSUSED */
 static void
-onsig()
-{
-       tputs(LL, 1, fputchar);
-       if (TE)
-               tputs(TE, 1, fputchar);
-       (void)fflush(stdout);
-#ifdef USG
-       ioctl(1, TCSETAW, &old_tty);
-#else
-       stty(1, &old_tty);
-#endif
-       exit(0);
-}
-
-void
-fputchar(c)
-       int c;
+onsig(int dummy __unused)
 {
-       (void)putchar(c);
+       sig_caught = 1;
 }