Annotation of 3BSD/cmd/f77/equiv.c, revision 1.1

1.1     ! root        1: #include "defs"
        !             2: 
        !             3: #ifdef SDB
        !             4: #      include <a.out.h>
        !             5: #endif
        !             6: 
        !             7: /* ROUTINES RELATED TO EQUIVALENCE CLASS PROCESSING */
        !             8: 
        !             9: /* called at end of declarations section to process chains
        !            10:    created by EQUIVALENCE statements
        !            11:  */
        !            12: doequiv()
        !            13: {
        !            14: register int i;
        !            15: int inequiv, comno, ovarno;
        !            16: ftnint comoffset, offset, leng;
        !            17: register struct Equivblock *p;
        !            18: register struct Eqvchain *q;
        !            19: struct Primblock *itemp;
        !            20: register struct Nameblock *np;
        !            21: expptr offp, suboffset();
        !            22: int ns, nsubs();
        !            23: chainp cp;
        !            24: 
        !            25: for(i = 0 ; i < nequiv ; ++i)
        !            26:        {
        !            27:        p = &eqvclass[i];
        !            28:        p->eqvbottom = p->eqvtop = 0;
        !            29:        comno = -1;
        !            30: 
        !            31:        for(q = p->equivs ; q ; q = q->nextp)
        !            32:                {
        !            33:                itemp = q->eqvitem;
        !            34:                vardcl(np = itemp->namep);
        !            35:                if(itemp->argsp || itemp->fcharp)
        !            36:                        {
        !            37:                        if(np->vdim!=NULL && np->vdim->ndim>1 &&
        !            38:                           nsubs(itemp->argsp)==1 )
        !            39:                                {
        !            40:                                if(! ftn66flag)
        !            41:                                        warn("1-dim subscript in EQUIVALENCE");
        !            42:                                cp = NULL;
        !            43:                                ns = np->vdim->ndim;
        !            44:                                while(--ns > 0)
        !            45:                                        cp = mkchain( ICON(1), cp);
        !            46:                                itemp->argsp->listp->nextp = cp;
        !            47:                                }
        !            48:                        offp = suboffset(itemp);
        !            49:                        }
        !            50:                else    offp = ICON(0);
        !            51:                if(ISICON(offp))
        !            52:                        offset = q->eqvoffset = offp->constblock.const.ci;
        !            53:                else    {
        !            54:                        dclerr("nonconstant subscript in equivalence ", np);
        !            55:                        np = NULL;
        !            56:                        goto endit;
        !            57:                        }
        !            58:                if( (leng = iarrlen(np)) < 0)
        !            59:                        {
        !            60:                        dclerr("adjustable in equivalence", np);
        !            61:                        np = NULL;
        !            62:                        goto endit;
        !            63:                        }
        !            64:                p->eqvbottom = lmin(p->eqvbottom, -offset);
        !            65:                p->eqvtop = lmax(p->eqvtop, leng-offset);
        !            66: 
        !            67:                switch(np->vstg)
        !            68:                        {
        !            69:                        case STGUNKNOWN:
        !            70:                        case STGBSS:
        !            71:                        case STGEQUIV:
        !            72:                                break;
        !            73: 
        !            74:                        case STGCOMMON:
        !            75:                                comno = np->vardesc.varno;
        !            76:                                comoffset = np->voffset + offset;
        !            77:                                break;
        !            78: 
        !            79:                        default:
        !            80:                                dclerr("bad storage class in equivalence", np);
        !            81:                                np = NULL;
        !            82:                                goto endit;
        !            83:                        }
        !            84:        endit:
        !            85:                frexpr(offp);
        !            86:                q->eqvitem = np;
        !            87:                }
        !            88: 
        !            89:        if(comno >= 0)
        !            90:                eqvcommon(p, comno, comoffset);
        !            91:        else  for(q = p->equivs ; q ; q = q->nextp)
        !            92:                {
        !            93:                if(np = q->eqvitem)
        !            94:                        {
        !            95:                        inequiv = NO;
        !            96:                        if(np->vstg==STGEQUIV)
        !            97:                                if( (ovarno = np->vardesc.varno) == i)
        !            98:                                        {
        !            99:                                        if(np->voffset + q->eqvoffset != 0)
        !           100:                                                dclerr("inconsistent equivalence", np);
        !           101:                                        }
        !           102:                                else    {
        !           103:                                        offset = np->voffset;
        !           104:                                        inequiv = YES;
        !           105:                                        }
        !           106: 
        !           107:                        np->vstg = STGEQUIV;
        !           108:                        np->vardesc.varno = i;
        !           109:                        np->voffset = - q->eqvoffset;
        !           110: 
        !           111:                        if(inequiv)
        !           112:                                eqveqv(i, ovarno, q->eqvoffset + offset);
        !           113:                        }
        !           114:                }
        !           115:        }
        !           116: 
        !           117: for(i = 0 ; i < nequiv ; ++i)
        !           118:        {
        !           119:        p = & eqvclass[i];
        !           120:        if(p->eqvbottom!=0 || p->eqvtop!=0)     /* a live chain */
        !           121:                {
        !           122: #ifdef SDB
        !           123:                if(sdbflag)
        !           124:                        prstab(NULL, N_BCOMM, 0, 0);
        !           125: #endif
        !           126:                for(q = p->equivs ; q; q = q->nextp)
        !           127:                        {
        !           128:                        np = q->eqvitem;
        !           129:                        np->voffset -= p->eqvbottom;
        !           130:                        if(np->voffset % typealign[np->vtype] != 0)
        !           131:                                dclerr("bad alignment forced by equivalence", np);
        !           132: #ifdef SDB
        !           133:                        if(sdbflag)
        !           134:                                {
        !           135:                                prstssym(np);
        !           136:                                prstleng(np, iarrlen(np));
        !           137:                                }
        !           138: #endif
        !           139:                        }
        !           140:                p->eqvtop -= p->eqvbottom;
        !           141:                p->eqvbottom = 0;
        !           142: #ifdef SDB
        !           143:                        if(sdbflag)
        !           144:                                prstab(NULL, N_ECOML, 0, memname(STGEQUIV,i) );
        !           145: #endif
        !           146:                }
        !           147:        freqchain(p);
        !           148:        }
        !           149: }
        !           150: 
        !           151: 
        !           152: 
        !           153: 
        !           154: 
        !           155: /* put equivalence chain p at common block comno + comoffset */
        !           156: 
        !           157: LOCAL eqvcommon(p, comno, comoffset)
        !           158: struct Equivblock *p;
        !           159: int comno;
        !           160: ftnint comoffset;
        !           161: {
        !           162: int ovarno;
        !           163: ftnint k, offq;
        !           164: register struct Nameblock *np;
        !           165: register struct Eqvchain *q;
        !           166: 
        !           167: if(comoffset + p->eqvbottom < 0)
        !           168:        {
        !           169:        errstr("attempt to extend common %s backward",
        !           170:                nounder(XL, extsymtab[comno].extname) );
        !           171:        freqchain(p);
        !           172:        return;
        !           173:        }
        !           174: 
        !           175: if( (k = comoffset + p->eqvtop) > extsymtab[comno].extleng)
        !           176:        extsymtab[comno].extleng = k;
        !           177: 
        !           178: #ifdef SDB
        !           179: if(sdbflag)
        !           180:        prstab( varstr(XL,extsymtab[comno].extname), N_BCOMM,0,0);
        !           181: #endif
        !           182: 
        !           183: for(q = p->equivs ; q ; q = q->nextp)
        !           184:        if(np = q->eqvitem)
        !           185:                {
        !           186:                switch(np->vstg)
        !           187:                        {
        !           188:                        case STGUNKNOWN:
        !           189:                        case STGBSS:
        !           190:                                np->vstg = STGCOMMON;
        !           191:                                np->vardesc.varno = comno;
        !           192:                                np->voffset = comoffset - q->eqvoffset;
        !           193: #ifdef SDB
        !           194:                                if(sdbflag)
        !           195:                                        {
        !           196:                                        prstssym(np);
        !           197:                                        prstleng(np, iarrlen(np));
        !           198:                                        }
        !           199: #endif
        !           200:                                break;
        !           201: 
        !           202:                        case STGEQUIV:
        !           203:                                ovarno = np->vardesc.varno;
        !           204:                                offq = comoffset - q->eqvoffset - np->voffset;
        !           205:                                np->vstg = STGCOMMON;
        !           206:                                np->vardesc.varno = comno;
        !           207:                                np->voffset = comoffset - q->eqvoffset;
        !           208:                                if(ovarno != (p - eqvclass))
        !           209:                                        eqvcommon(&eqvclass[ovarno], comno, offq);
        !           210:                                break;
        !           211: 
        !           212:                        case STGCOMMON:
        !           213:                                if(comno != np->vardesc.varno ||
        !           214:                                   comoffset != np->voffset+q->eqvoffset)
        !           215:                                        dclerr("inconsistent common usage", np);
        !           216:                                break;
        !           217: 
        !           218: 
        !           219:                        default:
        !           220:                                fatali("eqvcommon: impossible vstg %d", np->vstg);
        !           221:                        }
        !           222:                }
        !           223: 
        !           224: #ifdef SDB
        !           225: if(sdbflag)
        !           226:        prstab( varstr(XL,extsymtab[comno].extname), N_ECOMM,0,0);
        !           227: #endif
        !           228: 
        !           229: freqchain(p);
        !           230: p->eqvbottom = p->eqvtop = 0;
        !           231: }
        !           232: 
        !           233: 
        !           234: /* put all items on ovarno chain on front of nvarno chain
        !           235:  * adjust offsets of ovarno elements and top and bottom of nvarno chain
        !           236:  */
        !           237: 
        !           238: LOCAL eqveqv(nvarno, ovarno, delta)
        !           239: int ovarno, nvarno;
        !           240: ftnint delta;
        !           241: {
        !           242: register struct Equivblock *p0, *p;
        !           243: register struct Nameblock *np;
        !           244: struct Eqvchain *q, *q1;
        !           245: 
        !           246: p0 = eqvclass + nvarno;
        !           247: p = eqvclass + ovarno;
        !           248: p0->eqvbottom = lmin(p0->eqvbottom, p->eqvbottom - delta);
        !           249: p0->eqvtop = lmax(p0->eqvtop, p->eqvtop - delta);
        !           250: p->eqvbottom = p->eqvtop = 0;
        !           251: 
        !           252: for(q = p->equivs ; q ; q = q1)
        !           253:        {
        !           254:        q1 = q->nextp;
        !           255:        if( (np = q->eqvitem) && np->vardesc.varno==ovarno)
        !           256:                {
        !           257:                q->nextp = p0->equivs;
        !           258:                p0->equivs = q;
        !           259:                q->eqvoffset -= delta;
        !           260:                np->vardesc.varno = nvarno;
        !           261:                np->voffset -= delta;
        !           262:                }
        !           263:        else    free(q);
        !           264:        }
        !           265: p->equivs = NULL;
        !           266: }
        !           267: 
        !           268: 
        !           269: 
        !           270: 
        !           271: LOCAL freqchain(p)
        !           272: register struct Equivblock *p;
        !           273: {
        !           274: register struct Eqvchain *q, *oq;
        !           275: 
        !           276: for(q = p->equivs ; q ; q = oq)
        !           277:        {
        !           278:        oq = q->nextp;
        !           279:        free(q);
        !           280:        }
        !           281: p->equivs = NULL;
        !           282: }
        !           283: 
        !           284: 
        !           285: 
        !           286: 
        !           287: 
        !           288: LOCAL nsubs(p)
        !           289: register struct Listblock *p;
        !           290: {
        !           291: register int n;
        !           292: register chainp q;
        !           293: 
        !           294: n = 0;
        !           295: if(p)
        !           296:        for(q = p->listp ; q ; q = q->nextp)
        !           297:                ++n;
        !           298: 
        !           299: return(n);
        !           300: }

unix.superglobalmegacorp.com

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