Annotation of researchv10no/cmd/efl/mk.c, revision 1.1

1.1     ! root        1: #include "defs"
        !             2: 
        !             3: 
        !             4: ptr mkcomm(s)
        !             5: register char *s;
        !             6: {
        !             7: register ptr p;
        !             8: register char *t;
        !             9: 
        !            10: for(p = (int *)commonlist ; p ; p = p->nextp)
        !            11:        if(equals(s, ((struct comentry *)p->datap)->comname))
        !            12:                return(p->datap);
        !            13: 
        !            14: p = (int *)ALLOC(comentry);
        !            15: for(t = p->comname ; *t++ = *s++ ; ) ;
        !            16: p->tag = TCOMMON;
        !            17: p->blklevel = (blklevel>0? 1 : 0);
        !            18: commonlist = mkchain(p, commonlist);
        !            19: return(commonlist->datap);
        !            20: }
        !            21: 
        !            22: 
        !            23: 
        !            24: 
        !            25: ptr mkname(s)
        !            26: char *s;
        !            27: {
        !            28: char *copys();
        !            29: register ptr p;
        !            30: 
        !            31: if( (p = (int *)name(s,1)) == 0)
        !            32:        {
        !            33:        p = (int *)name(s,0);
        !            34:        p->tag = TNAME;
        !            35:        p->blklevel = blklevel;
        !            36:        }
        !            37: return(p);
        !            38: }
        !            39: 
        !            40: ptr mknode(t, o, l, r)
        !            41: int t,o;
        !            42: register ptr l;
        !            43: register ptr r;
        !            44: {
        !            45: register struct exprblock *p;
        !            46: ptr q;
        !            47: int lt, rt;
        !            48: int ll, rl;
        !            49: ptr mksub1(), mkchcon();
        !            50: 
        !            51: p = (struct exprblock *)allexpblock();
        !            52: TEST fprintf(diagfile, "mknode(%d,%d,%o,%o) = %o\n", t, o, l, r, p);
        !            53: 
        !            54: top:
        !            55:        if(t!=TLIST && t!=TCONST && l!=0 && l->tag==TERROR)
        !            56:                {
        !            57:                frexpr(r);
        !            58:                frexpblock(p);
        !            59:                return(l);
        !            60:                }
        !            61: 
        !            62:        if(r!=0 && r->tag==TERROR)
        !            63:                {
        !            64:                frexpr(l);
        !            65:                frexpblock(p);
        !            66:                return(r);
        !            67:                }
        !            68:        p->tag = t;
        !            69:        p->subtype = o;
        !            70:        p->leftp = l;
        !            71:        p->rightp = r;
        !            72: 
        !            73: switch(t)
        !            74:        {
        !            75:        case TAROP:
        !            76:                ckdcl(l);
        !            77:                ckdcl(r);
        !            78:                switch(lt = l->vtype)
        !            79:                        {
        !            80:                        case TYCHAR:
        !            81:                        case TYSTRUCT:
        !            82:                        case TYLOG:
        !            83:                                exprerr("non-arithmetic operand of arith op","");
        !            84:                                goto err;
        !            85:                        }
        !            86: 
        !            87:                switch(rt = r->vtype)
        !            88:                        {
        !            89:                        case TYCHAR:
        !            90:                        case TYSTRUCT:
        !            91:                        case TYLOG:
        !            92:                                exprerr("non-arithmetic operand of arith op","");
        !            93:                                goto err;
        !            94:                        }
        !            95:                if(lt==rt || (o==OPPOWER && rt==TYINT) )
        !            96:                        p->vtype = lt;
        !            97:                else if( (lt==TYREAL && rt==TYLREAL) ||
        !            98:                        (lt==TYLREAL && rt==TYREAL) )
        !            99:                                p->vtype = TYLREAL;
        !           100:                else if(lt==TYINT)
        !           101:                        {
        !           102:                        l = coerce(rt,l);
        !           103:                        goto top;
        !           104:                        }
        !           105:                else if(rt==TYINT)
        !           106:                        {
        !           107:                        r = coerce(lt,r);
        !           108:                        goto top;
        !           109:                        }
        !           110:                else if( (lt==TYREAL && rt==TYCOMPLEX) ||
        !           111:                         (lt==TYCOMPLEX && rt==TYREAL) )
        !           112:                        p->vtype = TYCOMPLEX;
        !           113:                else if( (lt==TYLREAL && rt==TYCOMPLEX) ||
        !           114:                         (lt==TYCOMPLEX && rt==TYLREAL) )
        !           115:                        p->vtype = TYLCOMPLEX;
        !           116:                else    {
        !           117:                        exprerr("mixed mode", CNULL);
        !           118:                        goto err;
        !           119:                        }
        !           120: 
        !           121:                if( (o==OPPLUS||o==OPSTAR) && l->tag==TCONST && r->tag!=TCONST )
        !           122:                        {
        !           123:                        p->leftp = r;
        !           124:                        p->rightp = l;
        !           125:                        }
        !           126: 
        !           127:                if(o==OPPLUS && l->tag==TNEGOP &&
        !           128:                  (r->tag!=TCONST || ((struct headbits *)l->leftp)->tag==TCONST) )
        !           129:                        {
        !           130:                        p->subtype = OPMINUS;
        !           131:                        p->leftp = r;
        !           132:                        p->rightp = l->leftp;
        !           133:                        }
        !           134: 
        !           135:                break;
        !           136: 
        !           137:        case TRELOP:
        !           138:                ckdcl(l);
        !           139:                ckdcl(r);
        !           140:                p->vtype = TYLOG;
        !           141:                lt = l->vtype;
        !           142:                rt = r->vtype;
        !           143:                if(lt==TYCHAR || rt==TYCHAR)
        !           144:                        {
        !           145:                        if(l->vtype != r->vtype)
        !           146:                                {
        !           147:                                exprerr("comparison of character and noncharacter data",CNULL);
        !           148:                                goto err;
        !           149:                                }
        !           150:                        ll = conval(l->vtypep);
        !           151:                        rl = conval(r->vtypep);
        !           152:                        if( (o==OPEQ || o==OPNE) &&
        !           153:                                ( (ll==1 && rl==1 && tailor.charcomp==1)
        !           154:                                || (ll<=tailor.ftnchwd && rl<=tailor.ftnchwd
        !           155:                                && tailor.charcomp==2) ))
        !           156:                                {
        !           157:                                if(l->tag == TCONST)
        !           158:                                        {
        !           159:                                        q = cpexpr( mkchcon(l->leftp) );
        !           160:                                        frexpr(l);
        !           161:                                        l = q;
        !           162:                                        }
        !           163:                                if(r->tag == TCONST)
        !           164:                                        {
        !           165:                                        q = cpexpr( mkchcon(r->leftp) );
        !           166:                                        frexpr(r);
        !           167:                                        r = q;
        !           168:                                        }
        !           169:                                if(l->vsubs == 0)
        !           170:                                        l->vsubs = mksub1();
        !           171:                                if(r->vsubs == 0)
        !           172:                                        r->vsubs = mksub1();
        !           173:                                p->leftp = l;
        !           174:                                p->rightp = r;
        !           175:                                }
        !           176:                        else    {
        !           177:                                p->leftp = mkcall(builtin(TYINT,"ef1cmc"), arg4(l,r));
        !           178:                                p->rightp = mkint(0);
        !           179:                                }
        !           180:                        }
        !           181: 
        !           182:                else if(lt==TYLOG || rt==TYLOG)
        !           183:                        exprerr("relational involving logicals", CNULL);
        !           184:                else if( (lt==TYCOMPLEX || rt==TYCOMPLEX) &&
        !           185:                        o!=OPEQ && o!=OPNE)
        !           186:                                exprerr("order comparison of complex numbers", CNULL);
        !           187:                else if(lt != rt)
        !           188:                        {
        !           189:                        if(lt==TYINT)
        !           190:                                p->leftp = coerce(rt, l);
        !           191:                        else if(rt == TYINT)
        !           192:                                p->rightp = coerce(lt, r);
        !           193:                        }
        !           194:                break;
        !           195: 
        !           196:        case TLOGOP:
        !           197:                ckdcl(l);
        !           198:                ckdcl(r);
        !           199:                if(r->vtype != TYLOG)
        !           200:                        {
        !           201:                        exprerr("non-logical operand of logical operator",CNULL);
        !           202:                        goto err;
        !           203:                        }
        !           204:        case TNOTOP:
        !           205:                ckdcl(l);
        !           206:                if(l->vtype != TYLOG)
        !           207:                        {
        !           208:                        exprerr("non-logical operand of logical operator",CNULL);
        !           209:                        }
        !           210:                p->vtype = TYLOG;
        !           211:                break;
        !           212: 
        !           213:        case TNEGOP:
        !           214:                ckdcl(l);
        !           215:                lt = l->vtype;
        !           216:                if(lt!=TYINT && lt!=TYREAL && lt!=TYLREAL && lt!=TYCOMPLEX)
        !           217:                        {
        !           218:                        exprerr("impossible unary + or - operation",CNULL);
        !           219:                        goto err;
        !           220:                        }
        !           221:                p->vtype = lt;
        !           222:                break;
        !           223: 
        !           224:        case TCALL:
        !           225:                p->vtype = l->vtype;
        !           226:                p->vtypep = l->vtypep;
        !           227:                break;
        !           228: 
        !           229:        case TASGNOP:
        !           230:                ckdcl(l);
        !           231:                ckdcl(r);
        !           232:                lt = l->vtype;
        !           233:                if(lt==TYFIELD)
        !           234:                        lt = TYINT;
        !           235:                rt = r->vtype;
        !           236:                if(lt==TYCHAR || rt==TYCHAR || lt==TYLOG || rt==TYLOG)
        !           237:                        {
        !           238:                        if(lt != rt)
        !           239:                                {
        !           240:                                exprerr("illegal assignment",CNULL);
        !           241:                                goto err;
        !           242:                                }
        !           243:                        }
        !           244:                else if(lt==TYSTRUCT || rt==TYSTRUCT)
        !           245:                        {
        !           246:                        if(lt!=rt || ((struct typeblock *)l->vtypep)->strsize!=((struct typeblock *)r->vtypep)->strsize
        !           247:                                || ((struct typeblock *)l->vtypep)->stralign!=((struct typeblock *)r->vtypep)->stralign)
        !           248:                                {
        !           249:                                exprerr("illegal structure assignment",CNULL);
        !           250:                                goto err;
        !           251:                                }
        !           252:                        }
        !           253:                else if ( (lt==TYCOMPLEX || rt==TYCOMPLEX) && lt!=rt)
        !           254: /*                     p->rightp = r = coerce(lt, r) */ ;
        !           255: 
        !           256:                p->vtype = lt;
        !           257:                p->vtypep = l->vtypep;
        !           258:                break;
        !           259: 
        !           260:        case TCONST:
        !           261:        case TLIST:
        !           262:        case TREPOP:
        !           263:                break;
        !           264: 
        !           265:        default:
        !           266:                badtag("mknode", t);
        !           267:        }
        !           268: 
        !           269: return((int *)p);
        !           270: 
        !           271: err:   frexpr(p);
        !           272:        return( errnode() );
        !           273: }
        !           274: 
        !           275: 
        !           276: 
        !           277: ckdcl(p)
        !           278: ptr p;
        !           279: {
        !           280: if(p->vtype==TYUNDEFINED || (p->tag==TNAME&&p->vdcldone==0&&p->vadjdim==0))
        !           281:        {
        !           282: /*debug*/ printf("tag=%d, typed=%d\n", p->tag, p->vtype);
        !           283:        fatal("untyped subexpression");
        !           284:        }
        !           285: if(p->tag==TNAME) setvproc(p,PROCNO);
        !           286: }
        !           287: 
        !           288: ptr mkvar(p)
        !           289: register ptr p;
        !           290: {
        !           291: register ptr q;
        !           292: 
        !           293: TEST fprintf(diagfile, "mkvar(%s), blk %d\n", p->namep, blklevel);
        !           294: 
        !           295: if(p->blklevel > blklevel)
        !           296:        p->blklevel = blklevel;
        !           297: 
        !           298: if(p->tag == TLABEL)
        !           299:        {
        !           300:        laberr("attempt to use label as variable", p->namep);
        !           301:        return( errnode() );
        !           302:        }
        !           303: if(instruct || p->varp==0 || ((struct headbits *)p->varp)->blklevel<blklevel)
        !           304:        {
        !           305:        q = allexpblock();
        !           306:        q->tag = TNAME;
        !           307:        q->sthead = p;
        !           308:        q->blklevel = blklevel;
        !           309:        if(! instruct)
        !           310:                ++ndecl[blklevel];
        !           311:        }
        !           312: else q = p->varp;
        !           313: 
        !           314: if(!instruct)
        !           315:        {
        !           316:        if(p->varp && ((struct headbits *)p->varp)->blklevel<blklevel)
        !           317:                hide(p);
        !           318:        if(p->varp == 0)
        !           319:                p->varp = q;
        !           320:        }
        !           321: 
        !           322: p->tag = TNAME;
        !           323: return(q);
        !           324: }
        !           325: 
        !           326: 
        !           327: ptr mkstruct(v,s)
        !           328: register ptr v;
        !           329: ptr s;
        !           330: {
        !           331: register ptr p;
        !           332: 
        !           333: p = (int *)ALLOC(typeblock);
        !           334: p->sthead = v;
        !           335: p->tag = TSTRUCT;
        !           336: p->blklevel = blklevel;
        !           337: p->strdesc = s;
        !           338: offsets(p);
        !           339: if(v)  {
        !           340:        v->blklevel = blklevel;
        !           341:        ++ndecl[blklevel];
        !           342:        v->varp = p;
        !           343:        }
        !           344: else   temptypelist = mkchain(p, temptypelist);
        !           345: return(p);
        !           346: }
        !           347: 
        !           348: 
        !           349: ptr mkcall(fn1, args)
        !           350: ptr fn1, args;
        !           351: {
        !           352: int i, j, first;
        !           353: register ptr funct, p, q;
        !           354: ptr r;
        !           355: 
        !           356: if(fn1->tag == TERROR)
        !           357:        return( errnode() );
        !           358: else if(fn1->tag == TNAME)
        !           359:        {
        !           360:        funct = ((struct stentry *)fn1->sthead)->varp;
        !           361:        frexpblock(fn1);
        !           362:        }
        !           363: else
        !           364:        funct = fn1;
        !           365: if(funct->vclass!=0 && funct->vclass!=CLARG)
        !           366:        {
        !           367:        exprerr("invalid invocation of %s",((struct stentry *)funct->sthead)->namep);
        !           368:        frexpr(args);
        !           369:        return( errnode() );
        !           370:        }
        !           371: else   extname(funct);
        !           372: 
        !           373: if(args)  for(p = args->leftp; p ; p = p->nextp)
        !           374:        {
        !           375:        q = p->datap;
        !           376:        if( (q->tag==TCALL&&q->vtype==TYUNDEFINED) ||
        !           377:            (q->tag==TNAME&&q->vdcldone==0) )
        !           378:                dclit(q);
        !           379:        if(q->tag==TNAME && q->vproc==PROCUNKNOWN)
        !           380:                setvproc(q, PROCNO);
        !           381:        if( q->vtype == TYSTRUCT)
        !           382:                {
        !           383:                first = 1;
        !           384:                for(i = 0; i<NFTNTYPES ; ++i)
        !           385:                        if(q->vbase[i] != 0)
        !           386:                                {
        !           387:                                r = cpexpr(q);
        !           388:                                if(first)
        !           389:                                        {
        !           390:                                        p->datap = r;
        !           391:                                        first = 0;
        !           392:                                        }
        !           393:                                else    p = p->nextp = (int *)mkchain(r, p->nextp);
        !           394:                                r->vtype = ftnefl[i];
        !           395:                                for(j=0; j<NFTNTYPES; ++j)
        !           396:                                        if(i != j) r->vbase[j] = 0;
        !           397:                                }
        !           398:                frexpblock(q);
        !           399:                }
        !           400:        }
        !           401: 
        !           402: return( mknode(TCALL,0,cpexpr(funct), args) );
        !           403: }
        !           404: 
        !           405: 
        !           406: 
        !           407: mkcase(p,here)
        !           408: ptr p;
        !           409: int here;
        !           410: {
        !           411: register ptr q, s;
        !           412: 
        !           413: for(s = thisctl ; s!=0 && s->subtype!=STSWITCH ; s = s->prevctl)
        !           414:        ;
        !           415: if(s==0 || (here && s!=thisctl) )
        !           416:        {
        !           417:        laberr("invalid case label location",CNULL);
        !           418:        return(0);
        !           419:        }
        !           420: 
        !           421: p = simple(RVAL,p);
        !           422: for(q = s->loopctl ; q!=0 && !eqcon(p,q->casexpr) ; q = q->nextcase)
        !           423:        ;
        !           424: if(q == 0)
        !           425:        {
        !           426:        q = (int *)ALLOC(caseblock);
        !           427:        q->tag = TCASE;
        !           428:        q->casexpr = p;
        !           429:        q->labelno = ( here ? thislab() : nextlab() );
        !           430:        q->nextcase = s->loopctl;
        !           431:        s->loopctl = q;
        !           432:        }
        !           433: else if(here)
        !           434:        if(thisexec->labelno == 0)
        !           435:                thisexec->labelno = q->labelno;
        !           436:        else if(thisexec->labelno != q->labelno)
        !           437:                {
        !           438:                exnull();
        !           439:                thisexec->labelno = q->labelno;
        !           440:                thisexec->labused = 0;
        !           441:                }
        !           442: if(here)
        !           443:        if(q->labdefined)
        !           444:                laberr("multiply defined case",CNULL);
        !           445:        else
        !           446:                q->labdefined = 1;
        !           447: return(q->labelno);
        !           448: }
        !           449: 
        !           450: 
        !           451: ptr mkilab(p)
        !           452: ptr p;
        !           453: {
        !           454: char *s, l[30];
        !           455: 
        !           456: if(p->tag!=TCONST || p->vtype!=TYINT)
        !           457:        {
        !           458:        execerr("invalid label","");
        !           459:        s = "";
        !           460:        }
        !           461: else   s = (char *)p->leftp;
        !           462: 
        !           463: while(*s == '0')
        !           464:        ++s;
        !           465: sprintf(l,"#%s", s);
        !           466: 
        !           467: 
        !           468: TEST fprintf(diagfile,"numeric label = %s\n", l);
        !           469: return( mkname(l) );
        !           470: }
        !           471: 
        !           472: 
        !           473: 
        !           474: 
        !           475: mklabel(p,here)
        !           476: ptr p;
        !           477: int here;
        !           478: {
        !           479: register ptr q;
        !           480: 
        !           481: if(q = p->varp)
        !           482:        {
        !           483:        if(q->tag != TLABEL)
        !           484:                laberr("%s is already a nonlabel\n", p->namep);
        !           485:        else if(q->labinacc)
        !           486:                warn1("label %s is inaccessible", p->namep);
        !           487:        else if(here)
        !           488:                if(q->labdefined)
        !           489:                        laberr("%s is already defined\n", p->namep);
        !           490: /*
        !           491:                else if(blklevel > q->blklevel)
        !           492:                        laberr("%s is illegally placed\n",p->namep);
        !           493: */
        !           494: /* dirty fixup for wm coughran */
        !           495:                else    {
        !           496:                        if(blklevel > q->blklevel)
        !           497:                                labwarn("%s is illegally placed\n",p->namep);
        !           498:                
        !           499:                        q->labdefined = 1;
        !           500:                        if(thisexec->labelno == 0)
        !           501:                                thisexec->labelno = q->labelno;
        !           502:                        else if(thisexec->labelno != q->labelno)
        !           503:                                {
        !           504:                                exnull();
        !           505:                                thisexec->labelno = q->labelno;
        !           506:                                thisexec->labused = 0;
        !           507:                                }
        !           508:                        }
        !           509:        }
        !           510: else   {
        !           511:        q = (int *)ALLOC(labelblock);
        !           512:        p->varp = q;
        !           513:        q->tag = TLABEL;
        !           514:        q->subtype = 0;
        !           515:        q->blklevel = blklevel;
        !           516:        ++ndecl[blklevel];
        !           517:        q->labdefined = here;
        !           518:        q->labelno = ( here ? thislab() : nextlab() );
        !           519:        q->sthead = p;
        !           520:        }
        !           521: 
        !           522: return(q->labelno);
        !           523: }
        !           524: 
        !           525: 
        !           526: thislab()
        !           527: {
        !           528: if(thisexec->labelno == 0)
        !           529:        thisexec->labelno = nextlab();
        !           530: return(thisexec->labelno);
        !           531: }
        !           532: 
        !           533: 
        !           534: nextlab()
        !           535: {
        !           536: stnos[++labno] = 0;
        !           537: return( labno );
        !           538: }
        !           539: 
        !           540: 
        !           541: nextindif()
        !           542: {
        !           543: if(++nxtindif < MAXINDIFS)
        !           544:        return(nxtindif);
        !           545: fatal("too many indifs"); return 0;
        !           546: }
        !           547: 
        !           548: 
        !           549: 
        !           550: 
        !           551: mkkeywd(s, n)
        !           552: char *s;
        !           553: int n;
        !           554: {
        !           555: register ptr p;
        !           556: register ptr q;
        !           557: 
        !           558: p = (int *)name(s, 2);
        !           559: q = (int *)ALLOC(keyblock);
        !           560: p->tag = TKEYWORD;
        !           561: q->tag = TKEYWORD;
        !           562: p->subtype = n;
        !           563: q->subtype = n;
        !           564: p->blklevel = 0;
        !           565: p->varp = q;
        !           566: q->sthead = p;
        !           567: }
        !           568: 
        !           569: 
        !           570: ptr mkdef(s, v)
        !           571: char *s, *v;
        !           572: {
        !           573: register ptr p;
        !           574: register ptr q;
        !           575: 
        !           576: if(p = (int *)name(s,1))
        !           577:        if(p->blklevel == 0)
        !           578:                {
        !           579:                if(blklevel > 0)
        !           580:                        hide(p);
        !           581:                else if(p->tag != TDEFINE)
        !           582:                        dclerr("attempt to DEFINE a variable name", s);
        !           583:                else    {
        !           584:                        if( strcmp(v, ((struct defblock *)(q=p->varp))->valp) )
        !           585:                                {
        !           586:                                warn("macro value replaced");
        !           587:                                cfree(q->valp);
        !           588:                                q->valp = copys(v);
        !           589:                                }
        !           590:                        return(p);
        !           591:                        }
        !           592:                }
        !           593:        else    {
        !           594:                dclerr("type already defined", s);
        !           595:                return( errnode() );
        !           596:                }
        !           597: else   p = (int *)name(s,0);
        !           598: 
        !           599: q = (int *)ALLOC(defblock);
        !           600: p->tag = TDEFINE;
        !           601: q->tag = TDEFINE;
        !           602: p->blklevel = q->blklevel = (blklevel==0 ? 0 : 1);
        !           603: q->sthead = p;
        !           604: p->varp = q;
        !           605: ((struct defblock *)p->varp)->valp = copys(v);
        !           606: return(p);
        !           607: }
        !           608: 
        !           609: 
        !           610: 
        !           611: mkknown(s,t)
        !           612: char *s;
        !           613: int t;
        !           614: {
        !           615: register ptr p;
        !           616: 
        !           617: p = (int *)ALLOC(knownname);
        !           618: p->nextfunct = knownlist;
        !           619: p->tag = TKNOWNFUNCT;
        !           620: knownlist = p;
        !           621: p->funcname = s;
        !           622: p->functype = t;
        !           623: }
        !           624: 
        !           625: 
        !           626: 
        !           627: 
        !           628: 
        !           629: 
        !           630: 
        !           631: ptr mkint(k)
        !           632: int k;
        !           633: {
        !           634: return( mkconst(TYINT, convic(k) ) );
        !           635: }
        !           636: 
        !           637: 
        !           638: ptr mkconst(t,p)
        !           639: int t;
        !           640: ptr p;
        !           641: {
        !           642: ptr q;
        !           643: 
        !           644: q = mknode(TCONST, 0, copys(p), PNULL);
        !           645: q->vtype = t;
        !           646: if(t == TYCHAR)
        !           647:        q->vtypep = mkint( strlen(p) );
        !           648: return(q);
        !           649: }
        !           650: 
        !           651: 
        !           652: 
        !           653: ptr mkimcon(t,p)
        !           654: int t;
        !           655: char *p;
        !           656: {
        !           657: ptr q;
        !           658: char *zero, buff[100];
        !           659: 
        !           660: zero = (t==TYCOMPLEX ? "0." : "0d0");
        !           661: sprintf(buff, "(%s,%s)", zero, p);
        !           662: q = mknode(TCONST, 0, copys(buff), PNULL);
        !           663: q->vtype = t;
        !           664: return(q);
        !           665: }
        !           666: 
        !           667: 
        !           668: 
        !           669: ptr mkarrow(p,t)
        !           670: register ptr p;
        !           671: ptr t;
        !           672: {
        !           673: register ptr q, s;
        !           674: 
        !           675: if(p->vsubs == 0)
        !           676:        if(p->vdim==0 && p->vtype!=TYCHAR && p->vtype!=TYSTRUCT)
        !           677:                {
        !           678:                exprerr("need an aggregate to the left of arrow",CNULL);
        !           679:                frexpr(p);
        !           680:                return( errnode() );
        !           681:                }
        !           682:        else    {
        !           683:                if(p->vdim)
        !           684:                        {
        !           685:                        s = 0;
        !           686:                        for(q = ((chainp)p->vdim)->datap ; q ; q = q->nextp)
        !           687:                                s = (int *)mkchain( mkint(1), s);
        !           688:                        subscript(p, mknode(TLIST,0,s,PNULL) );
        !           689:                        }
        !           690:                }
        !           691: 
        !           692: p->vtype = TYSTRUCT;
        !           693: p->vtypep = t->varp;
        !           694: return(p);
        !           695: }
        !           696: 
        !           697: 
        !           698: 
        !           699: 
        !           700: 
        !           701: mkequiv(p)
        !           702: ptr p;
        !           703: {
        !           704: ptr q, t;
        !           705: int first;
        !           706: 
        !           707: swii(iefile);
        !           708: putic(ICBEGIN, 0);
        !           709: putic(ICINDENT, 0);
        !           710: putic(ICKEYWORD, FEQUIVALENCE);
        !           711: putic(ICOP, OPLPAR);
        !           712: first = 1;
        !           713: 
        !           714: for(q = p ; q ; q = q->nextp)
        !           715:        {
        !           716:        if(first)  first = 0;
        !           717:        else putic(ICOP, OPCOMMA);
        !           718:        prexpr( t =  simple(LVAL,q->datap) );
        !           719:        frexpr(t);
        !           720:        }
        !           721: 
        !           722: putic(ICOP, OPRPAR);
        !           723: swii(icfile);
        !           724: frchain( &p );
        !           725: }
        !           726: 
        !           727: 
        !           728: 
        !           729: 
        !           730: mkgeneric(gname,atype,fname,ftype)
        !           731: char *gname, *fname;
        !           732: int atype, ftype;
        !           733: {
        !           734: register ptr p;
        !           735: ptr generic();
        !           736: 
        !           737: if(p = generic(gname))
        !           738:        {
        !           739:        if(p->genfname[atype])
        !           740:                fatal1("generic name already defined", gname);
        !           741:        }
        !           742: else   {
        !           743:        p = (int *)ALLOC(genblock);
        !           744:        p->tag = TGENERIC;
        !           745:        p->nextgenf = generlist;
        !           746:        generlist = p;
        !           747:        p->genname = gname;
        !           748:        }
        !           749: 
        !           750: p->genfname[atype] = fname;
        !           751: p->genftype[atype] = ftype;
        !           752: }
        !           753: 
        !           754: 
        !           755: ptr generic(s)
        !           756: char *s;
        !           757: {
        !           758: register ptr p;
        !           759: 
        !           760: for(p= generlist; p ; p = p->nextgenf)
        !           761:        if(equals(s, p->genname))
        !           762:                return(p);
        !           763: return(0);
        !           764: }
        !           765: 
        !           766: 
        !           767: knownfunct(s)
        !           768: char *s;
        !           769: {
        !           770: register ptr p;
        !           771: 
        !           772: for(p = knownlist ; p ; p = p->nextfunct)
        !           773:        if(equals(s, p->funcname))
        !           774:                return(p->functype);
        !           775: return(0);
        !           776: }
        !           777: 
        !           778: 
        !           779: 
        !           780: 
        !           781: 
        !           782: ptr funcinv(p)
        !           783: register ptr p;
        !           784: {
        !           785: ptr fp, fp1;
        !           786: register ptr g;
        !           787: char *s;
        !           788: register int t;
        !           789: int vt;
        !           790: 
        !           791: if(g = generic(s = ((struct stentry *)((struct typeblock *)p->leftp)->sthead)->namep))
        !           792:        {
        !           793:        if(((struct headbits *)p->rightp)->tag==TLIST && ((struct exprblock *)p->rightp)->leftp
        !           794:                && ( (vt = typearg(((struct exprblock *)p->rightp)->leftp)) >=0)
        !           795:                && (t = g->genftype[vt]) )
        !           796:                {
        !           797:                p->leftp = builtin(t, g->genfname[vt]);
        !           798:                }
        !           799:        else    {
        !           800:                dclerr("improper use of generic function", s);
        !           801:                frexpr(p);
        !           802:                return( errnode() );
        !           803:                }
        !           804:        }
        !           805: 
        !           806: fp = p->leftp;
        !           807: setvproc(fp, PROCYES);
        !           808: fp1 = ((struct stentry *)fp->sthead)->varp;
        !           809: s = ((struct stentry *)fp->sthead)->namep;
        !           810: 
        !           811: if(p->vtype==TYUNDEFINED && fp->vclass!=CLARG)
        !           812:        if(t = knownfunct(s))
        !           813:                {
        !           814:                p->vtype = t;
        !           815:                setvproc(fp, PROCINTRINSIC);
        !           816:                setvproc(fp1, PROCINTRINSIC);
        !           817:                fp1->vtype = t;
        !           818:                builtin(t,((struct stentry *)fp1->sthead)->namep);
        !           819:                cpblock(fp1, fp, sizeof(struct exprblock));
        !           820:                }
        !           821: 
        !           822: dclit(p);
        !           823: return(p);
        !           824: }
        !           825: 
        !           826: 
        !           827: 
        !           828: 
        !           829: typearg(p0)
        !           830: register chainp p0;
        !           831: {
        !           832: register chainp p;
        !           833: register int vt, maxt;
        !           834: 
        !           835: if(p0 == NULL)
        !           836:        return(-1);
        !           837: maxt = ((struct exprblock *)p0->datap)->vtype;
        !           838: 
        !           839: for(p = (chainp)p0->nextp ; p ; p = (chainp)p->nextp)
        !           840:        if( (vt = ((struct exprblock *)p->datap)->vtype) > maxt)
        !           841:                maxt = vt;
        !           842: 
        !           843: for(p = p0 ; p ; p = (chainp)p->nextp)
        !           844:        p->datap = coerce(maxt, p->datap);
        !           845: 
        !           846: return(maxt);
        !           847: }
        !           848: 
        !           849: 
        !           850: 
        !           851: 
        !           852: ptr typexpr(t,e)
        !           853: register ptr t, e;
        !           854: {
        !           855: ptr e1;
        !           856: int etag;
        !           857: 
        !           858: if(t->atdim!=0 || (e->tag==TLIST && t->attype!=TYCOMPLEX) )
        !           859:        goto typerr;
        !           860: 
        !           861: switch(t->attype)
        !           862:        {
        !           863:        case TYCOMPLEX:
        !           864:                if(e->tag==TLIST)
        !           865:                        if(e->leftp==0 || ((chainp)e->leftp)->nextp==0
        !           866:                            || ((chainp)((chainp)e->leftp)->nextp)->nextp!=0)
        !           867:                                {
        !           868:                                exprerr("bad conversion to complex", "");
        !           869:                                return( errnode() );
        !           870:                                }
        !           871:                        else    {
        !           872:                                ((chainp)e->leftp)->datap = simple(RVAL,
        !           873:                                                ((chainp)e->leftp)->datap);
        !           874:                                ((chainp)((chainp)e->leftp)->nextp)->datap = simple(RVAL,
        !           875:                                                ((chainp)((chainp)e->leftp)->nextp)->datap);
        !           876:                                if(isconst(((chainp)e->leftp)->datap) &&
        !           877:                                   isconst(((chainp)((chainp)e->leftp)->nextp)->datap) )
        !           878:                                        return( compconst(e) );
        !           879:                                e1 = mkcall(builtin(TYCOMPLEX,"cmplx"),
        !           880:                                        arg2( coerce(TYREAL,((chainp)e->leftp)->datap),
        !           881:                                        coerce(TYREAL,((chainp)((chainp)e->leftp)->nextp)->datap)));
        !           882:                                frchain( &(e->leftp) );
        !           883:                                frexpblock(e);
        !           884:                                return(e1);
        !           885:                                }
        !           886: 
        !           887:        case TYINT:
        !           888:        case TYREAL:
        !           889:        case TYLREAL:
        !           890:        case TYLOG:
        !           891:        case TYFIELD:
        !           892:                e = coerce(t->attype, simple(RVAL, e) );
        !           893:                etag = e->tag;
        !           894:                if(etag==TAROP || etag==TLOGOP || etag==TRELOP)
        !           895:                        e->needpar = YES;
        !           896:                return(e);
        !           897: 
        !           898:        case TYCHAR:
        !           899:        case TYSTRUCT:
        !           900:                goto typerr;
        !           901:        }
        !           902: 
        !           903: typerr:
        !           904:        exprerr("typexpr not fully implemented", "");
        !           905:        frexpr(e);
        !           906:        return( errnode() );
        !           907: }
        !           908: 
        !           909: 
        !           910: 
        !           911: 
        !           912: ptr compconst(p)
        !           913: register ptr p;
        !           914: {
        !           915: register ptr a, b;
        !           916: int as, bs;
        !           917: int prec;
        !           918: 
        !           919: prec = TYREAL;
        !           920: p = p->leftp;
        !           921: if(p == 0)
        !           922:        goto err;
        !           923: if(((struct exprblock *)p->datap)->vtype == TYLREAL)
        !           924:        prec = TYLREAL;
        !           925: a = coerce(TYLREAL, p->datap);
        !           926: p = p->nextp;
        !           927: if(p->nextp)
        !           928:        goto err;
        !           929: if(((struct exprblock *)p->datap)->vtype == TYLREAL)
        !           930:        a = coerce(prec = TYLREAL,a);
        !           931: b = coerce(TYLREAL, p->datap);
        !           932: 
        !           933: if(a->tag==TNEGOP)
        !           934:        {
        !           935:        as = '-';
        !           936:        a = a->leftp;
        !           937:        }
        !           938: else   as = ' ';
        !           939: 
        !           940: if(b->tag==TNEGOP)
        !           941:        {
        !           942:        bs = '-';
        !           943:        b = b->leftp;
        !           944:        }
        !           945: else   bs = ' ';
        !           946: 
        !           947: if(a->tag!=TCONST || a->vtype!=prec ||
        !           948:    b->tag!=TCONST || b->vtype!=prec )
        !           949:                goto err;
        !           950: 
        !           951: if(prec==TYLREAL && tailor.lngcxtype==NULL)
        !           952:        {
        !           953:        ptr q, e1, e2;
        !           954:        struct dimblock *dp;
        !           955:        sprintf(msg, "_const%d", ++constno);
        !           956:        q = mkvar(mkname(msg));
        !           957:        q->vtype = TYLREAL;
        !           958:        dclit(q);
        !           959:        dp = ALLOC(dimblock);
        !           960:        dp->upperb = mkint(2);
        !           961:        q->vdim = (int *)mkchain(dp,CHNULL);
        !           962:        sprintf(msg, "%c%s", as, a->leftp);
        !           963:        e1 = mkconst(TYLREAL, msg);
        !           964:        sprintf(msg, "%c%s", bs, b->leftp);
        !           965:        e2 = mkconst(TYLREAL, msg);
        !           966:        mkinit(q, mknode(TLIST,0, mkchain(e1,mkchain(e2,CHNULL)),PNULL) );
        !           967:        cfree(q->vdim);
        !           968:        q->vtype = TYLCOMPLEX;
        !           969:        return(q);
        !           970:        }
        !           971: else
        !           972:        {
        !           973:        sprintf(msg, "(%c%s, %c%s)", as, a->leftp, bs, b->leftp);
        !           974:        return( mkconst(TYCOMPLEX, msg) );
        !           975:        }
        !           976: 
        !           977: err:   exprerr("invalid complex constant", "");
        !           978:        return( errnode() );
        !           979: }
        !           980: 
        !           981: 
        !           982: 
        !           983: 
        !           984: ptr mkchcon(p)
        !           985: char *p;
        !           986: {
        !           987: register ptr q;
        !           988: char buf[10];
        !           989: 
        !           990: sprintf(buf, "_const%d", ++constno);
        !           991: q = mkvar(mkname(buf));
        !           992: q->vtype = TYCHAR;
        !           993: q->vtypep = mkint(strlen(p));
        !           994: mkinit(q, mkconst(TYCHAR, p));
        !           995: return(q);
        !           996: }
        !           997: 
        !           998: 
        !           999: 
        !          1000: ptr mksub1()
        !          1001: {
        !          1002: return( mknode(TLIST,0, mkchain(mkint(1),CHNULL), PNULL) );
        !          1003: }

unix.superglobalmegacorp.com

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