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 t

⟦44a9e3255⟧ TextFile

    Length: 3205 (0xc85)
    Types: TextFile
    Names: »trans.c«

Derivation

└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen
    └─ ⟦this⟧ »cph85dist/stat/src/trans.c« 

TextFile

#include "unixstat.h"
PGM(trans,transform columnar data,5.0,2/21/85)

/*
	cc trans.o strings.o number.o checkio.o -lm
*/

main (argc, argv) char **argv;
	{
	ARGV0;
	setvalue (argc, argv);
	checkstdin (Argv0);
	trans ();
	exit (0);
	}

#define	MAXCOLS 100
#define	MAXLEN  20
char	Input[MAXCOLS][MAXLEN];
int 	Maxindex = 0;
#define	MAXOP 20
#define	unary(c) (isalpha (c))   /* alphabetic operators are unary */
int 	Operator[MAXOP];         /* character operation names */
char	*Operand[MAXOP];         /* pointers to operands */
int 	Noper;                   /* number of operations */

setvalue (argc, argv) char **argv;
	{
	int 	i;
	int 	operator;
	char	*operand;
	for (i = 1; i < argc; i++)
		{
		operator = argv[i][0];
		operand = argv[i]+1;
		if (!member (operator, "=-+/*^lLesafc"))
			ERRMSG1 (Illegal operator '%c', operator)
		if (!unary (operator) && !number (operand))
			{
			if (*operand == 'x') /* address of input column */
				{
				int 	cindex;
				operand++;
				if (!INTEGER (operand))
					ERRMSG1 (Illegal column number 'x%s', operand)
				cindex = atoi (operand);
				if (cindex <= 0 || cindex > MAXCOLS)
					ERRMSG1 (Column number (%d) out of range, cindex)
				if (cindex > Maxindex) Maxindex = cindex;
				operand = Input[cindex-1];
				}
			else
				ERRMSG1 (Unrecognized operand '%s', operand)
			}
		if (Noper == MAXOP)
			ERRMANY (operations on command line, MAXOP)
		Operator[Noper] = operator;
		Operand[Noper] = operand;
		Noper++;
		}
	if (Noper == 0)
		USAGE (OpValue ...)
	}

member (c, s)
int 	c;
char	*s;
	{
	if (s)
		while (*s)
			if (*s++ == c) return (1);
	return (0);
	}

trans ()
	{
	char	line[BUFSIZ];
	int 	ncols;
	double	operand;
	double	value;
	int 	inline = 0;
	int 	oper;
	double	LOG10 = log (10.0);
	while (gets (line))
		{
		inline++;
		ncols = sstrings (line, Input, MAXCOLS, MAXLEN);
		if (ncols < Maxindex)
			ERRMSG3 (Too few columns (%d) on line %d; need at least %d,
				ncols, inline, Maxindex)
		value = (double) inline;
		for (oper = 0; oper < Noper; oper++)
			{
			if (!unary (Operator[oper]))
				{
				if (!number (Operand[oper]))
					ERRNUM (Operand[oper],input value)
				operand = atof (Operand[oper]);
				}
			switch (Operator[oper])
				{
				case '=': value = operand; break;
				case '+': value += operand; break;
				case '-': value -= operand; break;
				case '/':
					if (fzero (operand))
						ERRMSG1 (Division by zero on line %d, inline)
					value /= operand; break;
				case '*': value *= operand; break;
				case '^': value = pow (value, operand); break;
				case 's':
					if (value < 0.0)
						ERRMSG1 (Root of negative value on line %d, inline)
					value = sqrt (value); break;
				case 'l':
					if (value <= FZERO)
						ERRMSG1 (Log of value <= 0 on line %d, inline)
					value = log (value); break;
				case 'L':
					if (value <= FZERO)
						ERRMSG1 (Log of value <= 0 on line %d, inline)
					value = log (value) / LOG10; break;
				case 'e': value = exp (value); break;
				case 'a': value = fabs (value); break;
				case 'f': value = floor (value); break;
				case 'c': value = ceil (value); break;
				default:
					ERRMSG1 (Illegal operator '%c', Operator[oper])
				}
			}
		printf ("%g\n", value);
		}
	}