Annotation of researchv10no/cmd/picasso/for.c, revision 1.1

1.1     ! root        1: /*     Copyright (c) 1988 AT&T */
        !             2: /*       All Rights Reserved   */
        !             3: 
        !             4: /*     THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T     */
        !             5: /*     The copyright notice above does not evidence any        */
        !             6: /*     actual or intended publication of such source code.     */
        !             7: 
        !             8: /*     @(#)picasso:for.c       1.0     */
        !             9: #include "picasso.h"
        !            10: #include "y.tab.h"
        !            11: 
        !            12: #define        SLOP    1.001
        !            13: 
        !            14: typedef struct {
        !            15:        struct  symtab  *sym;   /* index variable */
        !            16:                float   to;     /* limit */
        !            17:                float   by;
        !            18:                int     op;     /* operator */
        !            19:                char    *str;   /* string to push back */
        !            20: } For;
        !            21: 
        !            22: For    forstk[10];     /* stack of for loops */
        !            23: For    *forp = forstk; /* pointer to current top */
        !            24: 
        !            25: forloop(var, from, to, op, by, str)    /* set up a for loop */
        !            26:        char *var;
        !            27:        double from, to, by;
        !            28:        int op;
        !            29:        char *str;
        !            30: {
        !            31:        if (++forp >= forstk+10)
        !            32:                fatal("for loop nested too deep");
        !            33: 
        !            34: /* note: actually we here want to take a vector variable and construct its   */
        !            35: /*      values directly, then access them one at a time below; the current  */
        !            36: /*      version is a temporary concession to old pic's version of the 'for' */
        !            37: 
        !            38:        forp->sym = findvar(var, VARNAME);
        !            39:        if (forp->sym->s_dim && forp->sym->s_val.a)
        !            40:                free(forp->sym->s_val.a);
        !            41:        forp->sym->s_dim = 0;
        !            42:        forp->sym->s_val.f = from;
        !            43:        forp->to = to;
        !            44:        if (by == 0.)
        !            45:                fatal("step size of 0 not allowed");
        !            46: 
        !            47:        /*  For additive or subtractive step, make sure step is positive.
        !            48:            Otherwise, make sure step is greater than 1 in absolute value. */
        !            49:        if ((op == ' ' || op == '+') && by < 0.) {
        !            50:                op = '-';
        !            51:                by = -by;
        !            52:        }
        !            53:        else if (op == '-' && by < 0.) {
        !            54:                op = '+';
        !            55:                by = -by;
        !            56:        }
        !            57:        else if (op == '*' && fabs(by) < 1.) {
        !            58:                op = '/';
        !            59:                by = 1 / by;
        !            60:        }
        !            61:        else if (op == '/' && fabs(by) < 1.) {
        !            62:                op = '*';
        !            63:                by = 1 / by;
        !            64:        }
        !            65:        forp->op = op;
        !            66:        forp->by = by;
        !            67:        forp->str = str;
        !            68:        nextfor();
        !            69:        unput('\n');
        !            70: }
        !            71: 
        !            72: nextfor()      /* do one iteration of a for loop */
        !            73: {
        !            74:        int     done;
        !            75:        float   v = forp->sym->s_val.f;
        !            76: 
        !            77:        switch (forp->op) {
        !            78:            case '+':
        !            79:            case ' ':
        !            80:                done = v > forp->to;
        !            81:                break;
        !            82:            case '-':
        !            83:                done = v < forp->to;
        !            84:                break;
        !            85:            case '*':
        !            86:                done = v * forp->to < 0. ? (fabs(forp->by) > 0)
        !            87:                                         : (fabs(v) > fabs(forp->to)) ;
        !            88:                break;
        !            89:            case '/':
        !            90:                done = v * forp->to < 0. ? (fabs(forp->by) > 0)
        !            91:                                         : (fabs(v) < fabs(forp->to)) ;
        !            92:                break;
        !            93:        }
        !            94:        if (done) {
        !            95:                free(forp->str);
        !            96:                if (--forp < forstk)
        !            97:                        fatal("forstk popped too far");
        !            98:        } else {                /* another iteration */
        !            99:                pushsrc(pString, "\n_Endfor\n");
        !           100:                pushsrc(pString, forp->str);
        !           101:        }
        !           102: }
        !           103: 
        !           104: endfor()       /* end one iteration of for loop */
        !           105: {
        !           106:        switch (forp->op) {
        !           107:        case '+':
        !           108:        case ' ':
        !           109:                forp->sym->s_val.f += forp->by;
        !           110:                break;
        !           111:        case '-':
        !           112:                forp->sym->s_val.f -= forp->by;
        !           113:                break;
        !           114:        case '*':
        !           115:                forp->sym->s_val.f *= forp->by;
        !           116:                break;
        !           117:        case '/':
        !           118:                forp->sym->s_val.f /= forp->by;
        !           119:                break;
        !           120:        }
        !           121:        nextfor();
        !           122: }
        !           123: 
        !           124: char *ifstat(expr, thenpart, elsepart)
        !           125:        double expr;
        !           126:        char *thenpart, *elsepart;
        !           127: {
        !           128:        if (expr) {
        !           129:                unput('\n');
        !           130:                pushsrc(Free, thenpart);
        !           131:                pushsrc(pString, thenpart);
        !           132:                unput('\n');
        !           133:                if (elsepart)
        !           134:                        free(elsepart);
        !           135:                return thenpart;        /* to be freed later */
        !           136:        } else {
        !           137:                free(thenpart);
        !           138:                if (elsepart) {
        !           139:                        unput('\n');
        !           140:                        pushsrc(Free, elsepart);
        !           141:                        pushsrc(pString, elsepart);
        !           142:                        unput('\n');
        !           143:                }
        !           144:                return elsepart;
        !           145:        }
        !           146: }

unix.superglobalmegacorp.com

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