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