X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/78054a2d2740f8457dc8ff081caaf45632bf4970..HEAD:/rain/rain.c diff --git a/rain/rain.c b/rain/rain.c index ee8c32ad..ae75966a 100644 --- a/rain/rain.c +++ b/rain/rain.c @@ -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 @@ -12,11 +12,7 @@ * 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. * @@ -33,17 +29,17 @@ * SUCH DAMAGE. */ +#include #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 -#include -#ifdef USG -#include -#else -#include -#endif +#include +#include #include +#include +#include +#include +#include +#include -#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; }