Blame


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"
4 b6d98463 2006-04-14 devnull
5 b6d98463 2006-04-14 devnull #define SLOP 1.001
6 b6d98463 2006-04-14 devnull
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 */
13 b6d98463 2006-04-14 devnull } For;
14 b6d98463 2006-04-14 devnull
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 */
17 b6d98463 2006-04-14 devnull
18 b6d98463 2006-04-14 devnull void
19 b6d98463 2006-04-14 devnull forloop(char *var, double from, double to, int op, double by, char *str) /* set up a for loop */
20 b6d98463 2006-04-14 devnull {
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');
33 b6d98463 2006-04-14 devnull }
34 b6d98463 2006-04-14 devnull
35 b6d98463 2006-04-14 devnull void
36 b6d98463 2006-04-14 devnull nextfor(void) /* do one iteration of a for loop */
37 b6d98463 2006-04-14 devnull {
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);
46 b6d98463 2006-04-14 devnull }
47 b6d98463 2006-04-14 devnull }
48 b6d98463 2006-04-14 devnull
49 b6d98463 2006-04-14 devnull void
50 b6d98463 2006-04-14 devnull endfor(void) /* end one iteration of for loop */
51 b6d98463 2006-04-14 devnull {
52 b6d98463 2006-04-14 devnull struct symtab *p = lookup(forp->var);
53 b6d98463 2006-04-14 devnull
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;
58 b6d98463 2006-04-14 devnull break;
59 b6d98463 2006-04-14 devnull case '-':
60 b6d98463 2006-04-14 devnull p->s_val.f -= forp->by;
61 b6d98463 2006-04-14 devnull break;
62 b6d98463 2006-04-14 devnull case '*':
63 b6d98463 2006-04-14 devnull p->s_val.f *= forp->by;
64 b6d98463 2006-04-14 devnull break;
65 b6d98463 2006-04-14 devnull case '/':
66 b6d98463 2006-04-14 devnull p->s_val.f /= forp->by;
67 b6d98463 2006-04-14 devnull break;
68 b6d98463 2006-04-14 devnull }
69 b6d98463 2006-04-14 devnull nextfor();
70 b6d98463 2006-04-14 devnull }
71 b6d98463 2006-04-14 devnull
72 b6d98463 2006-04-14 devnull char*
73 b6d98463 2006-04-14 devnull ifstat(double expr, char *thenpart, char *elsepart)
74 b6d98463 2006-04-14 devnull {
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 */
84 b6d98463 2006-04-14 devnull } else {
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');
91 b6d98463 2006-04-14 devnull }
92 b6d98463 2006-04-14 devnull return elsepart;
93 b6d98463 2006-04-14 devnull }
94 b6d98463 2006-04-14 devnull }