|
|
1.1 root 1: #include <stdio.h>
2: #include <stdlib.h>
3: #include "pic.h"
4: #include "y.tab.h"
5:
6: #define SLOP 1.001
7:
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;
15:
16: For forstk[10]; /* stack of for loops */
17: For *forp = forstk; /* pointer to current top */
18:
19: void setfval(char *, double);
20: void nextfor(void);
21:
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: }
38:
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: }
51:
52: void endfor(void) /* end one iteration of for loop */
53: {
54: struct symtab *p = lookup(forp->var);
55:
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: }
73:
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.