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