NetBSD/games/worms/worms.c

412 lines
9.6 KiB
C
Raw Normal View History

When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
/* $NetBSD: worms.c,v 1.26 2023/04/15 15:21:56 kre Exp $ */
1995-04-22 12:00:54 +04:00
1993-03-21 12:45:37 +03:00
/*
1995-04-22 12:00:54 +04:00
* Copyright (c) 1980, 1993
* The Regents of the University of California. All rights reserved.
1993-03-21 12:45:37 +03:00
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 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. Neither the name of the University nor the names of its contributors
1993-03-21 12:45:37 +03:00
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
1997-10-12 06:12:45 +04:00
#include <sys/cdefs.h>
1993-03-21 12:45:37 +03:00
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1980, 1993\
The Regents of the University of California. All rights reserved.");
1993-03-21 12:45:37 +03:00
#endif /* not lint */
#ifndef lint
1995-04-22 12:00:54 +04:00
#if 0
static char sccsid[] = "@(#)worms.c 8.1 (Berkeley) 5/31/93";
#else
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
__RCSID("$NetBSD: worms.c,v 1.26 2023/04/15 15:21:56 kre Exp $");
1995-04-22 12:00:54 +04:00
#endif
1993-03-21 12:45:37 +03:00
#endif /* not lint */
/*
*
* @@@ @@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@
* @@@ @@@ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@
* @@@ @@@ @@@@ @@@@ @@@@ @@@@ @@@ @@@@
* @@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
* @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
* @@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@
* @@@@@@@@@@@@ @@@@ @@@@ @@@ @@@ @@@ @@@
* @@@@ @@@@ @@@@@@@@@@@@ @@@ @@@ @@@ @@@
* @@ @@ @@@@@@@@@@ @@@ @@@ @@@ @@@
*
* Eric P. Scott
* Caltech High Energy Physics
* October, 1980
*
*/
#include <sys/types.h>
1995-04-22 12:00:54 +04:00
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
#include <ctype.h>
#include <curses.h>
#include <err.h>
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
#include <limits.h>
1995-04-22 12:00:54 +04:00
#include <signal.h>
1993-03-21 12:45:37 +03:00
#include <stdio.h>
1993-04-19 01:52:18 +04:00
#include <stdlib.h>
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
#include <strings.h>
1995-04-22 12:00:54 +04:00
#include <unistd.h>
1993-03-21 12:45:37 +03:00
static const struct options {
1993-03-21 12:45:37 +03:00
int nopts;
int opts[3];
}
normal[8] = {
{ 3, { 7, 0, 1 } },
{ 3, { 0, 1, 2 } },
{ 3, { 1, 2, 3 } },
{ 3, { 2, 3, 4 } },
{ 3, { 3, 4, 5 } },
{ 3, { 4, 5, 6 } },
{ 3, { 5, 6, 7 } },
{ 3, { 6, 7, 0 } }
}, upper[8] = {
{ 1, { 1, 0, 0 } },
{ 2, { 1, 2, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 2, { 4, 5, 0 } },
{ 1, { 5, 0, 0 } },
{ 2, { 1, 5, 0 } }
},
left[8] = {
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 2, { 2, 3, 0 } },
{ 1, { 3, 0, 0 } },
{ 2, { 3, 7, 0 } },
{ 1, { 7, 0, 0 } },
{ 2, { 7, 0, 0 } }
},
right[8] = {
{ 1, { 7, 0, 0 } },
{ 2, { 3, 7, 0 } },
{ 1, { 3, 0, 0 } },
{ 2, { 3, 4, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 2, { 6, 7, 0 } }
},
lower[8] = {
{ 0, { 0, 0, 0 } },
{ 2, { 0, 1, 0 } },
{ 1, { 1, 0, 0 } },
{ 2, { 1, 5, 0 } },
{ 1, { 5, 0, 0 } },
{ 2, { 5, 6, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } }
},
upleft[8] = {
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 1, { 3, 0, 0 } },
{ 2, { 1, 3, 0 } },
{ 1, { 1, 0, 0 } }
},
upright[8] = {
{ 2, { 3, 5, 0 } },
{ 1, { 3, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 1, { 5, 0, 0 } }
},
lowleft[8] = {
{ 3, { 7, 0, 1 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 1, { 1, 0, 0 } },
{ 2, { 1, 7, 0 } },
{ 1, { 7, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } }
},
lowright[8] = {
{ 0, { 0, 0, 0 } },
{ 1, { 7, 0, 0 } },
{ 2, { 5, 7, 0 } },
{ 1, { 5, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } },
{ 0, { 0, 0, 0 } }
};
static const char flavor[] = {
1993-03-21 12:45:37 +03:00
'O', '*', '#', '$', '%', '0', '@', '~'
};
static const short xinc[] = {
1993-03-21 12:45:37 +03:00
1, 1, 1, 0, -1, -1, -1, 0
}, yinc[] = {
-1, 0, 1, 1, 1, 0, -1, -1
};
static struct worm {
int orientation, head;
short *xpos, *ypos;
} *worm;
2009-08-12 12:54:54 +04:00
static volatile sig_atomic_t sig_caught = 0;
2004-01-27 23:30:28 +03:00
int main(int, char **);
2009-08-12 12:54:54 +04:00
static void nomem(void) __dead;
static void onsig(int);
1993-04-19 01:52:18 +04:00
1995-04-22 12:00:54 +04:00
int
main(int argc, char *argv[])
1993-03-21 12:45:37 +03:00
{
1997-10-12 06:12:45 +04:00
int x, y, h, n;
struct worm *w;
const struct options *op;
1997-10-12 06:12:45 +04:00
short *ip;
int CO, LI, last, bottom, ch, length, number, trail;
1993-03-21 12:45:37 +03:00
short **ref;
const char *field;
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
char *ep;
unsigned int delay = 20000;
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
unsigned long ul;
1993-03-21 12:45:37 +03:00
length = 16;
number = 3;
trail = ' ';
field = NULL;
while ((ch = getopt(argc, argv, "d:fl:n:t")) != -1)
1993-03-21 12:45:37 +03:00
switch(ch) {
case 'd':
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
ul = strtoul(optarg, &ep, 10);
if (ep != optarg) {
while (isspace(*(unsigned char *)ep))
ep++;
}
if (ep == optarg ||
(*ep != '\0' &&
( ep[1] == '\0' ? (*ep != 'm' && *ep != 'u') :
( strcasecmp(ep, "ms") != 0 &&
strcasecmp(ep, "us") != 0 )) )) {
errx(1, "-d: invalid delay (%s)", optarg);
}
/*
* if ul >= INT_MAX/1000 we don't need the *1000,
* as even without that it will exceed the limit
* just below and be treated as an error.
* (This does assume >=32 bit int, but so does POSIX)
*/
if (*ep != 'u' && ul < INT_MAX / 1000)
ul *= 1000; /* ms -> us */
if (ul > 1000*1000) {
errx(1,
"-d: delay (%s) out of rannge [0 - 1000]",
optarg);
}
delay = (unsigned int)ul;
break;
1993-03-21 12:45:37 +03:00
case 'f':
field = "WORM";
break;
case 'l':
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
ul = strtoul(optarg, &ep, 10);
if (ep == optarg || *ep != '\0' ||
ul < 2 || ul > 1024) {
errx(1, "-l: invalid length (%s) [%d - %d].",
optarg, 2, 1024);
1993-03-21 12:45:37 +03:00
}
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
length = (int)ul;
1993-03-21 12:45:37 +03:00
break;
case 'n':
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
ul = strtoul(optarg, &ep, 10);
if (ep == optarg || *ep != '\0' ||
ul < 1 || ul > INT_MAX / 10 ) {
errx(1, "-n: invalid number of worms (%s).",
optarg);
1993-03-21 12:45:37 +03:00
}
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
/* upper bound is further limited later */
number = (int)ul;
1993-03-21 12:45:37 +03:00
break;
case 't':
trail = '.';
break;
case '?':
default:
(void)fprintf(stderr,
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
"usage: worms [-ft] [-d delay] [-l length]"
" [-n number]\n");
1993-03-21 12:45:37 +03:00
exit(1);
}
if (!initscr())
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
errx(1, "couldn't initialize screen");
curs_set(0);
CO = COLS;
LI = LINES;
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
if (CO > 4*length || LI < 4*length) {
ul = (unsigned long)LI / 2;
ul *= (unsigned long)CO / length;
} else {
ul = (unsigned long)CO / 2;
ul *= (unsigned long)LI / length;
}
if ((unsigned long)(unsigned)number > ul) {
endwin();
errx(1, "-n: too many worms (%d) max: %lu", number, ul);
}
if (!(worm = calloc((size_t)number, sizeof(struct worm))))
nomem();
last = CO - 1;
bottom = LI - 1;
1995-04-22 12:00:54 +04:00
if (!(ip = malloc((size_t)(LI * CO * sizeof(short)))))
1993-03-21 12:45:37 +03:00
nomem();
1995-04-22 12:00:54 +04:00
if (!(ref = malloc((size_t)(LI * sizeof(short *)))))
1993-03-21 12:45:37 +03:00
nomem();
for (n = 0; n < LI; ++n) {
ref[n] = ip;
ip += CO;
}
for (ip = ref[0], n = LI * CO; --n >= 0;)
*ip++ = 0;
for (n = number, w = &worm[0]; --n >= 0; w++) {
w->orientation = w->head = 0;
1995-04-22 12:00:54 +04:00
if (!(ip = malloc((size_t)(length * sizeof(short)))))
1993-03-21 12:45:37 +03:00
nomem();
w->xpos = ip;
for (x = length; --x >= 0;)
*ip++ = -1;
1995-04-22 12:00:54 +04:00
if (!(ip = malloc((size_t)(length * sizeof(short)))))
1993-03-21 12:45:37 +03:00
nomem();
w->ypos = ip;
for (y = length; --y >= 0;)
*ip++ = -1;
}
(void)signal(SIGHUP, onsig);
(void)signal(SIGINT, onsig);
(void)signal(SIGQUIT, onsig);
(void)signal(SIGTSTP, onsig);
(void)signal(SIGTERM, onsig);
if (field) {
const char *p = field;
1993-03-21 12:45:37 +03:00
for (y = LI; --y >= 0;) {
1993-03-21 12:45:37 +03:00
for (x = CO; --x >= 0;) {
addch(*p++);
1993-03-21 12:45:37 +03:00
if (!*p)
p = field;
}
refresh();
1993-03-21 12:45:37 +03:00
}
}
for (;;) {
refresh();
if (sig_caught) {
endwin();
exit(0);
}
2004-03-30 00:30:03 +04:00
if (delay) {
if (delay % 1000000 != 0)
usleep(delay % 1000000);
if (delay >= 1000000)
sleep(delay / 1000000);
}
1993-03-21 12:45:37 +03:00
for (n = 0, w = &worm[0]; n < number; n++, w++) {
if ((x = w->xpos[h = w->head]) < 0) {
mvaddch(y = w->ypos[h] = bottom,
x = w->xpos[h] = 0,
flavor[n % sizeof(flavor)]);
1993-03-21 12:45:37 +03:00
ref[y][x]++;
}
else
y = w->ypos[h];
if (++h == length)
h = 0;
if (w->xpos[w->head = h] >= 0) {
1997-10-12 06:12:45 +04:00
int x1, y1;
1993-03-21 12:45:37 +03:00
x1 = w->xpos[h];
y1 = w->ypos[h];
if (--ref[y1][x1] == 0) {
mvaddch(y1, x1, trail);
1993-03-21 12:45:37 +03:00
}
}
op = &(!x
? (!y
? upleft
: (y == bottom ? lowleft : left))
: (x == last
? (!y ? upright
: (y == bottom ? lowright : right))
: (!y ? upper
: (y == bottom ? lower : normal)))
)[w->orientation];
1993-03-21 12:45:37 +03:00
switch (op->nopts) {
case 0:
refresh();
1993-03-21 12:45:37 +03:00
abort();
1997-10-12 06:12:45 +04:00
return(1);
1993-03-21 12:45:37 +03:00
case 1:
w->orientation = op->opts[0];
break;
default:
w->orientation =
op->opts[(int)random() % op->nopts];
}
mvaddch(y += yinc[w->orientation],
x += xinc[w->orientation],
flavor[n % sizeof(flavor)]);
1993-03-21 12:45:37 +03:00
ref[w->ypos[h] = y][w->xpos[h] = x]++;
}
}
}
2009-08-12 12:54:54 +04:00
static void
onsig(int signo __unused)
1995-04-22 12:00:54 +04:00
{
sig_caught = 1;
1995-04-22 12:00:54 +04:00
}
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
/* This is never called before curses is initialised */
2009-08-12 12:54:54 +04:00
static void
nomem(void)
1993-03-21 12:45:37 +03:00
{
When worms default delay was changed from 0, to 20ms (Oct 2020) it lost the ability to run flat out (no sleeps) - which while not very useful for actually observing the behaviour of various Nematoda, can be useful when 'worms' is being used to generate cpu heat - it turns out to be a simple tool to make all of the app itself, the xterm it runs in (when running under X) and the X server, all more or less continuously busy - a trivial perpetual CPU load generator. Changing that was not a simple matter of just allowing -d 0..1000 rather than -d 1..1000 which had always been the limits on -d, as previously, simply by excluding 0, common error checking wasn't essential. -djunk would return 0 which was invalid, and so an error - that it was invalid because 0 < 1, rather than because "junk" is not a number wasn't material. Now we need some slightly more elaborate error checking code for the -d value, and if we're going to do that, may as well do the same for the -l and -n options, which also take numeric values. That is, it will no longer be possible to say: worms -n "5 worms" Just the number is allowed (but -d now allows a "ms" or "us" suffix). While here, place a reasonable upper limit (depending upon the screen size, and worm length) upon the number of worms, so they have somewhere to go, rather than just on top of each other. exit(1) from the errx() rather than 0, in the case that curses initscr() fails (doesn't seem right that it should appear as a successful run of worms, if it never managed to start). A couple more minor 80 column violations are handled, without further penalty, in this update (one simply vanishes, the other is wrapped). Note that this sounds like a lot, but it is really all just minor internal bookkeeping updates - the only real advertised user visible change is the ability to use -d0 which just restores that which was the default (though it could never be set via the option) until Oct 2020 - so really all that's happening is replacing minor functionality lost then, while leaving the change of the default delay that that change made, untouched. No man page update required (that never excluded -d0).
2023-04-15 18:21:56 +03:00
endwin();
errx(1, "not enough memory.");
1993-03-21 12:45:37 +03:00
}