Annotation of 40BSD/cmd/efl/mk.c, revision 1.1.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 = commonlist ; p ; p = p->nextp)
                     11:        if(equals(s, p->datap->comname))
                     12:                return(p->datap);
                     13: 
                     14: p = 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 = name(s,1)) == 0)
                     32:        {
                     33:        p = 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 = 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 || 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 || l->vtypep->strsize!=r->vtypep->strsize
                    247:                                || l->vtypep->stralign!=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(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(instruct || p->varp==0 || p->varp->blklevel<blklevel)
                    299:        {
                    300:        q = allexpblock();
                    301:        q->tag = TNAME;
                    302:        q->sthead = p;
                    303:        q->blklevel = blklevel;
                    304:        if(! instruct)
                    305:                ++ndecl[blklevel];
                    306:        }
                    307: else q = p->varp;
                    308: 
                    309: if(!instruct)
                    310:        {
                    311:        if(p->varp && p->varp->blklevel<blklevel)
                    312:                hide(p);
                    313:        if(p->varp == 0)
                    314:                p->varp = q;
                    315:        }
                    316: 
                    317: p->tag = TNAME;
                    318: return(q);
                    319: }
                    320: 
                    321: 
                    322: ptr mkstruct(v,s)
                    323: register ptr v;
                    324: ptr s;
                    325: {
                    326: register ptr p;
                    327: 
                    328: p = ALLOC(typeblock);
                    329: p->sthead = v;
                    330: p->tag = TSTRUCT;
                    331: p->blklevel = blklevel;
                    332: p->strdesc = s;
                    333: offsets(p);
                    334: if(v)  {
                    335:        v->blklevel = blklevel;
                    336:        ++ndecl[blklevel];
                    337:        v->varp = p;
                    338:        }
                    339: else   temptypelist = mkchain(p, temptypelist);
                    340: return(p);
                    341: }
                    342: 
                    343: 
                    344: ptr mkcall(fn1, args)
                    345: ptr fn1, args;
                    346: {
                    347: int i, j, first;
                    348: register ptr funct, p, q;
                    349: ptr r;
                    350: 
                    351: if(fn1->tag == TERROR)
                    352:        return( errnode() );
                    353: else if(fn1->tag == TNAME)
                    354:        {
                    355:        funct = fn1->sthead->varp;
                    356:        frexpblock(fn1);
                    357:        }
                    358: else
                    359:        funct = fn1;
                    360: if(funct->vclass!=0 && funct->vclass!=CLARG)
                    361:        {
                    362:        exprerr("invalid invocation of %s",funct->sthead->namep);
                    363:        frexpr(args);
                    364:        return( errnode() );
                    365:        }
                    366: else   extname(funct);
                    367: 
                    368: if(args)  for(p = args->leftp; p ; p = p->nextp)
                    369:        {
                    370:        q = p->datap;
                    371:        if( (q->tag==TCALL&&q->vtype==TYUNDEFINED) ||
                    372:            (q->tag==TNAME&&q->vdcldone==0) )
                    373:                dclit(q);
                    374:        if(q->tag==TNAME && q->vproc==PROCUNKNOWN)
                    375:                setvproc(q, PROCNO);
                    376:        if( q->vtype == TYSTRUCT)
                    377:                {
                    378:                first = 1;
                    379:                for(i = 0; i<NFTNTYPES ; ++i)
                    380:                        if(q->vbase[i] != 0)
                    381:                                {
                    382:                                r = cpexpr(q);
                    383:                                if(first)
                    384:                                        {
                    385:                                        p->datap = r;
                    386:                                        first = 0;
                    387:                                        }
                    388:                                else    p = p->nextp = mkchain(r, p->nextp);
                    389:                                r->vtype = ftnefl[i];
                    390:                                for(j=0; j<NFTNTYPES; ++j)
                    391:                                        if(i != j) r->vbase[j] = 0;
                    392:                                }
                    393:                frexpblock(q);
                    394:                }
                    395:        }
                    396: 
                    397: return( mknode(TCALL,0,cpexpr(funct), args) );
                    398: }
                    399: 
                    400: 
                    401: 
                    402: mkcase(p,here)
                    403: ptr p;
                    404: int here;
                    405: {
                    406: register ptr q, s;
                    407: 
                    408: for(s = thisctl ; s!=0 && s->subtype!=STSWITCH ; s = s->prevctl)
                    409:        ;
                    410: if(s==0 || (here && s!=thisctl) )
                    411:        {
                    412:        laberr("invalid case label location",CNULL);
                    413:        return(0);
                    414:        }
                    415: for(q = s->loopctl ; q!=0 && !eqcon(p,q->casexpr) ; q = q->nextcase)
                    416:        ;
                    417: if(q == 0)
                    418:        {
                    419:        q = ALLOC(caseblock);
                    420:        q->tag = TCASE;
                    421:        q->casexpr = p;
                    422:        q->labelno = ( here ? thislab() : nextlab() );
                    423:        q->nextcase = s->loopctl;
                    424:        s->loopctl = q;
                    425:        }
                    426: else if(here)
                    427:        if(thisexec->labelno == 0)
                    428:                thisexec->labelno = q->labelno;
                    429:        else if(thisexec->labelno != q->labelno)
                    430:                {
                    431:                exnull();
                    432:                thisexec->labelno = q->labelno;
                    433:                thisexec->labused = 0;
                    434:                }
                    435: if(here)
                    436:        if(q->labdefined)
                    437:                laberr("multiply defined case",CNULL);
                    438:        else
                    439:                q->labdefined = 1;
                    440: return(q->labelno);
                    441: }
                    442: 
                    443: 
                    444: ptr mkilab(p)
                    445: ptr p;
                    446: {
                    447: char *s, l[30];
                    448: 
                    449: if(p->tag!=TCONST || p->vtype!=TYINT)
                    450:        {
                    451:        execerr("invalid label","");
                    452:        s = "";
                    453:        }
                    454: else   s = p->leftp;
                    455: 
                    456: while(*s == '0')
                    457:        ++s;
                    458: sprintf(l,"#%s", s);
                    459: 
                    460: 
                    461: TEST fprintf(diagfile,"numeric label = %s\n", l);
                    462: return( mkname(l) );
                    463: }
                    464: 
                    465: 
                    466: 
                    467: 
                    468: mklabel(p,here)
                    469: ptr p;
                    470: int here;
                    471: {
                    472: register ptr q;
                    473: 
                    474: if(q = p->varp)
                    475:        {
                    476:        if(q->tag != TLABEL)
                    477:                laberr("%s is already a nonlabel\n", p->namep);
                    478:        else if(q->labinacc)
                    479:                warn1("label %s is inaccessible", p->namep);
                    480:        else if(here)
                    481:                if(q->labdefined)
                    482:                        laberr("%s is already defined\n", p->namep);
                    483:                else if(blklevel > q->blklevel)
                    484:                        laberr("%s is illegally placed\n",p->namep);
                    485:                else    {
                    486:                        q->labdefined = 1;
                    487:                        if(thisexec->labelno == 0)
                    488:                                thisexec->labelno = q->labelno;
                    489:                        else if(thisexec->labelno != q->labelno)
                    490:                                {
                    491:                                exnull();
                    492:                                thisexec->labelno = q->labelno;
                    493:                                thisexec->labused = 0;
                    494:                                }
                    495:                        }
                    496:        }
                    497: else   {
                    498:        q = ALLOC(labelblock);
                    499:        p->varp = q;
                    500:        q->tag = TLABEL;
                    501:        q->subtype = 0;
                    502:        q->blklevel = blklevel;
                    503:        ++ndecl[blklevel];
                    504:        q->labdefined = here;
                    505:        q->labelno = ( here ? thislab() : nextlab() );
                    506:        q->sthead = p;
                    507:        }
                    508: 
                    509: return(q->labelno);
                    510: }
                    511: 
                    512: 
                    513: thislab()
                    514: {
                    515: if(thisexec->labelno == 0)
                    516:        thisexec->labelno = nextlab();
                    517: return(thisexec->labelno);
                    518: }
                    519: 
                    520: 
                    521: nextlab()
                    522: {
                    523: stnos[++labno] = 0;
                    524: return( labno );
                    525: }
                    526: 
                    527: 
                    528: nextindif()
                    529: {
                    530: if(++nxtindif < MAXINDIFS)
                    531:        return(nxtindif);
                    532: fatal("too many indifs");
                    533: }
                    534: 
                    535: 
                    536: 
                    537: 
                    538: mkkeywd(s, n)
                    539: char *s;
                    540: int n;
                    541: {
                    542: register ptr p;
                    543: register ptr q;
                    544: 
                    545: p = name(s, 2);
                    546: q = ALLOC(keyblock);
                    547: p->tag = TKEYWORD;
                    548: q->tag = TKEYWORD;
                    549: p->subtype = n;
                    550: q->subtype = n;
                    551: p->blklevel = 0;
                    552: p->varp = q;
                    553: q->sthead = p;
                    554: }
                    555: 
                    556: 
                    557: ptr mkdef(s, v)
                    558: char *s, *v;
                    559: {
                    560: register ptr p;
                    561: register ptr q;
                    562: 
                    563: if(p = name(s,1))
                    564:        if(p->blklevel == 0)
                    565:                {
                    566:                if(blklevel > 0)
                    567:                        hide(p);
                    568:                else if(p->tag != TDEFINE)
                    569:                        dclerr("attempt to DEFINE a variable name", s);
                    570:                else    {
                    571:                        if( strcmp(v, (q=p->varp) ->valp) )
                    572:                                {
                    573:                                warn("macro value replaced");
                    574:                                cfree(q->valp);
                    575:                                q->valp = copys(v);
                    576:                                }
                    577:                        return(p);
                    578:                        }
                    579:                }
                    580:        else    {
                    581:                dclerr("type already defined", s);
                    582:                return( errnode() );
                    583:                }
                    584: else   p = name(s,0);
                    585: 
                    586: q = ALLOC(defblock);
                    587: p->tag = TDEFINE;
                    588: q->tag = TDEFINE;
                    589: p->blklevel = q->blklevel = (blklevel==0 ? 0 : 1);
                    590: q->sthead = p;
                    591: p->varp = q;
                    592: p->varp->valp = copys(v);
                    593: return(p);
                    594: }
                    595: 
                    596: 
                    597: 
                    598: mkknown(s,t)
                    599: char *s;
                    600: int t;
                    601: {
                    602: register ptr p;
                    603: 
                    604: p = ALLOC(knownname);
                    605: p->nextfunct = knownlist;
                    606: p->tag = TKNOWNFUNCT;
                    607: knownlist = p;
                    608: p->funcname = s;
                    609: p->functype = t;
                    610: }
                    611: 
                    612: 
                    613: 
                    614: 
                    615: 
                    616: 
                    617: 
                    618: ptr mkint(k)
                    619: int k;
                    620: {
                    621: return( mkconst(TYINT, convic(k) ) );
                    622: }
                    623: 
                    624: 
                    625: ptr mkconst(t,p)
                    626: int t;
                    627: ptr p;
                    628: {
                    629: ptr q;
                    630: 
                    631: q = mknode(TCONST, 0, copys(p), PNULL);
                    632: q->vtype = t;
                    633: if(t == TYCHAR)
                    634:        q->vtypep = mkint( strlen(p) );
                    635: return(q);
                    636: }
                    637: 
                    638: 
                    639: 
                    640: ptr mkimcon(t,p)
                    641: int t;
                    642: char *p;
                    643: {
                    644: ptr q;
                    645: char *zero, buff[100];
                    646: 
                    647: zero = (t==TYCOMPLEX ? "0." : "0d0");
                    648: sprintf(buff, "(%s,%s)", zero, p);
                    649: q = mknode(TCONST, 0, copys(buff), PNULL);
                    650: q->vtype = t;
                    651: return(q);
                    652: }
                    653: 
                    654: 
                    655: 
                    656: ptr mkarrow(p,t)
                    657: register ptr p;
                    658: ptr t;
                    659: {
                    660: register ptr q, s;
                    661: 
                    662: if(p->vsubs == 0)
                    663:        if(p->vdim==0 && p->vtype!=TYCHAR && p->vtype!=TYSTRUCT)
                    664:                {
                    665:                exprerr("need an aggregate to the left of arrow",CNULL);
                    666:                frexpr(p);
                    667:                return( errnode() );
                    668:                }
                    669:        else    {
                    670:                if(p->vdim)
                    671:                        {
                    672:                        s = 0;
                    673:                        for(q = p->vdim->datap ; q ; q = q->nextp)
                    674:                                s = mkchain( mkint(1), s);
                    675:                        subscript(p, mknode(TLIST,0,s,PNULL) );
                    676:                        }
                    677:                }
                    678: 
                    679: p->vtype = TYSTRUCT;
                    680: p->vtypep = t->varp;
                    681: return(p);
                    682: }
                    683: 
                    684: 
                    685: 
                    686: 
                    687: 
                    688: mkequiv(p)
                    689: ptr p;
                    690: {
                    691: ptr q, t;
                    692: int first;
                    693: 
                    694: swii(iefile);
                    695: putic(ICBEGIN, 0);
                    696: putic(ICINDENT, 0);
                    697: putic(ICKEYWORD, FEQUIVALENCE);
                    698: putic(ICOP, OPLPAR);
                    699: first = 1;
                    700: 
                    701: for(q = p ; q ; q = q->nextp)
                    702:        {
                    703:        if(first)  first = 0;
                    704:        else putic(ICOP, OPCOMMA);
                    705:        prexpr( t =  simple(LVAL,q->datap) );
                    706:        frexpr(t);
                    707:        }
                    708: 
                    709: putic(ICOP, OPRPAR);
                    710: swii(icfile);
                    711: frchain( &p );
                    712: }
                    713: 
                    714: 
                    715: 
                    716: 
                    717: mkgeneric(gname,atype,fname,ftype)
                    718: char *gname, *fname;
                    719: int atype, ftype;
                    720: {
                    721: register ptr p;
                    722: ptr generic();
                    723: 
                    724: if(p = generic(gname))
                    725:        {
                    726:        if(p->genfname[atype])
                    727:                fatal1("generic name already defined", gname);
                    728:        }
                    729: else   {
                    730:        p = ALLOC(genblock);
                    731:        p->tag = TGENERIC;
                    732:        p->nextgenf = generlist;
                    733:        generlist = p;
                    734:        p->genname = gname;
                    735:        }
                    736: 
                    737: p->genfname[atype] = fname;
                    738: p->genftype[atype] = ftype;
                    739: }
                    740: 
                    741: 
                    742: ptr generic(s)
                    743: char *s;
                    744: {
                    745: register ptr p;
                    746: 
                    747: for(p= generlist; p ; p = p->nextgenf)
                    748:        if(equals(s, p->genname))
                    749:                return(p);
                    750: return(0);
                    751: }
                    752: 
                    753: 
                    754: knownfunct(s)
                    755: char *s;
                    756: {
                    757: register ptr p;
                    758: 
                    759: for(p = knownlist ; p ; p = p->nextfunct)
                    760:        if(equals(s, p->funcname))
                    761:                return(p->functype);
                    762: return(0);
                    763: }
                    764: 
                    765: 
                    766: 
                    767: 
                    768: 
                    769: ptr funcinv(p)
                    770: register ptr p;
                    771: {
                    772: ptr fp, fp1;
                    773: register ptr g;
                    774: char *s;
                    775: register int t;
                    776: int vt;
                    777: 
                    778: if(g = generic(s = p->leftp->sthead->namep))
                    779:        {
                    780:        if(p->rightp->tag==TLIST && p->rightp->leftp
                    781:                && ( (vt = typearg(p->rightp->leftp)) >=0)
                    782:                && (t = g->genftype[vt]) )
                    783:                {
                    784:                p->leftp = builtin(t, g->genfname[vt]);
                    785:                }
                    786:        else    {
                    787:                dclerr("improper use of generic function", s);
                    788:                frexpr(p);
                    789:                return( errnode() );
                    790:                }
                    791:        }
                    792: 
                    793: fp = p->leftp;
                    794: setvproc(fp, PROCYES);
                    795: fp1 = fp->sthead->varp;
                    796: s = fp->sthead->namep;
                    797: 
                    798: if(p->vtype==TYUNDEFINED && fp->vclass!=CLARG)
                    799:        if(t = knownfunct(s))
                    800:                {
                    801:                p->vtype = t;
                    802:                setvproc(fp, PROCINTRINSIC);
                    803:                setvproc(fp1, PROCINTRINSIC);
                    804:                fp1->vtype = t;
                    805:                builtin(t,fp1->sthead->namep);
                    806:                cpblock(fp1, fp, sizeof(struct exprblock));
                    807:                }
                    808: 
                    809: dclit(p);
                    810: return(p);
                    811: }
                    812: 
                    813: 
                    814: 
                    815: 
                    816: typearg(p0)
                    817: register chainp p0;
                    818: {
                    819: register chainp p;
                    820: register int vt, maxt;
                    821: 
                    822: if(p0 == NULL)
                    823:        return(-1);
                    824: maxt = p0->datap->vtype;
                    825: 
                    826: for(p = p0->nextp ; p ; p = p->nextp)
                    827:        if( (vt = p->datap->vtype) > maxt)
                    828:                maxt = vt;
                    829: 
                    830: for(p = p0 ; p ; p = p->nextp)
                    831:        p->datap = coerce(maxt, p->datap);
                    832: 
                    833: return(maxt);
                    834: }
                    835: 
                    836: 
                    837: 
                    838: 
                    839: ptr typexpr(t,e)
                    840: register ptr t, e;
                    841: {
                    842: ptr e1;
                    843: int etag;
                    844: 
                    845: if(t->atdim!=0 || (e->tag==TLIST && t->attype!=TYCOMPLEX) )
                    846:        goto typerr;
                    847: 
                    848: switch(t->attype)
                    849:        {
                    850:        case TYCOMPLEX:
                    851:                if(e->tag==TLIST)
                    852:                        if(e->leftp==0 || e->leftp->nextp==0
                    853:                            || e->leftp->nextp->nextp!=0)
                    854:                                {
                    855:                                exprerr("bad conversion to complex", "");
                    856:                                return( errnode() );
                    857:                                }
                    858:                        else    {
                    859:                                e->leftp->datap = simple(RVAL,
                    860:                                                e->leftp->datap);
                    861:                                e->leftp->nextp->datap = simple(RVAL,
                    862:                                                e->leftp->nextp->datap);
                    863:                                if(isconst(e->leftp->datap) &&
                    864:                                   isconst(e->leftp->nextp->datap) )
                    865:                                        return( compconst(e) );
                    866:                                e1 = mkcall(builtin(TYCOMPLEX,"cmplx"),
                    867:                                        arg2( coerce(TYREAL,e->leftp->datap),
                    868:                                        coerce(TYREAL,e->leftp->nextp->datap)));
                    869:                                frchain( &(e->leftp) );
                    870:                                frexpblock(e);
                    871:                                return(e1);
                    872:                                }
                    873: 
                    874:        case TYINT:
                    875:        case TYREAL:
                    876:        case TYLREAL:
                    877:        case TYLOG:
                    878:        case TYFIELD:
                    879:                e = coerce(t->attype, simple(RVAL, e) );
                    880:                etag = e->tag;
                    881:                if(etag==TAROP || etag==TLOGOP || etag==TRELOP)
                    882:                        e->needpar = YES;
                    883:                return(e);
                    884: 
                    885:        case TYCHAR:
                    886:        case TYSTRUCT:
                    887:                goto typerr;
                    888:        }
                    889: 
                    890: typerr:
                    891:        exprerr("typexpr not fully implemented", "");
                    892:        frexpr(e);
                    893:        return( errnode() );
                    894: }
                    895: 
                    896: 
                    897: 
                    898: 
                    899: ptr compconst(p)
                    900: register ptr p;
                    901: {
                    902: register ptr a, b;
                    903: int as, bs;
                    904: int prec;
                    905: 
                    906: prec = TYREAL;
                    907: p = p->leftp;
                    908: if(p == 0)
                    909:        goto err;
                    910: if(p->datap->vtype == TYLREAL)
                    911:        prec = TYLREAL;
                    912: a = coerce(TYLREAL, p->datap);
                    913: p = p->nextp;
                    914: if(p->nextp)
                    915:        goto err;
                    916: if(p->datap->vtype == TYLREAL)
                    917:        a = coerce(prec = TYLREAL,a);
                    918: b = coerce(TYLREAL, p->datap);
                    919: 
                    920: if(a->tag==TNEGOP)
                    921:        {
                    922:        as = '-';
                    923:        a = a->leftp;
                    924:        }
                    925: else   as = ' ';
                    926: 
                    927: if(b->tag==TNEGOP)
                    928:        {
                    929:        bs = '-';
                    930:        b = b->leftp;
                    931:        }
                    932: else   bs = ' ';
                    933: 
                    934: if(a->tag!=TCONST || a->vtype!=prec ||
                    935:    b->tag!=TCONST || b->vtype!=prec )
                    936:                goto err;
                    937: 
                    938: if(prec==TYLREAL && tailor.lngcxtype==NULL)
                    939:        {
                    940:        ptr q, e1, e2;
                    941:        struct dimblock *dp;
                    942:        sprintf(msg, "_const%d", ++constno);
                    943:        q = mkvar(mkname(msg));
                    944:        q->vtype = TYLREAL;
                    945:        dclit(q);
                    946:        dp = ALLOC(dimblock);
                    947:        dp->upperb = mkint(2);
                    948:        q->vdim = mkchain(dp,CHNULL);
                    949:        sprintf(msg, "%c%s", as, a->leftp);
                    950:        e1 = mkconst(TYLREAL, msg);
                    951:        sprintf(msg, "%c%s", bs, b->leftp);
                    952:        e2 = mkconst(TYLREAL, msg);
                    953:        mkinit(q, mknode(TLIST,0, mkchain(e1,mkchain(e2,CHNULL)),PNULL) );
                    954:        cfree(q->vdim);
                    955:        q->vtype = TYLCOMPLEX;
                    956:        return(q);
                    957:        }
                    958: else
                    959:        {
                    960:        sprintf(msg, "(%c%s, %c%s)", as, a->leftp, bs, b->leftp);
                    961:        return( mkconst(TYCOMPLEX, msg) );
                    962:        }
                    963: 
                    964: err:   exprerr("invalid complex constant", "");
                    965:        return( errnode() );
                    966: }
                    967: 
                    968: 
                    969: 
                    970: 
                    971: ptr mkchcon(p)
                    972: char *p;
                    973: {
                    974: register ptr q;
                    975: char buf[10];
                    976: 
                    977: sprintf(buf, "_const%d", ++constno);
                    978: q = mkvar(mkname(buf));
                    979: q->vtype = TYCHAR;
                    980: q->vtypep = mkint(strlen(p));
                    981: mkinit(q, mkconst(TYCHAR, p));
                    982: return(q);
                    983: }
                    984: 
                    985: 
                    986: 
                    987: ptr mksub1()
                    988: {
                    989: return( mknode(TLIST,0, mkchain(mkint(1),CHNULL), PNULL) );
                    990: }

unix.superglobalmegacorp.com

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