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