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
forloop(var,from,to,op,by,str)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
nextfor()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
endfor()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
ifstat(expr,thenpart,elsepart)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