9 char *var
; /* index variable */
10 double to
; /* limit */
12 int op
; /* operator */
13 char *str
; /* string to push back */
16 For forstk
[10]; /* stack of for loops */
17 For
*forp
= forstk
; /* pointer to current top */
19 void setfval(char *, double);
22 void forloop(char *var
, double from
, double to
, int op
,
23 double by
, char *str
) /* set up a for loop */
25 dprintf("# for %s from %g to %g by %c %g \n",
26 var
, from
, to
, op
, by
);
27 if (++forp
>= forstk
+10)
28 ERROR
"for loop nested too deep" FATAL
;
39 void nextfor(void) /* do one iteration of a for loop */
41 /* BUG: this should depend on op and direction */
42 if (getfval(forp
->var
) > SLOP
* forp
->to
) { /* loop is done */
45 ERROR
"forstk popped too far" FATAL
;
46 } else { /* another iteration */
47 pushsrc(String
, "\nEndfor\n");
48 pushsrc(String
, forp
->str
);
52 void endfor(void) /* end one iteration of for loop */
54 struct symtab
*p
= lookup(forp
->var
);
59 p
->s_val
.f
+= forp
->by
;
62 p
->s_val
.f
-= forp
->by
;
65 p
->s_val
.f
*= forp
->by
;
68 p
->s_val
.f
/= forp
->by
;
74 char *ifstat(double expr
, char *thenpart
, char *elsepart
)
76 dprintf("if %g then <%s> else <%s>\n", expr
, thenpart
, elsepart
? elsepart
: "");
79 pushsrc(Free
, thenpart
);
80 pushsrc(String
, thenpart
);
84 return thenpart
; /* to be freed later */
89 pushsrc(Free
, elsepart
);
90 pushsrc(String
, elsepart
);