8 char *var; /* index variable */
11 int op; /* operator */
12 char *str; /* string to push back */
15 For forstk[10]; /* stack of for loops */
16 For *forp = forstk; /* pointer to current top */
19 forloop(char *var, double from, double to, int op, double by, char *str) /* set up a for loop */
21 dprintf("# for %s from %g to %g by %c %g \n",
22 var, from, to, op, by);
23 if (++forp >= forstk+10)
24 ERROR "for loop nested too deep" FATAL;
36 nextfor(void) /* do one iteration of a for loop */
38 /* BUG: this should depend on op and direction */
39 if (getfval(forp->var) > SLOP * forp->to) { /* loop is done */
42 ERROR "forstk popped too far" FATAL;
43 } else { /* another iteration */
44 pushsrc(String, "\nEndfor\n");
45 pushsrc(String, forp->str);
50 endfor(void) /* end one iteration of for loop */
52 struct symtab *p = lookup(forp->var);
57 p->s_val.f += forp->by;
60 p->s_val.f -= forp->by;
63 p->s_val.f *= forp->by;
66 p->s_val.f /= forp->by;
73 ifstat(double expr, char *thenpart, char *elsepart)
75 dprintf("if %g then <%s> else <%s>\n", expr, thenpart, elsepart? elsepart : "");
78 pushsrc(Free, thenpart);
79 pushsrc(String, thenpart);
83 return thenpart; /* to be freed later */
88 pushsrc(Free, elsepart);
89 pushsrc(String, elsepart);