Annotation of 43BSDTahoe/usr.bin/efl/dclgen.c, revision 1.1.1.1

1.1       root        1: #include "defs"
                      2: 
                      3: #define DOCOMMON 1
                      4: #define NOCOMMON 0
                      5: 
                      6: dclgen()
                      7: {
                      8: register ptr p, q;
                      9: ptr q1;
                     10: chainp *y, z;
                     11: register struct stentry *s;
                     12: struct stentry **hp;
                     13: int first;
                     14: int i, j;
                     15: extern char *types[];
                     16: char *sp;
                     17: 
                     18: /*   print procedure statement and argument list */
                     19: 
                     20: for(p = prevcomments ; p ; p = p->nextp)
                     21:        {
                     22:        sp = p->datap;
                     23:        fprintf(codefile, "%s\n", sp+1);
                     24:        cfree(sp);
                     25:        }
                     26: frchain(&prevcomments);
                     27: 
                     28: if(tailor.procheader)
                     29:        fprintf(codefile, "%s\n", tailor.procheader);
                     30: 
                     31: if(procname)
                     32:        {
                     33:        p2str("      ");
                     34:        if(procname->vtype==TYSUBR || procname->vtype==TYUNDEFINED)
                     35:                p2key(FSUBROUTINE);
                     36:        else    {
                     37:                p2str(types[procname->vtype]);
                     38:                p2key(FFUNCTION);
                     39:                }
                     40: 
                     41:        p2str(procname->sthead->namep);
                     42:        }
                     43: else if(procclass == PRBLOCK)
                     44:        {
                     45:        p2stmt(0);
                     46:        p2key(FBLOCKDATA);
                     47:        }
                     48: else   {
                     49:        p2str("c  main program");
                     50:        if(tailor.ftnsys == CRAY)
                     51:                {
                     52:                p2stmt(0);
                     53:                p2key(FPROGRAM);
                     54:                }
                     55:        }
                     56: 
                     57: if(thisargs)
                     58:        {
                     59:        p2str( "(" );
                     60:        first = 1;
                     61: 
                     62:        for(p = thisargs ; p ; p = p->nextp)
                     63:                if( (q=p->datap)->vextbase)
                     64:                        {
                     65:                        if(first) first = 0;
                     66:                        else p2str(", ");
                     67:                        p2str(ftnames[q->vextbase]);
                     68:                        }
                     69:                else    for(i=0 ; i<NFTNTYPES ; ++i)
                     70:                                if(j = q->vbase[i])
                     71:                                        {
                     72:                                        if(first) first = 0;
                     73:                                        else p2str( ", " );
                     74:                                        p2str(ftnames[j]);
                     75:                                        }
                     76:        p2str( ")" );
                     77:        }
                     78: 
                     79: /* first put out declarations of variables that are used as
                     80:    adjustable dimensions
                     81: */
                     82: 
                     83: y = 0;
                     84: z = & y;
                     85: for(hp = hashtab ; hp<hashend; ++hp)
                     86:        if( *hp && (q = (*hp)->varp) )
                     87:                if(q->tag==TNAME && q->vadjdim && q!=procname)
                     88:                        z = z->nextp = mkchain(q,CHNULL);
                     89: 
                     90: dclchain(y, NOCOMMON);
                     91: frchain(&y);
                     92: 
                     93: /* then declare the rest of the arguments */
                     94: z = & y;
                     95: for(p = thisargs ; p ; p = p->nextp)
                     96:        if(p->datap->vadjdim == 0)
                     97:                z = z->nextp = mkchain(p->datap,CHNULL);
                     98: dclchain(y, NOCOMMON);
                     99: frchain(&y);
                    100: frchain(&thisargs);
                    101: 
                    102: 
                    103: /* now put out declarations for common blocks */
                    104: for(p = commonlist ; p ; p = p->nextp)
                    105:        prcomm(p->datap);
                    106: 
                    107: TEST fprintf(diagfile, "\nend of common declarations");
                    108: z = &y;
                    109: 
                    110: /* next the other variables that are in the symbol table */
                    111: 
                    112: for(hp = hashtab ; hp<hashend ; ++hp)
                    113:        if( *hp && (q = (*hp)->varp) )
                    114:                if(q->tag==TNAME && q->vadjdim==0 && q->vclass!=CLCOMMON &&
                    115:                    q->vclass!=CLARG && q!=procname &&
                    116:                    (tailor.dclintrinsics || q->vproc!=PROCINTRINSIC) )
                    117:                        z = z->nextp = mkchain(q,CHNULL);
                    118: 
                    119: dclchain(y, NOCOMMON);
                    120: frchain(&y);
                    121: 
                    122: TEST fprintf(diagfile, "\nend of symbol table, start of gonelist");
                    123: 
                    124: /* now declare variables that are no longer in the symbol table */
                    125: 
                    126: dclchain(gonelist, NOCOMMON);
                    127: 
                    128: TEST fprintf(diagfile, "\nbeginning of hidlist");
                    129: dclchain(hidlist, NOCOMMON);
                    130: 
                    131: dclchain(tempvarlist, NOCOMMON);
                    132: 
                    133: 
                    134: /* finally put out equivalence statements that are generated 
                    135:    because of structure and character variables
                    136: */
                    137: for(p = genequivs; p ; p = p->nextp)
                    138:        {
                    139:        q = p->datap;
                    140:        p2stmt(0);
                    141:        first = 1;
                    142:        p2key(FEQUIVALENCE);
                    143:        p2str( "(" );
                    144:        for(i=0; i<NFTNTYPES; ++i)
                    145:                if(q->vbase[i])
                    146:                        {
                    147:                        if(first) first = 0;
                    148:                        else p2str( ", " );
                    149:                        p2str(ftnames[ q->vbase[i] ]);
                    150:                        p2str( "(1" );
                    151:                        if(q1 = q->vdim)
                    152:                                for(q1 = q1->datap; q1 ; q1 = q1->nextp)
                    153:                                        p2str( ",1" );
                    154:                        p2str( ")" );
                    155:                        }
                    156:        p2str( ")" );
                    157:        }
                    158: frchain(&genequivs);
                    159: }
                    160: 
                    161: 
                    162: 
                    163: 
                    164: prcomm(p)
                    165: register ptr p;
                    166: {
                    167: register int first;
                    168: register ptr q;
                    169: 
                    170: p2stmt(0);
                    171: p2key(FCOMMON);
                    172: p2str( "/" );
                    173: p2str(p->comname);
                    174: p2str("/ ");
                    175: first = 1;
                    176: for(q = p->comchain ; q; q = q->nextp)
                    177:        {
                    178:        if(first) first=0;
                    179:        else p2str(", ");
                    180:        prname(q->datap);
                    181:        }
                    182: dclchain(p->comchain, DOCOMMON);
                    183: }
                    184: 
                    185: 
                    186: 
                    187: prname(p)
                    188: register ptr p;
                    189: {
                    190: register int i;
                    191: 
                    192: switch(p->tag)
                    193:        {
                    194:        case TCONST:
                    195:                p2str(p->leftp);
                    196:                return;
                    197: 
                    198:        case TNAME:
                    199:                if( ! p->vdcldone )
                    200:                        if(p->blklevel == 1)
                    201:                                dclit(p);
                    202:                        else    mkftnp(p);
                    203:                for(i=0; i<NFTNTYPES ; ++i)
                    204:                        if(p->vbase[i])
                    205:                                {
                    206:                                p2str(ftnames[p->vbase[i]]);
                    207:                                return;
                    208:                                }
                    209:                fatal1("prname: no fortran types for name %s",
                    210:                        p->sthead->namep);
                    211: 
                    212:        case TFTNBLOCK:
                    213:                for(i=0; i<NFTNTYPES ; ++i)
                    214:                        if(p->vbase[i])
                    215:                                {
                    216:                                p2str(ftnames[p->vbase[i]]);
                    217:                                return;
                    218:                                }
                    219:                return;
                    220: 
                    221:        default:
                    222:                badtag("prname", p->tag);
                    223:        }
                    224: }
                    225: 
                    226: 
                    227: 
                    228: 
                    229: dclchain(chp, okcom)
                    230: ptr chp;
                    231: int okcom;
                    232: {
                    233: extern char *ftntypes[];
                    234: register ptr pn, p;
                    235: register int i;
                    236: int first, nline;
                    237: ptr q,v;
                    238: int ntypes;
                    239: int size,align,mask;
                    240: int subval;
                    241: 
                    242: nline = 0;
                    243: for(pn = chp ; pn ; pn = pn->nextp)
                    244:        {
                    245:        p = pn->datap;
                    246:        if( (p->tag==TNAME || p->tag==TTEMP) && p->vext!=0)
                    247:                {
                    248:                if(nline%NAMESPERLINE == 0)
                    249:                        {
                    250:                        p2stmt(0);
                    251:                        p2key(FEXTERNAL);
                    252:                        }
                    253:                else    p2str(", ");
                    254:                ++nline;
                    255:                p2str(ftnames[p->vextbase]);
                    256:                }
                    257:        }
                    258: 
                    259: 
                    260: for(pn = chp ; pn ; pn = pn->nextp)
                    261:        {
                    262:        p = pn->datap;
                    263:        if( (p->tag==TNAME || p->tag==TTEMP) &&
                    264:            p->vtype==TYSTRUCT && p->vclass!=CLARG)
                    265:                {
                    266:                ntypes = 0;
                    267:                for(i=0; i<NFTNTYPES; ++i)
                    268:                        if(p->vbase[i])
                    269:                                ++ntypes;
                    270:                if(ntypes > 1)
                    271:                        genequivs = mkchain(p, genequivs);
                    272:                }
                    273:        }
                    274: 
                    275: for(i=0; i<NFTNTYPES; ++i)
                    276:        {
                    277:        nline = 0;
                    278:        for(pn = chp; pn ; pn = pn->nextp)
                    279:                {
                    280:                p = pn->datap;
                    281:                if( (p->tag==TNAME || p->tag==TTEMP) &&
                    282:                    p->vtype!=TYSUBR && p->vbase[i]!=0 &&
                    283:                    (okcom || p->vclass!=CLCOMMON) )
                    284:                        {
                    285:                        if(nline%NAMESPERLINE == 0)
                    286:                                {
                    287:                                p2stmt(0);
                    288:                                p2str(ftntypes[i]);
                    289:                                }
                    290:                        else    p2str( ", " );
                    291:                        ++nline;
                    292:                        p2str(ftnames[p->vbase[i]]);
                    293:                        first = -1;
                    294:                
                    295:                        if(p->vtype==TYCHAR || p->vtype==TYSTRUCT ||
                    296:                           (p->vtype==TYLCOMPLEX && tailor.lngcxtype==NULL))
                    297:                                {
                    298:                                p2str( "(" );
                    299:                                sizalign(p, &size,&align,&mask);
                    300:                                p2int( size/tailor.ftnsize[i] );
                    301:                                first = 0;
                    302:                                }
                    303:                        else if(p->vdim)
                    304:                                {
                    305:                                p2str( "(" );
                    306:                                first = 1;
                    307:                                }
                    308:                        if(first >=0)
                    309:                                {
                    310:                                if(q = p->vdim)
                    311:                                    for(q = q->datap ; q ; q = q->nextp)
                    312:                                        {
                    313:                                        if(q->upperb == 0)
                    314:                                                {
                    315:                                                q->upperb = mkint(1);
                    316:                                                if(q->lowerb)
                    317:                                                        {
                    318:                                                        frexpr(q->lowerb);
                    319:                                                        q->lowerb = 0;
                    320:                                                        }
                    321:                                                }
                    322:                                        else if(q->lowerb)
                    323:                                                {
                    324:                                                v = fold( mknode(TAROP,OPMINUS,
                    325:                                                        mkint(1),cpexpr(q->lowerb)) );
                    326:                                                v = fold( mknode(TAROP,OPPLUS,
                    327:                                                        cpexpr(q->upperb),v) );
                    328:                                                q->lowerb = 0;
                    329:                                                q->upperb = v;
                    330:                                                }
                    331:                                        if(first) first = 0;
                    332:                                        else p2str( ", " );
                    333:                                        v = q->upperb = simple(RVAL,q->upperb);
                    334:                                        if( (v->tag==TNAME && v->vclass==CLARG) ||
                    335:                                            (isicon(v,&subval) && subval>0) )
                    336:                                                prname(v);
                    337:                                        else    dclerr("invalid array bound",
                    338:                                                p->sthead->namep);
                    339:                                        }
                    340:                                p2str( ")" );
                    341:                                }
                    342:                        }
                    343:                }
                    344:        }
                    345: }

unix.superglobalmegacorp.com

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