Пример #1
0
void forloop(char *var, double from, double to, int op,
	double by, char *str)	/* set up a for loop */
{
	dprintf("# for %s from %g to %g by %c %g \n",
		var, from, to, op, by);
	if (++forp >= forstk+10)
		ERROR "for loop nested too deep" FATAL;
	forp->var = var;
	forp->to = to;
	forp->op = op;
	forp->by = by;
	forp->str = str;
	setfval(var, from);
	nextfor();
	unput('\n');
}
Пример #2
0
void
forloop(char *var, double from, double to, int op, double by, char *str)
{
	if (++forp >= forstk+10)
		fatal("for loop nested too deep");

/* note: actually we here want to take a vector variable and construct its   */
/*	 values directly, then access them one at a time below; the current  */
/*	 version is a temporary concession to old pic's version of the 'for' */

	forp->sym = findvar(var, VARNAME);
	if (forp->sym->s_dim && forp->sym->s_val.a)
		free(forp->sym->s_val.a);
	forp->sym->s_dim = 0;
	forp->sym->s_val.f = from;
	forp->to = to;
	if (by == 0.)
		fatal("step size of 0 not allowed");

	/*  For additive or subtractive step, make sure step is positive.
	    Otherwise, make sure step is greater than 1 in absolute value. */
	if ((op == ' ' || op == '+') && by < 0.) {
		op = '-';
		by = -by;
	}
	else if (op == '-' && by < 0.) {
		op = '+';
		by = -by;
	}
	else if (op == '*' && fabs(by) < 1.) {
		op = '/';
		by = 1 / by;
	}
	else if (op == '/' && fabs(by) < 1.) {
		op = '*';
		by = 1 / by;
	}
	forp->op = op;
	forp->by = by;
	forp->str = str;
	nextfor();
	unput('\n');
}
Пример #3
0
void
endfor(void)	/* end one iteration of for loop */
{
	switch (forp->op) {
	case '+':
	case ' ':
		forp->sym->s_val.f += forp->by;
		break;
	case '-':
		forp->sym->s_val.f -= forp->by;
		break;
	case '*':
		forp->sym->s_val.f *= forp->by;
		break;
	case '/':
		forp->sym->s_val.f /= forp->by;
		break;
	}
	nextfor();
}
Пример #4
0
void endfor(void)	/* end one iteration of for loop */
{
	struct symtab *p = lookup(forp->var);

	switch (forp->op) {
	case '+':
	case ' ':
		p->s_val.f += forp->by;
		break;
	case '-':
		p->s_val.f -= forp->by;
		break;
	case '*':
		p->s_val.f *= forp->by;
		break;
	case '/':
		p->s_val.f /= forp->by;
		break;
	}
	nextfor();
}