Blame


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