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