Annotation of researchv10no/cmd/f2c/data.c, revision 1.1.1.1

1.1       root        1: /****************************************************************
                      2: Copyright 1990, 1993 by AT&T Bell Laboratories and Bellcore.
                      3: 
                      4: Permission to use, copy, modify, and distribute this software
                      5: and its documentation for any purpose and without fee is hereby
                      6: granted, provided that the above copyright notice appear in all
                      7: copies and that both that the copyright notice and this
                      8: permission notice and warranty disclaimer appear in supporting
                      9: documentation, and that the names of AT&T Bell Laboratories or
                     10: Bellcore or any of their entities not be used in advertising or
                     11: publicity pertaining to distribution of the software without
                     12: specific, written prior permission.
                     13: 
                     14: AT&T and Bellcore disclaim all warranties with regard to this
                     15: software, including all implied warranties of merchantability
                     16: and fitness.  In no event shall AT&T or Bellcore be liable for
                     17: any special, indirect or consequential damages or any damages
                     18: whatsoever resulting from loss of use, data or profits, whether
                     19: in an action of contract, negligence or other tortious action,
                     20: arising out of or in connection with the use or performance of
                     21: this software.
                     22: ****************************************************************/
                     23: 
                     24: #include "defs.h"
                     25: 
                     26: /* ROUTINES CALLED DURING DATA AND PARAMETER STATEMENT PROCESSING */
                     27: 
                     28: static char datafmt[] = "%s\t%09ld\t%d";
                     29: static char *cur_varname;
                     30: 
                     31: /* another initializer, called from parser */
                     32: dataval(repp, valp)
                     33: register expptr repp, valp;
                     34: {
                     35:        int i, nrep;
                     36:        ftnint elen;
                     37:        register Addrp p;
                     38:        Addrp nextdata();
                     39: 
                     40:        if (parstate < INDATA) {
                     41:                frexpr(repp);
                     42:                goto ret;
                     43:                }
                     44:        if(repp == NULL)
                     45:                nrep = 1;
                     46:        else if (ISICON(repp) && repp->constblock.Const.ci >= 0)
                     47:                nrep = repp->constblock.Const.ci;
                     48:        else
                     49:        {
                     50:                err("invalid repetition count in DATA statement");
                     51:                frexpr(repp);
                     52:                goto ret;
                     53:        }
                     54:        frexpr(repp);
                     55: 
                     56:        if( ! ISCONST(valp) )
                     57:        {
                     58:                err("non-constant initializer");
                     59:                goto ret;
                     60:        }
                     61: 
                     62:        if(toomanyinit) goto ret;
                     63:        for(i = 0 ; i < nrep ; ++i)
                     64:        {
                     65:                p = nextdata(&elen);
                     66:                if(p == NULL)
                     67:                {
                     68:                        err("too many initializers");
                     69:                        toomanyinit = YES;
                     70:                        goto ret;
                     71:                }
                     72:                setdata((Addrp)p, (Constp)valp, elen);
                     73:                frexpr((expptr)p);
                     74:        }
                     75: 
                     76: ret:
                     77:        frexpr(valp);
                     78: }
                     79: 
                     80: 
                     81: Addrp nextdata(elenp)
                     82: ftnint *elenp;
                     83: {
                     84:        register struct Impldoblock *ip;
                     85:        struct Primblock *pp;
                     86:        register Namep np;
                     87:        register struct Rplblock *rp;
                     88:        tagptr p;
                     89:        expptr neltp;
                     90:        register expptr q;
                     91:        int skip;
                     92:        ftnint off, vlen;
                     93: 
                     94:        while(curdtp)
                     95:        {
                     96:                p = (tagptr)curdtp->datap;
                     97:                if(p->tag == TIMPLDO)
                     98:                {
                     99:                        ip = &(p->impldoblock);
                    100:                        if(ip->implb==NULL || ip->impub==NULL || ip->varnp==NULL)
                    101:                                fatali("bad impldoblock 0%o", (int) ip);
                    102:                        if(ip->isactive)
                    103:                                ip->varvp->Const.ci += ip->impdiff;
                    104:                        else
                    105:                        {
                    106:                                q = fixtype(cpexpr(ip->implb));
                    107:                                if( ! ISICON(q) )
                    108:                                        goto doerr;
                    109:                                ip->varvp = (Constp) q;
                    110: 
                    111:                                if(ip->impstep)
                    112:                                {
                    113:                                        q = fixtype(cpexpr(ip->impstep));
                    114:                                        if( ! ISICON(q) )
                    115:                                                goto doerr;
                    116:                                        ip->impdiff = q->constblock.Const.ci;
                    117:                                        frexpr(q);
                    118:                                }
                    119:                                else
                    120:                                        ip->impdiff = 1;
                    121: 
                    122:                                q = fixtype(cpexpr(ip->impub));
                    123:                                if(! ISICON(q))
                    124:                                        goto doerr;
                    125:                                ip->implim = q->constblock.Const.ci;
                    126:                                frexpr(q);
                    127: 
                    128:                                ip->isactive = YES;
                    129:                                rp = ALLOC(Rplblock);
                    130:                                rp->rplnextp = rpllist;
                    131:                                rpllist = rp;
                    132:                                rp->rplnp = ip->varnp;
                    133:                                rp->rplvp = (expptr) (ip->varvp);
                    134:                                rp->rpltag = TCONST;
                    135:                        }
                    136: 
                    137:                        if( (ip->impdiff>0 && (ip->varvp->Const.ci <= ip->implim))
                    138:                            || (ip->impdiff<0 && (ip->varvp->Const.ci >= ip->implim)) )
                    139:                        { /* start new loop */
                    140:                                curdtp = ip->datalist;
                    141:                                goto next;
                    142:                        }
                    143: 
                    144:                        /* clean up loop */
                    145: 
                    146:                        if(rpllist)
                    147:                        {
                    148:                                rp = rpllist;
                    149:                                rpllist = rpllist->rplnextp;
                    150:                                free( (charptr) rp);
                    151:                        }
                    152:                        else
                    153:                                Fatal("rpllist empty");
                    154: 
                    155:                        frexpr((expptr)ip->varvp);
                    156:                        ip->isactive = NO;
                    157:                        curdtp = curdtp->nextp;
                    158:                        goto next;
                    159:                }
                    160: 
                    161:                pp = (struct Primblock *) p;
                    162:                np = pp->namep;
                    163:                cur_varname = np->fvarname;
                    164:                skip = YES;
                    165: 
                    166:                if(p->primblock.argsp==NULL && np->vdim!=NULL)
                    167:                {   /* array initialization */
                    168:                        q = (expptr) mkaddr(np);
                    169:                        off = typesize[np->vtype] * curdtelt;
                    170:                        if(np->vtype == TYCHAR)
                    171:                                off *= np->vleng->constblock.Const.ci;
                    172:                        q->addrblock.memoffset =
                    173:                            mkexpr(OPPLUS, q->addrblock.memoffset, mkintcon(off) );
                    174:                        if( (neltp = np->vdim->nelt) && ISCONST(neltp))
                    175:                        {
                    176:                                if(++curdtelt < neltp->constblock.Const.ci)
                    177:                                        skip = NO;
                    178:                        }
                    179:                        else
                    180:                                err("attempt to initialize adjustable array");
                    181:                }
                    182:                else
                    183:                        q = mklhs((struct Primblock *)cpexpr((expptr)pp), 0);
                    184:                if(skip)
                    185:                {
                    186:                        curdtp = curdtp->nextp;
                    187:                        curdtelt = 0;
                    188:                }
                    189:                if(q->headblock.vtype == TYCHAR)
                    190:                        if(ISICON(q->headblock.vleng))
                    191:                                *elenp = q->headblock.vleng->constblock.Const.ci;
                    192:                        else    {
                    193:                                err("initialization of string of nonconstant length");
                    194:                                continue;
                    195:                        }
                    196:                else    *elenp = typesize[q->headblock.vtype];
                    197: 
                    198:                if (np->vstg == STGBSS) {
                    199:                        vlen = np->vtype==TYCHAR
                    200:                                ? np->vleng->constblock.Const.ci
                    201:                                : typesize[np->vtype];
                    202:                        if(vlen > 0)
                    203:                                np->vstg = STGINIT;
                    204:                        }
                    205:                return( (Addrp) q );
                    206: 
                    207: doerr:
                    208:                err("nonconstant implied DO parameter");
                    209:                frexpr(q);
                    210:                curdtp = curdtp->nextp;
                    211: 
                    212: next:
                    213:                curdtelt = 0;
                    214:        }
                    215: 
                    216:        return(NULL);
                    217: }
                    218: 
                    219: 
                    220: 
                    221: LOCAL FILEP dfile;
                    222: 
                    223: 
                    224: setdata(varp, valp, elen)
                    225: register Addrp varp;
                    226: ftnint elen;
                    227: register Constp valp;
                    228: {
                    229:        struct Constblock con;
                    230:        register int type;
                    231:        int i, k, valtype;
                    232:        ftnint offset;
                    233:        char *dataname(), *varname;
                    234:        static Addrp badvar;
                    235:        register unsigned char *s;
                    236:        static int last_lineno;
                    237:        static char *last_varname;
                    238: 
                    239:        if (varp->vstg == STGCOMMON) {
                    240:                if (!(dfile = blkdfile))
                    241:                        dfile = blkdfile = opf(blkdfname, textwrite);
                    242:                }
                    243:        else {
                    244:                if (procclass == CLBLOCK) {
                    245:                        if (varp != badvar) {
                    246:                                badvar = varp;
                    247:                                warn1("%s is not in a COMMON block",
                    248:                                        varp->uname_tag == UNAM_NAME
                    249:                                        ? varp->user.name->fvarname
                    250:                                        : "???");
                    251:                                }
                    252:                        return;
                    253:                        }
                    254:                if (!(dfile = initfile))
                    255:                        dfile = initfile = opf(initfname, textwrite);
                    256:                }
                    257:        varname = dataname(varp->vstg, varp->memno);
                    258:        offset = varp->memoffset->constblock.Const.ci;
                    259:        type = varp->vtype;
                    260:        valtype = valp->vtype;
                    261:        if(type!=TYCHAR && valtype==TYCHAR)
                    262:        {
                    263:                if(! ftn66flag
                    264:                && (last_varname != cur_varname || last_lineno != lineno)) {
                    265:                        /* prevent multiple warnings */
                    266:                        last_lineno = lineno;
                    267:                        warn1(
                    268:        "non-character datum %.42s initialized with character string",
                    269:                                last_varname = cur_varname);
                    270:                        }
                    271:                varp->vleng = ICON(typesize[type]);
                    272:                varp->vtype = type = TYCHAR;
                    273:        }
                    274:        else if( (type==TYCHAR && valtype!=TYCHAR) ||
                    275:            (cktype(OPASSIGN,type,valtype) == TYERROR) )
                    276:        {
                    277:                err("incompatible types in initialization");
                    278:                return;
                    279:        }
                    280:        if(type == TYADDR)
                    281:                con.Const.ci = valp->Const.ci;
                    282:        else if(type != TYCHAR)
                    283:        {
                    284:                if(valtype == TYUNKNOWN)
                    285:                        con.Const.ci = valp->Const.ci;
                    286:                else    consconv(type, &con, valp);
                    287:        }
                    288: 
                    289:        k = 1;
                    290: 
                    291:        switch(type)
                    292:        {
                    293:        case TYLOGICAL:
                    294:                if (tylogical != TYLONG)
                    295:                        type = tylogical;
                    296:        case TYINT1:
                    297:        case TYLOGICAL1:
                    298:        case TYLOGICAL2:
                    299:        case TYSHORT:
                    300:        case TYLONG:
                    301: #ifdef TYQUAD
                    302:        case TYQUAD:
                    303: #endif
                    304:                dataline(varname, offset, type);
                    305:                prconi(dfile, con.Const.ci);
                    306:                break;
                    307: 
                    308:        case TYADDR:
                    309:                dataline(varname, offset, type);
                    310:                prcona(dfile, con.Const.ci);
                    311:                break;
                    312: 
                    313:        case TYCOMPLEX:
                    314:        case TYDCOMPLEX:
                    315:                k = 2;
                    316:        case TYREAL:
                    317:        case TYDREAL:
                    318:                dataline(varname, offset, type);
                    319:                prconr(dfile, &con, k);
                    320:                break;
                    321: 
                    322:        case TYCHAR:
                    323:                k = valp -> vleng -> constblock.Const.ci;
                    324:                if (elen < k)
                    325:                        k = elen;
                    326:                s = (unsigned char *)valp->Const.ccp;
                    327:                for(i = 0 ; i < k ; ++i) {
                    328:                        dataline(varname, offset++, TYCHAR);
                    329:                        fprintf(dfile, "\t%d\n", *s++);
                    330:                        }
                    331:                k = elen - valp->vleng->constblock.Const.ci;
                    332:                if(k > 0) {
                    333:                        dataline(varname, offset, TYBLANK);
                    334:                        fprintf(dfile, "\t%d\n", k);
                    335:                        }
                    336:                break;
                    337: 
                    338:        default:
                    339:                badtype("setdata", type);
                    340:        }
                    341: 
                    342: }
                    343: 
                    344: 
                    345: 
                    346: /*
                    347:    output form of name is padded with blanks and preceded
                    348:    with a storage class digit
                    349: */
                    350: char *dataname(stg,memno)
                    351:  int stg;
                    352:  long memno;
                    353: {
                    354:        static char varname[64];
                    355:        register char *s, *t;
                    356:        char buf[16], *memname();
                    357: 
                    358:        if (stg == STGCOMMON) {
                    359:                varname[0] = '2';
                    360:                sprintf(s = buf, "Q.%ld", memno);
                    361:                }
                    362:        else {
                    363:                varname[0] = stg==STGEQUIV ? '1' : '0';
                    364:                s = memname(stg, memno);
                    365:                }
                    366:        t = varname + 1;
                    367:        while(*t++ = *s++);
                    368:        *t = 0;
                    369:        return(varname);
                    370: }
                    371: 
                    372: 
                    373: 
                    374: 
                    375: 
                    376: frdata(p0)
                    377: chainp p0;
                    378: {
                    379:        register struct Chain *p;
                    380:        register tagptr q;
                    381: 
                    382:        for(p = p0 ; p ; p = p->nextp)
                    383:        {
                    384:                q = (tagptr)p->datap;
                    385:                if(q->tag == TIMPLDO)
                    386:                {
                    387:                        if(q->impldoblock.isbusy)
                    388:                                return; /* circular chain completed */
                    389:                        q->impldoblock.isbusy = YES;
                    390:                        frdata(q->impldoblock.datalist);
                    391:                        free( (charptr) q);
                    392:                }
                    393:                else
                    394:                        frexpr(q);
                    395:        }
                    396: 
                    397:        frchain( &p0);
                    398: }
                    399: 
                    400: 
                    401: 
                    402: dataline(varname, offset, type)
                    403: char *varname;
                    404: ftnint offset;
                    405: int type;
                    406: {
                    407:        fprintf(dfile, datafmt, varname, offset, type);
                    408: }
                    409: 
                    410:  void
                    411: make_param(p, e)
                    412:  register struct Paramblock *p;
                    413:  expptr e;
                    414: {
                    415:        register expptr q;
                    416: 
                    417:        p->vclass = CLPARAM;
                    418:        impldcl((Namep)p);
                    419:        p->paramval = q = mkconv(p->vtype, e);
                    420:        if (p->vtype == TYCHAR) {
                    421:                if (q->tag == TEXPR)
                    422:                        p->paramval = q = fixexpr(q);
                    423:                if (!ISCONST(q) || q->constblock.vtype != TYCHAR) {
                    424:                        errstr("invalid value for character parameter %s",
                    425:                                p->fvarname);
                    426:                        return;
                    427:                        }
                    428:                if (!(e = p->vleng))
                    429:                        p->vleng = ICON(q->constblock.vleng->constblock.Const.ci
                    430:                                        + q->constblock.Const.ccp1.blanks);
                    431:                else if (q->constblock.vleng->constblock.Const.ci
                    432:                                > e->constblock.Const.ci) {
                    433:                        q->constblock.vleng->constblock.Const.ci
                    434:                                = e->constblock.Const.ci;
                    435:                        q->constblock.Const.ccp1.blanks = 0;
                    436:                        }
                    437:                else
                    438:                        q->constblock.Const.ccp1.blanks
                    439:                                = e->constblock.Const.ci
                    440:                                - q->constblock.vleng->constblock.Const.ci;
                    441:                }
                    442:        }

unix.superglobalmegacorp.com

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