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

1.1     ! root        1: #include "defs"
        !             2: 
        !             3: 
        !             4: hide(p)
        !             5: ptr p;
        !             6: {
        !             7: warn1("Name %s hidden by a new declaration", p->namep);
        !             8: hidlist = mkchain(p->varp, hidlist);
        !             9: p->varp = 0;
        !            10: ++nhid[blklevel];
        !            11: }
        !            12: 
        !            13: 
        !            14: 
        !            15: /*  remove all symbol table entries in terminated block,
        !            16:     revive old hidden names
        !            17: */
        !            18: unhide()
        !            19: {
        !            20: chainp p;
        !            21: register ptr q;
        !            22: register struct stentry *v, *s;
        !            23: struct stentry **hp;
        !            24: 
        !            25: for(hp = hashtab ; hp<hashend ; ++hp)
        !            26:        if(s = *hp)
        !            27:                {
        !            28:                if( (v = (struct stentry *)s->varp) && v->blklevel == blklevel)
        !            29:                        {
        !            30:                        if(v->tag==TLABEL)
        !            31:                                if(blklevel <= 1)
        !            32:                                        {
        !            33:                                        if(v->labdefined==0)
        !            34:                                                laberr("%s never defined",
        !            35:                                                        ((struct stentry *)v->sthead)->namep);
        !            36:                                        s->varp = 0;
        !            37:                                        }
        !            38:                                else    { /* move label out a level */
        !            39:                                        if(v->labdefined)
        !            40:                                                v->labinacc = 1;
        !            41:                                        v->blklevel--;
        !            42:                                        ++ndecl[blklevel-1];
        !            43:                                        }
        !            44:                        else    {
        !            45:                                if(v->tag == TNAME)
        !            46:                                        {
        !            47:                                        TEST fprintf(diagfile,"gone(%s) level %d\n",
        !            48:                                                s->namep, blklevel);
        !            49:                                        gonelist = mkchain(s->varp, gonelist);
        !            50:                                        }
        !            51: 
        !            52:                                else if(v->tag!=TSTRUCT)
        !            53:                                        {
        !            54:                                        ++ndecl[blklevel];
        !            55:                                        if(v->tag==TDEFINE)
        !            56:                                                frdef(v);
        !            57:                                        }
        !            58:                                s->varp = 0;
        !            59:                                }
        !            60:                        --ndecl[blklevel];
        !            61:                        }
        !            62:                }
        !            63: 
        !            64: for( p=hidlist  ;  p && ((v = ((struct stentry *)((struct defblock *)(q=p->datap))->sthead))->varp==NULL) ; p=hidlist )
        !            65:        {
        !            66:        v->varp = q;
        !            67:        v->tag = q->tag;
        !            68:        v->subtype = q->subtype;
        !            69:        if(v->blklevel > q->blklevel)
        !            70:                v->blklevel = q->blklevel;
        !            71:        hidlist = (chainp)p->nextp;
        !            72:        p->nextp = (int *)CHNULL;
        !            73:        frchain(&p);
        !            74:        --nhid[blklevel];
        !            75: TEST fprintf(diagfile, "unhide(%s), blklevel %d\n", v->namep, v->blklevel);
        !            76:        }
        !            77: if(ndecl[blklevel] != 0)
        !            78:        {
        !            79:        sprintf(msg, "%d declarations leftover at block level %d",
        !            80:                ndecl[blklevel], blklevel);
        !            81:        fatal(msg);
        !            82:        }
        !            83: if(nhid[blklevel] != 0)
        !            84:        fatal("leftover hidden variables");
        !            85: }
        !            86: 
        !            87: 
        !            88: 
        !            89: 
        !            90: ptr bgnexec()
        !            91: {
        !            92: register ptr p;
        !            93: 
        !            94: p = allexcblock();
        !            95: p->tag = TEXEC;
        !            96: p->prevexec = thisexec;
        !            97: if(thisexec && thisexec->copylab)
        !            98:        {
        !            99:        p->labelno = thisexec->labelno;
        !           100:        p->labused = thisexec->labused;
        !           101:        thisexec->labelno = 0;
        !           102:        }
        !           103: thisexec = p;
        !           104: return(p);
        !           105: }
        !           106: 
        !           107: 
        !           108: ptr addexec()
        !           109: {
        !           110: register ptr p;
        !           111: register ptr q;
        !           112: 
        !           113: q = thisexec;
        !           114: p = q->prevexec;
        !           115: 
        !           116: if(q->temps)
        !           117:        tempvarlist = hookup(q->temps, tempvarlist);
        !           118: 
        !           119: p->brnchend = q->brnchend;
        !           120: p->nftnst += q->nftnst;
        !           121: p->labeled |= q->labeled;
        !           122: p->uniffable |= q->uniffable;
        !           123: 
        !           124: if(q->labelno && !(q->labused))
        !           125:        {
        !           126:        if(q->nxtlabno)
        !           127:                exnull();
        !           128:        else q->nxtlabno = q->labelno;
        !           129:        }
        !           130: 
        !           131: thisexec = p;
        !           132: 
        !           133: if(q->nxtlabno)
        !           134:        {
        !           135:        if(p->labelno && !(p->labused))
        !           136:                exnull();
        !           137:        p->labelno = q->nxtlabno;
        !           138:        p->labused = 0;
        !           139:        }
        !           140: 
        !           141: frexcblock(q);
        !           142: return(p);
        !           143: }
        !           144: 
        !           145: 
        !           146: 
        !           147: pushctl(t,vp)
        !           148: int t;
        !           149: register ptr vp;
        !           150: {
        !           151: register ptr q;
        !           152: ptr p;
        !           153: int junk;
        !           154: 
        !           155: q = allexcblock();
        !           156: q->tag = TCONTROL;
        !           157: q->subtype = t;
        !           158: q->loopvar = vp;
        !           159: q->prevctl = thisctl;
        !           160: thisctl = q;
        !           161: 
        !           162: switch(t)
        !           163:        {
        !           164:        case STSWITCH:
        !           165:                q->xlab = nextlab();
        !           166:                q->nextlab = 0;
        !           167:                exgoto(q->xlab);
        !           168:                ncases = -1;
        !           169:                break;
        !           170: 
        !           171:        case STFOR:
        !           172:                exlab(0);
        !           173:                q->nextlab = nextlab();
        !           174:                q->xlab = nextlab();
        !           175:                break;
        !           176: 
        !           177:        case STWHILE:
        !           178:                q->nextlab = thislab();
        !           179:                if(vp)
        !           180:                        exifgo( mknode(TNOTOP,OPNOT,vp,PNULL),
        !           181:                                q->breaklab = nextlab() );
        !           182:                else    thisexec->copylab = 1;
        !           183:                break;
        !           184: 
        !           185:        case STREPEAT:
        !           186:                exnull();
        !           187:                q->xlab = thislab();
        !           188:                thisexec->copylab = 1;
        !           189:                junk = nextindif();
        !           190:                indifs[junk] = 0;
        !           191:                q->indifn = junk;
        !           192:                indifs[q->indifn] = q->xlab;
        !           193:                break;
        !           194: 
        !           195:        case STDO:
        !           196:                q->nextlab = nextlab();
        !           197:                exlab(0);
        !           198:                putic(ICKEYWORD,FDO);
        !           199:                putic(ICLABEL, q->nextlab);
        !           200:                putic(ICBLANK, 1);
        !           201:                p = mknode(TASGNOP,OPASGN,vp->dovar,vp->dopar[0]);
        !           202:                prexpr(p);
        !           203:                frexpr(p);
        !           204:                putic(ICOP, OPCOMMA);
        !           205:                prexpr(vp->dopar[1]);
        !           206:                frexpr(vp->dopar[1]);
        !           207:                if(vp->dopar[2])
        !           208:                        {
        !           209:                        putic(ICOP, OPCOMMA);
        !           210:                        prexpr(vp->dopar[2]);
        !           211:                        frexpr(vp->dopar[2]);
        !           212:                        }
        !           213:                cfree(vp);
        !           214:                break;
        !           215: 
        !           216:        case STIF:
        !           217:                exif(vp);
        !           218:                thisexec->nftnst = 0;
        !           219:                break;
        !           220: 
        !           221:        default:
        !           222:                fatal1("pushctl: invalid control block type %d", t);
        !           223:        }
        !           224: 
        !           225: ++ctllevel;
        !           226: }
        !           227: 
        !           228: 
        !           229: 
        !           230: popctl()
        !           231: {
        !           232: register ptr p;
        !           233: ptr newp;
        !           234: chainp q;
        !           235: int first, deflabno, blab, cmin, cmax, range, caseval, optcase;
        !           236: int labp[MAXSWITCH];
        !           237: 
        !           238: if(thisctl == 0)
        !           239:        fatal("empty control stack popped");
        !           240: 
        !           241: switch(thisctl->subtype)
        !           242:        {
        !           243:        case STSWITCH:
        !           244: /*             if(thisexec->brnchend == 0)     */
        !           245:                        {
        !           246:                        if(thisctl->breaklab == 0)
        !           247:                                thisctl->breaklab = nextlab();
        !           248:                        exgoto(thisctl->breaklab);
        !           249:                        }
        !           250:                exlab(thisctl->xlab);
        !           251:                deflabno = 0;
        !           252:                first = YES;
        !           253:                optcase = (((struct exprblock *)thisctl->loopvar)->vtype == TYINT);
        !           254: 
        !           255:                for(p=thisctl->loopctl ; p!=0 ; p = p->nextcase)
        !           256:                        if(p->labdefined == 0)
        !           257:                                {
        !           258:                                laberr("undefined case label", CNULL);
        !           259:                                optcase = NO;
        !           260:                                }
        !           261:                        else if(p->casexpr == 0)
        !           262:                                deflabno = p->labelno;
        !           263:                        else if( isicon(p->casexpr, &caseval))
        !           264:                                {
        !           265:                                if(first)
        !           266:                                        {
        !           267:                                        first = NO;
        !           268:                                        cmin = cmax = caseval;
        !           269:                                        }
        !           270:                                else    {
        !           271:                                        if(caseval < cmin)
        !           272:                                                cmin = caseval;
        !           273:                                        if(caseval > cmax)
        !           274:                                                cmax = caseval;
        !           275:                                        }
        !           276:                                ++ncases;
        !           277:                                }
        !           278:                        else    optcase = NO;
        !           279: 
        !           280:                range = cmax - cmin + 1;
        !           281:                if(optcase && ncases>2 && range<2*ncases && range<MAXSWITCH)
        !           282:                        {
        !           283:                        register int i;
        !           284:                        for(i=0; i<range ; ++i)
        !           285:                                labp[i] = 0;
        !           286:                        for(p=thisctl->loopctl ; p!=0 ; p = p->nextcase)
        !           287:                                if(p->labdefined && p->casexpr)
        !           288:                                        {
        !           289:                                        isicon(p->casexpr, &caseval);
        !           290:                                        frexpr(p->casexpr);
        !           291:                                        labp[caseval-cmin] = p->labelno;
        !           292:                                        }
        !           293:                        
        !           294:                        q = CHNULL;
        !           295:                        blab = (deflabno ? deflabno : thisctl->breaklab);
        !           296:                        for(i=range-1 ; i>=0 ; --i)
        !           297:                                q = mkchain(labp[i] ? labp[i] : blab, q);
        !           298:                        if(cmin < 1)
        !           299:                                excompgoto(q,mknode(TAROP,OPPLUS,
        !           300:                                     cpexpr(thisctl->loopvar), mkint(1-cmin) ));
        !           301:                        else
        !           302:                                excompgoto(q,mknode(TAROP,OPMINUS,
        !           303:                                     cpexpr(thisctl->loopvar), mkint(cmin-1) ));
        !           304:                        }
        !           305:                else    {
        !           306:                        for(p=thisctl->loopctl ; p!=0 ; p = p->nextcase)
        !           307:                                if(p->labdefined && p->casexpr)
        !           308:                                        exifgo( mknode(TRELOP,OPEQ,
        !           309:                                           cpexpr(thisctl->loopvar),p->casexpr),
        !           310:                                           p->labelno);
        !           311:                        }
        !           312:                if(deflabno)
        !           313:                        exgoto(deflabno);
        !           314: 
        !           315:                for(p = thisctl->loopctl ; p; p = newp)
        !           316:                        {
        !           317:                        newp = p->nextcase;
        !           318:                        cfree(p);
        !           319:                        }
        !           320:                thisctl->loopctl = NULL;
        !           321:                break;
        !           322: 
        !           323:        case STFOR:
        !           324:                exgoto(thisctl->nextlab);
        !           325:                break;
        !           326: 
        !           327:        case STWHILE:
        !           328:                exgoto(thisctl->nextlab);
        !           329:                break;
        !           330: 
        !           331:        case STREPEAT:
        !           332:                break;
        !           333: 
        !           334:        case STDO:
        !           335:                exnull();
        !           336:                exlab(thisctl->nextlab);
        !           337:                putic(ICKEYWORD,FCONTINUE);
        !           338:                break;
        !           339: 
        !           340:        case STIF:
        !           341:                break;
        !           342: 
        !           343:        case STPROC:
        !           344:                break;
        !           345: 
        !           346:        default:
        !           347:                fatal1("popctl: invalid control block type %d",
        !           348:                        thisctl->subtype);
        !           349:        }
        !           350: 
        !           351: if(thisctl->breaklab != 0)
        !           352:        thisexec->nxtlabno = thisctl->breaklab;
        !           353: p = thisctl->prevctl;
        !           354: frexcblock(thisctl);
        !           355: thisctl = p;
        !           356: --ctllevel;
        !           357: }

unix.superglobalmegacorp.com

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