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