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