Annotation of researchv10no/cmd/f77/data.c, revision 1.1

1.1     ! root        1: #include "defs"
        !             2: 
        !             3: /* ROUTINES CALLED DURING DATA AND PARAMETER STATEMENT PROCESSING */
        !             4: 
        !             5: static char datafmt[] = "%s\t%05ld\t%05ld\t%d" ;
        !             6: 
        !             7: /* another initializer, called from parser */
        !             8: dataval(repp, valp)
        !             9: register expptr repp, valp;
        !            10: {
        !            11:        int i, nrep;
        !            12:        ftnint elen, vlen;
        !            13:        register Addrp p;
        !            14:        Addrp nextdata();
        !            15: 
        !            16:        if(repp == NULL)
        !            17:                nrep = 1;
        !            18:        else if (ISICON(repp) && repp->constblock.Const.ci >= 0)
        !            19:                nrep = repp->constblock.Const.ci;
        !            20:        else
        !            21:        {
        !            22:                err("invalid repetition count in DATA statement");
        !            23:                frexpr(repp);
        !            24:                goto ret;
        !            25:        }
        !            26:        frexpr(repp);
        !            27: 
        !            28:        if( ! ISCONST(valp) )
        !            29:        {
        !            30:                err("non-constant initializer");
        !            31:                goto ret;
        !            32:        }
        !            33: 
        !            34:        if(toomanyinit) goto ret;
        !            35:        for(i = 0 ; i < nrep ; ++i)
        !            36:        {
        !            37:                p = nextdata(&elen, &vlen);
        !            38:                if(p == NULL)
        !            39:                {
        !            40:                        err("too many initializers");
        !            41:                        toomanyinit = YES;
        !            42:                        goto ret;
        !            43:                }
        !            44:                setdata(p, valp, elen, vlen);
        !            45:                frexpr(p);
        !            46:        }
        !            47: 
        !            48: ret:
        !            49:        frexpr(valp);
        !            50: }
        !            51: 
        !            52: 
        !            53: Addrp nextdata(elenp, vlenp)
        !            54: ftnint *elenp, *vlenp;
        !            55: {
        !            56:        register struct Impldoblock *ip;
        !            57:        struct Primblock *pp;
        !            58:        register Namep np;
        !            59:        register struct Rplblock *rp;
        !            60:        tagptr p;
        !            61:        expptr neltp;
        !            62:        register expptr q;
        !            63:        int skip;
        !            64:        ftnint off;
        !            65: 
        !            66:        while(curdtp)
        !            67:        {
        !            68:                p = curdtp->datap;
        !            69:                if(p->tag == TIMPLDO)
        !            70:                {
        !            71:                        ip = &(p->impldoblock);
        !            72:                        if(ip->implb==NULL || ip->impub==NULL || ip->varnp==NULL)
        !            73:                                fatali("bad impldoblock 0%o", (int) ip);
        !            74:                        if(ip->isactive)
        !            75:                                ip->varvp->Const.ci += ip->impdiff;
        !            76:                        else
        !            77:                        {
        !            78:                                q = fixtype(cpexpr(ip->implb));
        !            79:                                if( ! ISICON(q) )
        !            80:                                        goto doerr;
        !            81:                                ip->varvp = (Constp) q;
        !            82: 
        !            83:                                if(ip->impstep)
        !            84:                                {
        !            85:                                        q = fixtype(cpexpr(ip->impstep));
        !            86:                                        if( ! ISICON(q) )
        !            87:                                                goto doerr;
        !            88:                                        ip->impdiff = q->constblock.Const.ci;
        !            89:                                        frexpr(q);
        !            90:                                }
        !            91:                                else
        !            92:                                        ip->impdiff = 1;
        !            93: 
        !            94:                                q = fixtype(cpexpr(ip->impub));
        !            95:                                if(! ISICON(q))
        !            96:                                        goto doerr;
        !            97:                                ip->implim = q->constblock.Const.ci;
        !            98:                                frexpr(q);
        !            99: 
        !           100:                                ip->isactive = YES;
        !           101:                                rp = ALLOC(Rplblock);
        !           102:                                rp->rplnextp = rpllist;
        !           103:                                rpllist = rp;
        !           104:                                rp->rplnp = ip->varnp;
        !           105:                                rp->rplvp = (expptr) (ip->varvp);
        !           106:                                rp->rpltag = TCONST;
        !           107:                        }
        !           108: 
        !           109:                        if( (ip->impdiff>0 && (ip->varvp->Const.ci <= ip->implim))
        !           110:                            || (ip->impdiff<0 && (ip->varvp->Const.ci >= ip->implim)) )
        !           111:                        { /* start new loop */
        !           112:                                curdtp = ip->datalist;
        !           113:                                goto next;
        !           114:                        }
        !           115: 
        !           116:                        /* clean up loop */
        !           117: 
        !           118:                        if(rpllist)
        !           119:                        {
        !           120:                                rp = rpllist;
        !           121:                                rpllist = rpllist->rplnextp;
        !           122:                                free( (charptr) rp);
        !           123:                        }
        !           124:                        else
        !           125:                                fatal("rpllist empty");
        !           126: 
        !           127:                        frexpr(ip->varvp);
        !           128:                        ip->isactive = NO;
        !           129:                        curdtp = curdtp->nextp;
        !           130:                        goto next;
        !           131:                }
        !           132: 
        !           133:                pp = (struct Primblock *) p;
        !           134:                np = pp->namep;
        !           135:                skip = YES;
        !           136: 
        !           137:                if(p->primblock.argsp==NULL && np->vdim!=NULL)
        !           138:                {   /* array initialization */
        !           139:                        q = (expptr) mkaddr(np);
        !           140:                        off = typesize[np->vtype] * curdtelt;
        !           141:                        if(np->vtype == TYCHAR)
        !           142:                                off *= np->vleng->constblock.Const.ci;
        !           143:                        q->addrblock.memoffset =
        !           144:                            mkexpr(OPPLUS, q->addrblock.memoffset, mkintcon(off) );
        !           145:                        if( (neltp = np->vdim->nelt) && ISCONST(neltp))
        !           146:                        {
        !           147:                                if(++curdtelt < neltp->constblock.Const.ci)
        !           148:                                        skip = NO;
        !           149:                        }
        !           150:                        else
        !           151:                                err("attempt to initialize adjustable array");
        !           152:                }
        !           153:                else
        !           154:                        q = mklhs( cpexpr(pp) );
        !           155:                if(skip)
        !           156:                {
        !           157:                        curdtp = curdtp->nextp;
        !           158:                        curdtelt = 0;
        !           159:                }
        !           160:                if(q->headblock.vtype == TYCHAR)
        !           161:                        if(ISICON(q->headblock.vleng))
        !           162:                                *elenp = q->headblock.vleng->constblock.Const.ci;
        !           163:                        else    {
        !           164:                                err("initialization of string of nonconstant length");
        !           165:                                continue;
        !           166:                        }
        !           167:                else    *elenp = typesize[q->headblock.vtype];
        !           168: 
        !           169:                if(np->vstg == STGCOMMON)
        !           170:                        *vlenp = extsymtab[np->vardesc.varno].maxleng;
        !           171:                else if(np->vstg == STGEQUIV)
        !           172:                        *vlenp = eqvclass[np->vardesc.varno].eqvleng;
        !           173:                else    {
        !           174:                        *vlenp =  (np->vtype==TYCHAR ?
        !           175:                            np->vleng->constblock.Const.ci :
        !           176:                            typesize[np->vtype]);
        !           177:                        if(np->vstg==STGBSS && *vlenp>0)
        !           178:                                np->vstg = STGINIT;
        !           179:                        if(np->vdim)
        !           180:                                *vlenp *= np->vdim->nelt->constblock.Const.ci;
        !           181:                }
        !           182:                return( (Addrp) q );
        !           183: 
        !           184: doerr:
        !           185:                err("nonconstant implied DO parameter");
        !           186:                frexpr(q);
        !           187:                curdtp = curdtp->nextp;
        !           188: 
        !           189: next:  
        !           190:                curdtelt = 0;
        !           191:        }
        !           192: 
        !           193:        return(NULL);
        !           194: }
        !           195: 
        !           196: 
        !           197: 
        !           198: 
        !           199: 
        !           200: 
        !           201: setdata(varp, valp, elen, vlen)
        !           202: register Addrp varp;
        !           203: ftnint elen, vlen;
        !           204: register Constp valp;
        !           205: {
        !           206:        union Constant con;
        !           207:        register int type;
        !           208:        int i, k, valtype;
        !           209:        ftnint offset;
        !           210:        char *dataname(), *varname;
        !           211: 
        !           212:        varname = dataname(varp->vstg, varp->memno);
        !           213:        offset = varp->memoffset->constblock.Const.ci;
        !           214:        type = varp->vtype;
        !           215:        valtype = valp->vtype;
        !           216:        if(type!=TYCHAR && valtype==TYCHAR)
        !           217:        {
        !           218:                if(! ftn66flag)
        !           219:                        warn("non-character datum initialized with character string");
        !           220:                varp->vleng = ICON(typesize[type]);
        !           221:                varp->vtype = type = TYCHAR;
        !           222:        }
        !           223:        else if( (type==TYCHAR && valtype!=TYCHAR) ||
        !           224:            (cktype(OPASSIGN,type,valtype) == TYERROR) )
        !           225:        {
        !           226:                err("incompatible types in initialization");
        !           227:                return;
        !           228:        }
        !           229:        if(type == TYADDR)
        !           230:                con.ci = valp->Const.ci;
        !           231:        else if(type != TYCHAR)
        !           232:        {
        !           233:                if(valtype == TYUNKNOWN)
        !           234:                        con.ci = valp->Const.ci;
        !           235:                else    consconv(type, &con, valtype, &valp->Const);
        !           236:        }
        !           237: 
        !           238:        k = 1;
        !           239:        switch(type)
        !           240:        {
        !           241:        case TYLOGICAL:
        !           242:                type = tylogical;
        !           243:        case TYSHORT:
        !           244:        case TYLONG:
        !           245:                dataline(varname, offset, vlen, type);
        !           246:                prconi(initfile, type, con.ci);
        !           247:                break;
        !           248: 
        !           249:        case TYADDR:
        !           250:                dataline(varname, offset, vlen, type);
        !           251:                prcona(initfile, con.ci);
        !           252:                break;
        !           253: 
        !           254:        case TYCOMPLEX:
        !           255:                k = 2;
        !           256:                type = TYREAL;
        !           257:        case TYREAL:
        !           258:                goto flpt;
        !           259: 
        !           260:        case TYDCOMPLEX:
        !           261:                k = 2;
        !           262:                type = TYDREAL;
        !           263:        case TYDREAL:
        !           264: flpt:
        !           265: 
        !           266:                for(i = 0 ; i < k ; ++i)
        !           267:                {
        !           268:                        dataline(varname, offset, vlen, type);
        !           269:                        prconr(initfile, type, con.cd[i]);
        !           270:                        offset += typesize[type];
        !           271:                }
        !           272:                break;
        !           273: 
        !           274:        case TYCHAR:
        !           275:                k = valp->vleng->constblock.Const.ci;
        !           276:                if(elen < k)
        !           277:                        k = elen;
        !           278: 
        !           279:                for(i = 0 ; i < k ; ++i)
        !           280:                {
        !           281:                        dataline(varname, offset++, vlen, TYCHAR);
        !           282:                        fprintf(initfile, "\t%d\n",
        !           283:                            valp->Const.ccp[i]);
        !           284:                }
        !           285:                k = elen - valp->vleng->constblock.Const.ci;
        !           286:                if(k > 0)
        !           287:                {
        !           288:                        dataline(varname, offset, vlen, TYBLANK);
        !           289:                        fprintf(initfile, "\t%d\n", k);
        !           290:                        offset += k;
        !           291:                }
        !           292:                break;
        !           293: 
        !           294:        default:
        !           295:                badtype("setdata", type);
        !           296:        }
        !           297: 
        !           298: }
        !           299: 
        !           300: 
        !           301: 
        !           302: /*
        !           303:    output form of name is padded with blanks and preceded
        !           304:    with a storage class digit
        !           305: */
        !           306: char *dataname(stg,memno)
        !           307: int stg, memno;
        !           308: {
        !           309:        static char varname[XL+2];
        !           310:        register char *s, *t;
        !           311:        char *memname();
        !           312: 
        !           313:        varname[0] = (stg==STGCOMMON ? '2' : (stg==STGEQUIV ? '1' : '0') );
        !           314:        s = memname(stg, memno);
        !           315:        for(t = varname+1 ; *s ; )
        !           316:                *t++ = *s++;
        !           317:        while(t < varname+XL+1)
        !           318:                *t++ = ' ';
        !           319:        varname[XL+1] = '\0';
        !           320:        return(varname);
        !           321: }
        !           322: 
        !           323: 
        !           324: 
        !           325: 
        !           326: 
        !           327: frdata(p0)
        !           328: chainp p0;
        !           329: {
        !           330:        register struct Chain *p;
        !           331:        register tagptr q;
        !           332: 
        !           333:        for(p = p0 ; p ; p = p->nextp)
        !           334:        {
        !           335:                q = p->datap;
        !           336:                if(q->tag == TIMPLDO)
        !           337:                {
        !           338:                        if(q->impldoblock.isbusy)
        !           339:                                return; /* circular chain completed */
        !           340:                        q->impldoblock.isbusy = YES;
        !           341:                        frdata(q->impldoblock.datalist);
        !           342:                        free( (charptr) q);
        !           343:                }
        !           344:                else
        !           345:                        frexpr(q);
        !           346:        }
        !           347: 
        !           348:        frchain( &p0);
        !           349: }
        !           350: 
        !           351: 
        !           352: 
        !           353: dataline(varname, offset, vlen, type)
        !           354: char *varname;
        !           355: ftnint offset, vlen;
        !           356: int type;
        !           357: {
        !           358:        fprintf(initfile, datafmt, varname, offset, vlen, type);
        !           359: }
        !           360: 
        !           361: 
        !           362:  void
        !           363: make_param(p, e)
        !           364:  register struct Paramblock *p;
        !           365:  expptr e;
        !           366: {
        !           367:        p->vclass = CLPARAM;
        !           368:        impldcl(p);
        !           369:        if (p->vtype != ((Constp)e)->vtype && bugwarn & 1)
        !           370:                warnb1("old f77 typed parameter %s incorrectly",
        !           371:                        varstr(VL, p->varname));
        !           372:        p->paramval = (bugwarn & 2) ? e : mkconv(p->vtype, e);
        !           373:        }

unix.superglobalmegacorp.com

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