URI:
       tfor.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tfor.c (1877B)
       ---
            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         double        to;        /* limit */
           10         double        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 void
           19 forloop(char *var, double from, double to, int op, double by, char *str)        /* set up a for loop */
           20 {
           21         dprintf("# for %s from %g to %g by %c %g \n",
           22                 var, from, to, op, by);
           23         if (++forp >= forstk+10)
           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         setfval(var, from);
           31         nextfor();
           32         unput('\n');
           33 }
           34 
           35 void
           36 nextfor(void)        /* do one iteration of a for loop */
           37 {
           38         /* BUG:  this should depend on op and direction */
           39         if (getfval(forp->var) > SLOP * forp->to) {        /* loop is done */
           40                 free(forp->str);
           41                 if (--forp < forstk)
           42                         ERROR "forstk popped too far" FATAL;
           43         } else {                /* another iteration */
           44                 pushsrc(String, "\nEndfor\n");
           45                 pushsrc(String, forp->str);
           46         }
           47 }
           48 
           49 void
           50 endfor(void)        /* end one iteration of for loop */
           51 {
           52         struct symtab *p = lookup(forp->var);
           53 
           54         switch (forp->op) {
           55         case '+':
           56         case ' ':
           57                 p->s_val.f += forp->by;
           58                 break;
           59         case '-':
           60                 p->s_val.f -= forp->by;
           61                 break;
           62         case '*':
           63                 p->s_val.f *= forp->by;
           64                 break;
           65         case '/':
           66                 p->s_val.f /= forp->by;
           67                 break;
           68         }
           69         nextfor();
           70 }
           71 
           72 char*
           73 ifstat(double expr, char *thenpart, char *elsepart)
           74 {
           75         dprintf("if %g then <%s> else <%s>\n", expr, thenpart, elsepart? elsepart : "");
           76         if (expr) {
           77                 unput('\n');
           78                 pushsrc(Free, thenpart);
           79                 pushsrc(String, thenpart);
           80                 unput('\n');
           81                   if (elsepart)
           82                         free(elsepart);
           83                 return thenpart;        /* to be freed later */
           84         } else {
           85                 free(thenpart);
           86                 if (elsepart) {
           87                         unput('\n');
           88                         pushsrc(Free, elsepart);
           89                         pushsrc(String, elsepart);
           90                         unput('\n');
           91                 }
           92                 return elsepart;
           93         }
           94 }