Annotation of researchv10no/cmd/pic/for.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.