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