1*23961Sjaap #ifndef lint
2*23961Sjaap static char sccsid[] = "@(#)for.c	1.1 (CWI) 85/07/19";
3*23961Sjaap #endif lint
4*23961Sjaap #include <stdio.h>
5*23961Sjaap #include "grap.h"
6*23961Sjaap #include "y.tab.h"
7*23961Sjaap 
8*23961Sjaap typedef struct {
9*23961Sjaap 	Obj	*var;	/* index variable */
10*23961Sjaap 	double	to;	/* limit */
11*23961Sjaap 	double	by;
12*23961Sjaap 	int	op;	/* operator */
13*23961Sjaap 	char	*str;	/* string to push back */
14*23961Sjaap } For;
15*23961Sjaap 
16*23961Sjaap #define	MAXFOR	10
17*23961Sjaap 
18*23961Sjaap For	forstk[MAXFOR];	/* stack of for loops */
19*23961Sjaap For	*forp = forstk;	/* pointer to current top */
20*23961Sjaap 
forloop(var,from,to,op,by,str)21*23961Sjaap forloop(var, from, to, op, by, str)	/* set up a for loop */
22*23961Sjaap 	Obj *var;
23*23961Sjaap 	double from, to, by;
24*23961Sjaap 	int op;
25*23961Sjaap 	char *str;
26*23961Sjaap {
27*23961Sjaap 	fprintf(tfd, "# for %s from %g to %g by %c %g \n",
28*23961Sjaap 		var->name, from, to, op, by);
29*23961Sjaap 	if (++forp >= forstk+MAXFOR)
30*23961Sjaap 		fatal("for loop nested too deep");
31*23961Sjaap 	forp->var = var;
32*23961Sjaap 	forp->to = to;
33*23961Sjaap 	forp->op = op;
34*23961Sjaap 	forp->by = by;
35*23961Sjaap 	forp->str = str;
36*23961Sjaap 	setvar(var, from);
37*23961Sjaap 	nextfor();
38*23961Sjaap 	unput('\n');
39*23961Sjaap }
40*23961Sjaap 
nextfor()41*23961Sjaap nextfor()	/* do one iteration of a for loop */
42*23961Sjaap {
43*23961Sjaap 	/* BUG:  this should depend on op and direction */
44*23961Sjaap 	if (forp->var->fval > SLOP * forp->to) {	/* loop is done */
45*23961Sjaap 		free(forp->str);
46*23961Sjaap 		if (--forp < forstk)
47*23961Sjaap 			fatal("forstk popped too far");
48*23961Sjaap 	} else {		/* another iteration */
49*23961Sjaap 		pushsrc(String, "\nEndfor\n");
50*23961Sjaap 		pushsrc(String, forp->str);
51*23961Sjaap 	}
52*23961Sjaap }
53*23961Sjaap 
endfor()54*23961Sjaap endfor()	/* end one iteration of for loop */
55*23961Sjaap {
56*23961Sjaap 	switch (forp->op) {
57*23961Sjaap 	case '+':
58*23961Sjaap 	case ' ':
59*23961Sjaap 		forp->var->fval += forp->by;
60*23961Sjaap 		break;
61*23961Sjaap 	case '-':
62*23961Sjaap 		forp->var->fval -= forp->by;
63*23961Sjaap 		break;
64*23961Sjaap 	case '*':
65*23961Sjaap 		forp->var->fval *= forp->by;
66*23961Sjaap 		break;
67*23961Sjaap 	case '/':
68*23961Sjaap 		forp->var->fval /= forp->by;
69*23961Sjaap 		break;
70*23961Sjaap 	}
71*23961Sjaap 	nextfor();
72*23961Sjaap }
73*23961Sjaap 
ifstat(expr,thenpart,elsepart)74*23961Sjaap char *ifstat(expr, thenpart, elsepart)
75*23961Sjaap 	double expr;
76*23961Sjaap 	char *thenpart, *elsepart;
77*23961Sjaap {
78*23961Sjaap 	dprintf("if %g then <%s> else <%s>\n", expr, thenpart, elsepart? elsepart : "");
79*23961Sjaap 	if (expr) {
80*23961Sjaap 		unput('\n');
81*23961Sjaap 		pushsrc(Free, thenpart);
82*23961Sjaap 		pushsrc(String, thenpart);
83*23961Sjaap 		unput('\n');
84*23961Sjaap   		if (elsepart)
85*23961Sjaap 			free(elsepart);
86*23961Sjaap 		return thenpart;	/* to be freed later */
87*23961Sjaap 	} else {
88*23961Sjaap 		free(thenpart);
89*23961Sjaap 		if (elsepart) {
90*23961Sjaap 			unput('\n');
91*23961Sjaap 			pushsrc(Free, elsepart);
92*23961Sjaap 			pushsrc(String, elsepart);
93*23961Sjaap 			unput('\n');
94*23961Sjaap 		}
95*23961Sjaap 		return elsepart;
96*23961Sjaap 	}
97*23961Sjaap }
98