]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - rain/rain.c
Revert inclusion of <string.h> now that curses has been fixed.
[bsdgames-darwin.git] / rain / rain.c
index 045e2314da2971bb9a4f194dcd7537a182741190..c6fc4038a44224d0ce4df6fb4122935fa3c7d051 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: rain.c,v 1.10 1997/10/13 22:01:54 cjs Exp $    */
+/*     $NetBSD: rain.c,v 1.13 1999/08/08 02:06:01 simonb Exp $ */
 
 /*
  * Copyright (c) 1980, 1993
@@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1993\n\
 #if 0
 static char sccsid[] = "@(#)rain.c     8.1 (Berkeley) 5/31/93";
 #else
-__RCSID("$NetBSD: rain.c,v 1.10 1997/10/13 22:01:54 cjs Exp $");
+__RCSID("$NetBSD: rain.c,v 1.13 1999/08/08 02:06:01 simonb Exp $");
 #endif
 #endif /* not lint */
 
@@ -53,185 +53,100 @@ __RCSID("$NetBSD: rain.c,v 1.10 1997/10/13 22:01:54 cjs Exp $");
  */
 
 #include <sys/types.h>
-#include <sys/ioctl.h>
+#include <curses.h>
 #include <err.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#include <termcap.h>
-#include <termios.h>
+#include <unistd.h>
 
-#define        cursor(c, r)    tputs(tgoto(CM, c, r), 1, fputchar)
+volatile sig_atomic_t sig_caught = 0;
 
-static struct termios sg, old_tty;
-
-void   fputchar __P((int));
 int    main __P((int, char **));
 void   onsig __P((int));
 
 
-char   *LL, *TE;
-
 int
 main(argc, argv)
        int argc;
        char **argv;
 {
-       extern char *UP;
        int x, y, j;
-       char *CM, *BC, *DN, *ND, *term;
-       char *TI, *tcp, *mp, tcb[100];
        long cols, lines;
+       unsigned int delay = 0;
+       int ch;
        int xpos[5], ypos[5];
-#ifdef TIOCGWINSZ
-       struct winsize ws;
-#endif
 
-       if (!(term = getenv("TERM")))
-               errx(1, "TERM: parameter not set");
-       if (!(mp = malloc((u_int)1024)))
-               errx(1, "out of space");
-       if (tgetent(mp, term) <= 0)
-               errx(1, "unknown terminal type `%s'", term);
-       tcp = tcb;
-       if (!(CM = tgetstr("cm", &tcp)))
-               errx(1, "terminal not capable of cursor motion");
-       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);
+       while ((ch = getopt(argc, argv, "d:h")) != -1)
+               switch (ch) {
+               case 'd':
+                       if ((delay = (unsigned int)strtoul(optarg, (char **)NULL, 10)) < 1
+                           || delay > 1000)
+                               errx(1, "invalid delay (1-1000)");
+                       delay *= 1000;  /* ms -> us */
+                       break;
+               case 'h':
+               default:
+                       (void)fprintf(stderr, "usage: rain [-d delay]\n");
                        exit(1);
                }
-               (void)strcpy(LL, tgoto(CM, 0, 23));
-       }
+
+       initscr();
+       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);
-       tcgetattr(1, &sg);
-       old_tty = sg;
-       sg.c_iflag &= ~ICRNL;
-       sg.c_oflag &= ~ONLCR;
-       sg.c_lflag &= ~ECHO;
-       tcsetattr(1, TCSADRAIN, &sg);
-       if (TI)
-               tputs(TI, 1, fputchar);
-       tputs(tgetstr("cl", &tcp), 1, fputchar);
-       (void)fflush(stdout);
+
        for (j = 4; j >= 0; --j) {
                xpos[j] = random() % cols + 2;
                ypos[j] = random() % lines + 2;
        }
        for (j = 0;;) {
+               if (sig_caught) {
+                       endwin();
+                       exit(0);
+               }
                x = random() % cols + 2;
                y = random() % lines + 2;
-               cursor(x, y);
-               fputchar('.');
-               cursor(xpos[j], ypos[j]);
-               fputchar('o');
+               mvaddch(y, x, '.');
+               mvaddch(ypos[j], xpos[j], 'o');
                if (!j--)
                        j = 4;
-               cursor(xpos[j], ypos[j]);
-               fputchar('O');
+               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('-');
+               mvaddch(ypos[j] - 1, xpos[j], '-');
+               mvaddstr(ypos[j], xpos[j] - 1, "|.|");
+               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('-');
+               mvaddch(ypos[j] - 2, xpos[j], '-');
+               mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\");
+               mvaddstr(ypos[j], xpos[j] - 2, "| O |");
+               mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /");
+               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(' ');
+               mvaddch(ypos[j] - 2, xpos[j], ' ');
+               mvaddstr(ypos[j] - 1, xpos[j] - 1, "   ");
+               mvaddstr(ypos[j], xpos[j] - 2, "     ");
+               mvaddstr(ypos[j] + 1, xpos[j] - 1, "   ");
+               mvaddch(ypos[j] + 2, xpos[j], ' ');
                xpos[j] = x;
                ypos[j] = y;
-               (void)fflush(stdout);
+               refresh();
+               if (delay) usleep(delay);
        }
 }
 
 void
 onsig(dummy)
-       int dummy;
-{
-       tputs(LL, 1, fputchar);
-       if (TE)
-               tputs(TE, 1, fputchar);
-       (void)fflush(stdout);
-       tcsetattr(1, TCSADRAIN, &old_tty);
-       exit(0);
-}
-
-void
-fputchar(c)
-       int c;
+       int dummy __attribute__((__unused__));
 {
-       (void)putchar(c);
+       sig_caught = 1;
 }