for.c (1890B)
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 }