1 b6d98463 2006-04-14 devnull #include <stdio.h>
2 b6d98463 2006-04-14 devnull #include "pic.h"
3 b6d98463 2006-04-14 devnull #include "y.tab.h"
5 b6d98463 2006-04-14 devnull #define SLOP 1.001
7 b6d98463 2006-04-14 devnull typedef struct {
8 b6d98463 2006-04-14 devnull char *var; /* index variable */
9 b6d98463 2006-04-14 devnull double to; /* limit */
10 b6d98463 2006-04-14 devnull double by;
11 b6d98463 2006-04-14 devnull int op; /* operator */
12 b6d98463 2006-04-14 devnull char *str; /* string to push back */
15 b6d98463 2006-04-14 devnull For forstk[10]; /* stack of for loops */
16 b6d98463 2006-04-14 devnull For *forp = forstk; /* pointer to current top */
19 b6d98463 2006-04-14 devnull forloop(char *var, double from, double to, int op, double by, char *str) /* set up a for loop */
21 b6d98463 2006-04-14 devnull dprintf("# for %s from %g to %g by %c %g \n",
22 b6d98463 2006-04-14 devnull var, from, to, op, by);
23 b6d98463 2006-04-14 devnull if (++forp >= forstk+10)
24 b6d98463 2006-04-14 devnull ERROR "for loop nested too deep" FATAL;
25 b6d98463 2006-04-14 devnull forp->var = var;
26 b6d98463 2006-04-14 devnull forp->to = to;
27 b6d98463 2006-04-14 devnull forp->op = op;
28 b6d98463 2006-04-14 devnull forp->by = by;
29 b6d98463 2006-04-14 devnull forp->str = str;
30 b6d98463 2006-04-14 devnull setfval(var, from);
31 b6d98463 2006-04-14 devnull nextfor();
32 b6d98463 2006-04-14 devnull unput('\n');
36 b6d98463 2006-04-14 devnull nextfor(void) /* do one iteration of a for loop */
38 b6d98463 2006-04-14 devnull /* BUG: this should depend on op and direction */
39 b6d98463 2006-04-14 devnull if (getfval(forp->var) > SLOP * forp->to) { /* loop is done */
40 b6d98463 2006-04-14 devnull free(forp->str);
41 b6d98463 2006-04-14 devnull if (--forp < forstk)
42 b6d98463 2006-04-14 devnull ERROR "forstk popped too far" FATAL;
43 b6d98463 2006-04-14 devnull } else { /* another iteration */
44 b6d98463 2006-04-14 devnull pushsrc(String, "\nEndfor\n");
45 b6d98463 2006-04-14 devnull pushsrc(String, forp->str);
50 b6d98463 2006-04-14 devnull endfor(void) /* end one iteration of for loop */
52 b6d98463 2006-04-14 devnull struct symtab *p = lookup(forp->var);
54 b6d98463 2006-04-14 devnull switch (forp->op) {
55 b6d98463 2006-04-14 devnull case '+':
56 b6d98463 2006-04-14 devnull case ' ':
57 b6d98463 2006-04-14 devnull p->s_val.f += forp->by;
59 b6d98463 2006-04-14 devnull case '-':
60 b6d98463 2006-04-14 devnull p->s_val.f -= forp->by;
62 b6d98463 2006-04-14 devnull case '*':
63 b6d98463 2006-04-14 devnull p->s_val.f *= forp->by;
65 b6d98463 2006-04-14 devnull case '/':
66 b6d98463 2006-04-14 devnull p->s_val.f /= forp->by;
69 b6d98463 2006-04-14 devnull nextfor();
73 b6d98463 2006-04-14 devnull ifstat(double expr, char *thenpart, char *elsepart)
75 b6d98463 2006-04-14 devnull dprintf("if %g then <%s> else <%s>\n", expr, thenpart, elsepart? elsepart : "");
76 b6d98463 2006-04-14 devnull if (expr) {
77 b6d98463 2006-04-14 devnull unput('\n');
78 b6d98463 2006-04-14 devnull pushsrc(Free, thenpart);
79 b6d98463 2006-04-14 devnull pushsrc(String, thenpart);
80 b6d98463 2006-04-14 devnull unput('\n');
81 b6d98463 2006-04-14 devnull if (elsepart)
82 b6d98463 2006-04-14 devnull free(elsepart);
83 b6d98463 2006-04-14 devnull return thenpart; /* to be freed later */
85 b6d98463 2006-04-14 devnull free(thenpart);
86 b6d98463 2006-04-14 devnull if (elsepart) {
87 b6d98463 2006-04-14 devnull unput('\n');
88 b6d98463 2006-04-14 devnull pushsrc(Free, elsepart);
89 b6d98463 2006-04-14 devnull pushsrc(String, elsepart);
90 b6d98463 2006-04-14 devnull unput('\n');
92 b6d98463 2006-04-14 devnull return elsepart;