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 (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 }