Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/games/rain This patch converts rain(6) to use curses, thereby



details:   https://anonhg.NetBSD.org/src/rev/0b563b7a199b
branches:  trunk
changeset: 475039:0b563b7a199b
user:      hubertf <hubertf%NetBSD.org@localhost>
date:      Fri Jul 30 02:14:56 1999 +0000

description:
This patch converts rain(6) to use curses, thereby
significantly simplifying the code and improving its portability.  It
also adds a delay option from OpenBSD to make the display go at a
useful speed on fast terminals, and fixes signal handling to make it
reliable.

Patch supplied by Joseph Myers <jsm28%cam.ac.uk@localhost> in PR 6659.

diffstat:

 games/rain/Makefile |    6 +-
 games/rain/rain.6   |   18 +---
 games/rain/rain.c   |  185 ++++++++++++++-------------------------------------
 3 files changed, 60 insertions(+), 149 deletions(-)

diffs (truncated from 305 to 300 lines):

diff -r 46656469be13 -r 0b563b7a199b games/rain/Makefile
--- a/games/rain/Makefile       Fri Jul 30 02:07:15 1999 +0000
+++ b/games/rain/Makefile       Fri Jul 30 02:14:56 1999 +0000
@@ -1,9 +1,9 @@
-#      $NetBSD: Makefile,v 1.7 1998/02/04 10:21:12 christos Exp $
+#      $NetBSD: Makefile,v 1.8 1999/07/30 02:14:56 hubertf Exp $
 #      @(#)Makefile    8.1 (Berkeley) 5/31/93
 
 PROG=  rain
 MAN=   rain.6
-DPADD= ${LIBTERMCAP}
-LDADD= -ltermcap
+DPADD= ${LIBCURSES}
+LDADD= -lcurses
 
 .include <bsd.prog.mk>
diff -r 46656469be13 -r 0b563b7a199b games/rain/rain.6
--- a/games/rain/rain.6 Fri Jul 30 02:07:15 1999 +0000
+++ b/games/rain/rain.6 Fri Jul 30 02:14:56 1999 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: rain.6,v 1.6 1997/10/12 01:12:44 lukem Exp $
+.\"    $NetBSD: rain.6,v 1.7 1999/07/30 02:14:56 hubertf Exp $
 .\"
 .\" Copyright (c) 1989, 1993
 .\"    The Regents of the University of California.  All rights reserved.
@@ -41,21 +41,17 @@
 .Nd animated raindrops display
 .Sh SYNOPSIS
 .Nm
+.Op Fl d Ar delay
 .Sh DESCRIPTION
 The output of
 .Nm
 is modeled after the 
 .Tn VAX/VMS 
 program of the same name.
-The terminal has to be set for 9600 baud to obtain the proper effect.
-.Pp
-As with all programs that use
-.Tn termcap ,
-the 
-.Ev TERM
-environment variable must be set (and exported) to the type of the
-terminal being used.
-.Sh FILES
-.Pa /usr/share/misc/termcap
+To obtain the proper effect, either the terminal must be set for 9600
+baud or the
+.Fl d
+option must be used to specify a delay, in milliseconds, between each
+update.  A reasonable delay is 120; the default is 0.
 .Sh AUTHOR
 Eric P. Scott
diff -r 46656469be13 -r 0b563b7a199b games/rain/rain.c
--- a/games/rain/rain.c Fri Jul 30 02:07:15 1999 +0000
+++ b/games/rain/rain.c Fri Jul 30 02:14:56 1999 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rain.c,v 1.10 1997/10/13 22:01:54 cjs Exp $    */
+/*     $NetBSD: rain.c,v 1.11 1999/07/30 02:14:56 hubertf Exp $        */
 
 /*
  * Copyright (c) 1980, 1993
@@ -43,7 +43,7 @@
 #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.11 1999/07/30 02:14:56 hubertf Exp $");
 #endif
 #endif /* not lint */
 
@@ -53,185 +53,100 @@
  */
 
 #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');
-               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], xpos[j], 'O');
                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] - 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);
-               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, "| O |");
+               mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /");
+               mvaddch(ypos[j] + 2, xpos[j], '-');
+               if (!j--)
+                       j = 4;
+               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;
+       int dummy __attribute__((__unused__));
 {
-       tputs(LL, 1, fputchar);
-       if (TE)
-               tputs(TE, 1, fputchar);
-       (void)fflush(stdout);
-       tcsetattr(1, TCSADRAIN, &old_tty);
-       exit(0);
+       sig_caught = 1;
 }
-
-void



Home | Main Index | Thread Index | Old Index