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