Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/games/worms This patch converts worms(6) to use curses, thereby
details: https://anonhg.NetBSD.org/src/rev/1004bd687df1
branches: trunk
changeset: 475040:1004bd687df1
user: hubertf <hubertf%NetBSD.org@localhost>
date: Fri Jul 30 02:23:27 1999 +0000
description:
This patch converts worms(6) to use curses, thereby
simplifying the code and improving its portability. It also adds a
delay option from OpenBSD, to allow reasonable speed display on fast
terminals, adds use of const, and fixes signal handling and use of
errx() where appropriate.
Patch supplied in PR 6661 by Joseph Myers <jsm28%cam.ac.uk@localhost>.
diffstat:
games/worms/worms.6 | 17 ++-
games/worms/worms.c | 207 ++++++++++++---------------------------------------
2 files changed, 59 insertions(+), 165 deletions(-)
diffs (truncated from 394 to 300 lines):
diff -r 0b563b7a199b -r 1004bd687df1 games/worms/worms.6
--- a/games/worms/worms.6 Fri Jul 30 02:14:56 1999 +0000
+++ b/games/worms/worms.6 Fri Jul 30 02:23:27 1999 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: worms.6,v 1.9 1999/03/10 09:29:08 erh Exp $
+.\" $NetBSD: worms.6,v 1.10 1999/07/30 02:23:27 hubertf Exp $
.\"
.\" Copyright (c) 1989, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -41,24 +41,29 @@
.Sh SYNOPSIS
.Nm
.Op Fl ft
+.Op Fl d Ar delay
.Op Fl l Ar length
.Op Fl n Ar number
.Sh DESCRIPTION
A
.Ux
-version of the DEC-2136 program ``worms''.
+version of the DEC-2136 program
+.Dq worms .
.Pp
The options are as follows:
.Bl -tag -width indent
.It Fl f
-Makes a ``field'' for the worm(s) to eat.
+Makes a
+.Dq field
+for the worm(s) to eat.
.It Fl t
Makes each worm leave a trail behind it.
+.It Fl d
+Specifies a delay, in milliseconds, between each update. This is
+useful for fast terminals. Reasonable values are around 20-200. The
+default is 0.
.It Fl l
Specifies a length for each worm; the default is 16.
.It Fl n
Specifies the number of worms; the default is 3.
.El
-.Sh BUGS
-The lower-right-hand character position will not be updated properly
-on a terminal that wraps at the right margin.
diff -r 0b563b7a199b -r 1004bd687df1 games/worms/worms.c
--- a/games/worms/worms.c Fri Jul 30 02:14:56 1999 +0000
+++ b/games/worms/worms.c Fri Jul 30 02:23:27 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: worms.c,v 1.10 1998/09/13 15:27:31 hubertf Exp $ */
+/* $NetBSD: worms.c,v 1.11 1999/07/30 02:23:27 hubertf Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -43,7 +43,7 @@
#if 0
static char sccsid[] = "@(#)worms.c 8.1 (Berkeley) 5/31/93";
#else
-__RCSID("$NetBSD: worms.c,v 1.10 1998/09/13 15:27:31 hubertf Exp $");
+__RCSID("$NetBSD: worms.c,v 1.11 1999/07/30 02:23:27 hubertf Exp $");
#endif
#endif /* not lint */
@@ -65,15 +65,15 @@
*
*/
#include <sys/types.h>
-#include <sys/ioctl.h>
+#include <curses.h>
+#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
-#include <termios.h>
#include <unistd.h>
-static struct options {
+static const struct options {
int nopts;
int opts[3];
}
@@ -167,13 +167,11 @@
{ 0, { 0, 0, 0 } }
};
-#define cursor(c, r) tputs(tgoto(CM, c, r), 1, fputchar)
-char *tcp;
-static char flavor[] = {
+static const char flavor[] = {
'O', '*', '#', '$', '%', '0', '@', '~'
};
-static short xinc[] = {
+static const short xinc[] = {
1, 1, 1, 0, -1, -1, -1, 0
}, yinc[] = {
-1, 0, 1, 1, 1, 0, -1, -1
@@ -183,60 +181,51 @@
short *xpos, *ypos;
} *worm;
-void fputchar __P((int));
+volatile sig_atomic_t sig_caught = 0;
+
int main __P((int, char **));
void nomem __P((void)) __attribute__((__noreturn__));
-void onsig __P((int)) __attribute__((__noreturn__));
-int tgetent __P((char *, char *));
-int tgetflag __P((char *));
-int tgetnum __P((char *));
-char *tgetstr __P((char *, char **));
-char *tgoto __P((char *, int, int));
-int tputs __P((char *, int, void (*)(int)));
+void onsig __P((int));
int
main(argc, argv)
int argc;
char *argv[];
{
- extern char *UP;
int x, y, h, n;
struct worm *w;
- struct options *op;
+ const struct options *op;
short *ip;
- char *term;
- int CO, IN, LI, last, bottom, ch, length, number, trail, Wrap;
+ int CO, LI, last, bottom, ch, length, number, trail;
short **ref;
- char *AL, *BC, *CM, *EI, *HO, *IC, *IM, *IP, *SR;
- char *field, tcb[100], *mp;
- struct termios ti;
-#ifdef TIOCGWINSZ
- struct winsize ws;
-#endif
+ const char *field;
+ char *mp;
+ unsigned int delay = 0;
mp = NULL;
length = 16;
number = 3;
trail = ' ';
field = NULL;
- while ((ch = getopt(argc, argv, "fl:n:t")) != -1)
+ while ((ch = getopt(argc, argv, "d:fl:n:t")) != -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 'f':
field = "WORM";
break;
case 'l':
if ((length = atoi(optarg)) < 2 || length > 1024) {
- (void)fprintf(stderr,
- "worms: invalid length (%d - %d).\n",
+ errx(1, "invalid length (%d - %d).",
2, 1024);
- exit(1);
}
break;
case 'n':
if ((number = atoi(optarg)) < 1) {
- (void)fprintf(stderr,
- "worms: invalid number of worms.\n");
- exit(1);
+ errx(1, "invalid number of worms.");
}
break;
case 't':
@@ -245,55 +234,18 @@
case '?':
default:
(void)fprintf(stderr,
- "usage: worms [-ft] [-l length] [-n number]\n");
+ "usage: worms [-ft] [-d delay] [-l length] [-n number]\n");
exit(1);
}
- if (!(term = getenv("TERM"))) {
- (void)fprintf(stderr, "worms: no TERM environment variable.\n");
- exit(1);
- }
if (!(worm = malloc((size_t)number *
sizeof(struct worm))) || !(mp = malloc((size_t)1024)))
nomem();
- if (tgetent(mp, term) <= 0) {
- (void)fprintf(stderr, "worms: %s: unknown terminal type.\n",
- term);
- exit(1);
- }
- tcp = tcb;
- if (!(CM = tgetstr("cm", &tcp))) {
- (void)fprintf(stderr,
- "worms: terminal incapable of cursor motion.\n");
- exit(1);
- }
- AL = tgetstr("al", &tcp);
- BC = tgetflag("bs") ? "\b" : tgetstr("bc", &tcp);
- EI = tgetstr("ei", &tcp);
- HO = tgetstr("ho", &tcp);
- IC = tgetstr("ic", &tcp);
- IM = tgetstr("im", &tcp);
- IN = tgetflag("in");
- IP = tgetstr("ip", &tcp);
- SR = tgetstr("sr", &tcp);
- UP = tgetstr("up", &tcp);
-#ifdef TIOCGWINSZ
- if (ioctl(fileno(stdout), TIOCGWINSZ, &ws) != -1 &&
- ws.ws_col && ws.ws_row) {
- CO = ws.ws_col;
- LI = ws.ws_row;
- } else
-#endif
- {
- if ((CO = tgetnum("co")) <= 0)
- CO = 80;
- if ((LI = tgetnum("li")) <= 0)
- LI = 24;
- }
+ initscr();
+ CO = COLS;
+ LI = LINES;
last = CO - 1;
bottom = LI - 1;
- tcgetattr(fileno(stdout), &ti);
- Wrap = tgetflag("am");
if (!(ip = malloc((size_t)(LI * CO * sizeof(short)))))
nomem();
if (!(ref = malloc((size_t)(LI * sizeof(short *)))))
@@ -304,8 +256,6 @@
}
for (ip = ref[0], n = LI * CO; --n >= 0;)
*ip++ = 0;
- if (Wrap)
- ref[bottom][last] = 1;
for (n = number, w = &worm[0]; --n >= 0; w++) {
w->orientation = w->head = 0;
if (!(ip = malloc((size_t)(length * sizeof(short)))))
@@ -327,78 +277,30 @@
(void)signal(SIGTSTP, onsig);
(void)signal(SIGTERM, onsig);
- tputs(tgetstr("ti", &tcp), 1, fputchar);
- tputs(tgetstr("cl", &tcp), 1, fputchar);
if (field) {
- char *p = field;
+ const char *p = field;
- for (y = bottom; --y >= 0;) {
+ for (y = LI; --y >= 0;) {
for (x = CO; --x >= 0;) {
- fputchar(*p++);
+ addch(*p++);
if (!*p)
p = field;
}
- if (!Wrap)
- fputchar('\n');
- (void)fflush(stdout);
- }
- if (Wrap) {
- if (IM && !IN) {
- for (x = last; --x > 0;) {
- fputchar(*p++);
- if (!*p)
- p = field;
- }
- y = *p++;
- if (!*p)
- p = field;
- fputchar(*p);
- if (BC)
- tputs(BC, 1, fputchar);
- else
- cursor(last - 1, bottom);
- tputs(IM, 1, fputchar);
- if (IC)
- tputs(IC, 1, fputchar);
- fputchar(y);
- if (IP)
- tputs(IP, 1, fputchar);
- tputs(EI, 1, fputchar);
- }
- else if (SR || AL) {
- if (HO)
- tputs(HO, 1, fputchar);
- else
- cursor(0, 0);
- if (SR)
- tputs(SR, 1, fputchar);
- else
- tputs(AL, LI, fputchar);
- for (x = CO; --x >= 0;) {
- fputchar(*p++);
- if (!*p)
Home |
Main Index |
Thread Index |
Old Index