Blob


1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "pic.h"
4 #include "y.tab.h"
6 #define SLOP 1.001
8 typedef struct {
9 char *var; /* index variable */
10 double to; /* limit */
11 double by;
12 int op; /* operator */
13 char *str; /* string to push back */
14 } For;
16 For forstk[10]; /* stack of for loops */
17 For *forp = forstk; /* pointer to current top */
19 void setfval(char *, double);
20 void nextfor(void);
22 void forloop(char *var, double from, double to, int op,
23 double by, char *str) /* set up a for loop */
24 {
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;
29 forp->var = var;
30 forp->to = to;
31 forp->op = op;
32 forp->by = by;
33 forp->str = str;
34 setfval(var, from);
35 nextfor();
36 unput('\n');
37 }
39 void nextfor(void) /* do one iteration of a for loop */
40 {
41 /* BUG: this should depend on op and direction */
42 if (getfval(forp->var) > SLOP * forp->to) { /* loop is done */
43 free(forp->str);
44 if (--forp < forstk)
45 ERROR "forstk popped too far" FATAL;
46 } else { /* another iteration */
47 pushsrc(String, "\nEndfor\n");
48 pushsrc(String, forp->str);
49 }
50 }
52 void endfor(void) /* end one iteration of for loop */
53 {
54 struct symtab *p = lookup(forp->var);
56 switch (forp->op) {
57 case '+':
58 case ' ':
59 p->s_val.f += forp->by;
60 break;
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 }
71 nextfor();
72 }
74 char *ifstat(double expr, char *thenpart, char *elsepart)
75 {
76 dprintf("if %g then <%s> else <%s>\n", expr, thenpart, elsepart? elsepart : "");
77 if (expr) {
78 unput('\n');
79 pushsrc(Free, thenpart);
80 pushsrc(String, thenpart);
81 unput('\n');
82 if (elsepart)
83 free(elsepart);
84 return thenpart; /* to be freed later */
85 } else {
86 free(thenpart);
87 if (elsepart) {
88 unput('\n');
89 pushsrc(Free, elsepart);
90 pushsrc(String, elsepart);
91 unput('\n');
92 }
93 return elsepart;
94 }
95 }