Blame


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