DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T s

⟦63d642057⟧ TextFile

    Length: 2643 (0xa53)
    Types: TextFile
    Names: »series.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/series.c« 

TextFile

/*  Copyright 1982 Gary Perlman */

#include "stat.h"
PGM(series,Generate an Additive Series of Numbers,5.4,10/24/86)

#define	startstr  argv[1]     /* argv start value */
#define	endingstr argv[2]     /* argv ending value */
#define	stepstr   argv[3]     /* argv stepsize value */

#define	GFORMAT "%g\n"        /* print format for real numbers */
#define	IFORMAT "%.0f\n"      /* print format for integers */

char	*Format = GFORMAT;    /* print format for numbers in series */
Boole	Onlyint;              /* use integer format */
double	Start;                /* series start value */
double	Ending;               /* series end value (note: end is reserved word */
#define	RANGE (Ending-Start)  /* just used to make expression clearer */
double	Step = 1.0;           /* default stepsize - might be negated */

\f

/*FUNCTION main: series */
main (argc, argv) char **argv;
	{
	long	nitems;           /* number of items to generate */
	long 	item;             /* item number in series */
	double	value;            /* current value in series */
	int 	nargs = argc - 1; /* number of arguments on command line */

	ARGV0;                    /* set up name of program */

	/* first check for problems with arguments */
	switch (nargs)
		{
		case 3: /* series start ending stepsize */
			if (!number (stepstr))
				ERRNUM (stepstr,stepsize)        /* always EXITs */
			/* FALLTHROUGH */
		case 2: /* series start ending */
			if (!number (startstr))
				ERRNUM (startstr,series start)   /* always EXITs */
			if (!number (endingstr))
				ERRNUM (endingstr,series end)    /* always EXITs */
			break;
		default:
			USAGE (start end [stepsize])         /* always EXITs */
		}

	/* set series values and check for integer values */
	Start   = atof (startstr);
	Ending  = atof (endingstr);
	Onlyint = isinteger (startstr) && isinteger (endingstr);
	if (nargs == 3) /* stepsize supplied on command line */
		{
		Step     = fabs (atof (stepstr));
		if (!fzero (RANGE) && fzero (Step)) /* any step okay if RANGE == 0 */
			ERRMSG0 (stepsize must be non-zero) /* always EXITs */
		Onlyint &= isinteger (stepstr);
		}

	if (Start > Ending) /* stepsize must be negative */
		Step = (-Step);
	if (Onlyint) /* use "integer" floating format (%g broken on LATTICE) */
		Format = IFORMAT;

	if (fzero (RANGE)) /* Start == Ending, so just print one number */
		nitems = 1;
	else
		nitems = RANGE / Step + 1.0 + FZERO;     /* RANGE < 0 iff Step < 0 */

	/* finally, we print the series, multiplying to avoid rounding */
	for (item = 0; item < nitems; item++)
		{
		value = Start + Step * item;
		printf (Format, fzero (value) ? 0.0 : value);
		}

	exit (SUCCESS);
	}