Annotation of researchv9/jtools/src/sam/xec.c, revision 1.1

1.1     ! root        1: #include "sam.h"
        !             2: #include "parse.h"
        !             3: 
        !             4: #ifdef lint
        !             5: #define        UNUSED(c)       NONEXISTENT((char *)c)
        !             6: #else
        !             7: #define        UNUSED(c)
        !             8: #endif
        !             9: 
        !            10: int    Glooping;
        !            11: int    nest;
        !            12: 
        !            13: resetxec(){
        !            14:        Glooping=nest=0;
        !            15: }
        !            16: cmdexec(f, cp)
        !            17:        register File *f;
        !            18:        register Cmd *cp;
        !            19: {
        !            20:        register i;
        !            21:        register Addr *ap;
        !            22:        Address a;
        !            23:        if(f && f->state==Unread)
        !            24:                load(f);
        !            25:        if(f==0 && (cp->addr==0 || cp->addr->type!='"') &&
        !            26:            !strchr("bBnqUXY!{", cp->cmdc) &&
        !            27:            cp->cmdc!=('c'|0x100) && !(cp->cmdc=='D' && cp->ctext))
        !            28:                error(Enofile);
        !            29:        i=lookup(cp->cmdc);
        !            30:        if(cmdtab[i].defaddr!=aNo){
        !            31:                if((ap=cp->addr)==0 && cp->cmdc!='\n'){
        !            32:                        cp->addr=ap=newaddr();
        !            33:                        ap->type='.';
        !            34:                        if(cmdtab[i].defaddr==aAll)
        !            35:                                ap->type='*';
        !            36:                }else if(ap && ap->type=='"' && ap->next==0 && cp->cmdc!='\n'){
        !            37:                        ap->next=newaddr();
        !            38:                        ap->next->type='.';
        !            39:                        if(cmdtab[i].defaddr==aAll)
        !            40:                                ap->next->type='*';
        !            41:                }
        !            42:                if(cp->addr){   /* may be false for '\n' (only) */
        !            43:                        addr=address(ap, f->dot, 0);
        !            44:                        f=addr.f;
        !            45:                }
        !            46:        }
        !            47:        current(f);
        !            48:        switch(cp->cmdc){
        !            49:        case '{':
        !            50:                a=cp->addr? address(cp->addr, f->dot, 0): f->dot;
        !            51:                for(cp=cp->ccmd; cp; cp=cp->next){
        !            52:                        a.f->dot=a;
        !            53:                        cmdexec(a.f, cp);
        !            54:                }
        !            55:                break;
        !            56:        default:
        !            57:                i=(*cmdtab[i].fn)(f, cp);
        !            58:                return i;
        !            59:        }
        !            60:        return 1;
        !            61: }
        !            62: a_cmd(f, cp)
        !            63:        File *f;
        !            64:        Cmd *cp;
        !            65: {
        !            66:        return append(f, cp, addr.r.p2);
        !            67: }
        !            68: b_cmd(f, cp)
        !            69:        register File *f;
        !            70:        Cmd *cp;
        !            71: {
        !            72:        extern File *tofile(), *getfile();
        !            73:        UNUSED(f);
        !            74:        f=cp->cmdc=='b'? tofile(cp->ctext) : getfile(cp->ctext);
        !            75:        if(f->state==Unread)
        !            76:                load(f);
        !            77:        else if(nest==0)
        !            78:                filename(f);
        !            79:        return TRUE;
        !            80: }
        !            81: c_cmd(f, cp)
        !            82:        register File *f;
        !            83:        Cmd *cp;
        !            84: {
        !            85:        Fdelete(f, addr.r.p1, addr.r.p2);
        !            86:        f->dot.r.p1=f->dot.r.p2=addr.r.p2;
        !            87:        return append(f, cp, addr.r.p2);
        !            88: }
        !            89: d_cmd(f, cp)
        !            90:        File *f;
        !            91:        Cmd *cp;
        !            92: {
        !            93:        UNUSED(cp);
        !            94:        Fdelete(f, addr.r.p1, addr.r.p2);
        !            95:        f->dot.r.p1=f->dot.r.p2=addr.r.p1;
        !            96:        return TRUE;
        !            97: }
        !            98: D_cmd(f, cp)
        !            99:        File *f;
        !           100:        Cmd *cp;
        !           101: {
        !           102:        closefiles(f, cp->ctext);
        !           103:        return TRUE;
        !           104: }
        !           105: e_cmd(f, cp)
        !           106:        File *f;
        !           107:        Cmd *cp;
        !           108: {
        !           109:        if(getname(f, cp->ctext, cp->cmdc=='e')==0)
        !           110:                error(Enoname);
        !           111:        edit(f, cp->cmdc);
        !           112:        return TRUE;
        !           113: }
        !           114: f_cmd(f, cp)
        !           115:        File *f;
        !           116:        Cmd *cp;
        !           117: {
        !           118:        getname(f, cp->ctext, TRUE);
        !           119:        filename(f);
        !           120:        return TRUE;
        !           121: }
        !           122: g_cmd(f, cp)
        !           123:        File *f;
        !           124:        Cmd *cp;
        !           125: {
        !           126:        if(f!=addr.f)panic("g_cmd f!=addr.f");
        !           127:        compile(cp->re);
        !           128:        if(execute(f, addr.r.p1, addr.r.p2) ^ cp->cmdc=='v'){
        !           129:                f->dot=addr;
        !           130:                return cmdexec(f, cp->ccmd);
        !           131:        }
        !           132:        return TRUE;
        !           133: }
        !           134: i_cmd(f, cp)
        !           135:        File *f;
        !           136:        Cmd *cp;
        !           137: {
        !           138:        return append(f, cp, addr.r.p1);
        !           139: }
        !           140: k_cmd(f, cp)
        !           141:        File *f;
        !           142:        Cmd *cp;
        !           143: {
        !           144:        UNUSED(cp);
        !           145:        f->mark=addr.r;
        !           146:        return TRUE;
        !           147: }
        !           148: m_cmd(f, cp)
        !           149:        register File *f;
        !           150:        register Cmd *cp;
        !           151: {
        !           152:        Address addr2;
        !           153:        addr2=address(cp->caddr, f->dot, 0);
        !           154:        if(cp->cmdc=='m')
        !           155:                move(f, addr2);
        !           156:        else
        !           157:                copy(f, addr2);
        !           158:        current(addr2.f);
        !           159:        return TRUE;
        !           160: }
        !           161: n_cmd(f, cp)
        !           162:        File *f;
        !           163:        Cmd *cp;
        !           164: {
        !           165:        register i;
        !           166:        UNUSED(f);
        !           167:        UNUSED(cp);
        !           168:        for(i=0; i<file.nused; i++){
        !           169:                if(file.ptr[i]==cmd)
        !           170:                        continue;
        !           171:                strdupstr(&genstr, &file.ptr[i]->name);
        !           172:                filename(file.ptr[i]);
        !           173:        }
        !           174:        return TRUE;
        !           175: }
        !           176: p_cmd(f, cp)
        !           177:        File *f;
        !           178:        Cmd *cp;
        !           179: {
        !           180:        UNUSED(cp);
        !           181:        return display(f);
        !           182: }
        !           183: q_cmd(f, cp)
        !           184:        File *f;
        !           185:        Cmd *cp;
        !           186: {
        !           187:        UNUSED(cp);
        !           188:        UNUSED(f);
        !           189:        trytoquit();
        !           190:        if(downloaded){
        !           191:                outT0(Hexit);
        !           192:                return TRUE;
        !           193:        }
        !           194:        return FALSE;
        !           195: }
        !           196: s_cmd(f, cp)
        !           197:        register File *f;
        !           198:        register Cmd *cp;
        !           199: {
        !           200:        register i, c, n;
        !           201:        register Posn p1, op, didsub=0, delta=0;
        !           202:        n=cp->num;
        !           203:        op= -1;
        !           204:        compile(cp->re);
        !           205:        for(p1=addr.r.p1; p1<=addr.r.p2 && execute(f, p1, addr.r.p2); ){
        !           206:                if(sel.p1==sel.p2){     /* empty match? */
        !           207:                        if(sel.p1==op){
        !           208:                                p1++;
        !           209:                                continue;
        !           210:                        }
        !           211:                        p1=sel.p2+1;
        !           212:                }else
        !           213:                        p1=sel.p2;
        !           214:                op=sel.p2;
        !           215:                if(--n>0)
        !           216:                        continue;
        !           217:                strzero(&genstr);
        !           218:                for(i=0; i<cp->ctext->n; i++)
        !           219:                        if((c=cp->ctext->s[i])=='\\' && i<cp->ctext->n-1)
        !           220:                                straddc(&genstr, cp->ctext->s[++i]);
        !           221:                        else if(c!='&')
        !           222:                                straddc(&genstr, c);
        !           223:                        else{
        !           224:                                if(sel.p2-sel.p1>BLOCKSIZE)
        !           225:                                        error(Elongrhs);
        !           226:                                Fchars(f, genbuf, sel.p1, sel.p2);
        !           227:                                strinsert(&genstr,
        !           228:                                        tempstr(genbuf, (int)(sel.p2-sel.p1)),
        !           229:                                        (ulong)genstr.n);
        !           230:                        }
        !           231:                if(sel.p1!=sel.p2){
        !           232:                        Fdelete(f, sel.p1, sel.p2);
        !           233:                        delta-=sel.p2-sel.p1;
        !           234:                }
        !           235:                if(genstr.n){
        !           236:                        Finsert(f, &genstr, sel.p2);
        !           237:                        delta+=genstr.n;
        !           238:                }
        !           239:                didsub=1;
        !           240:                if(!cp->flag)
        !           241:                        break;
        !           242:        }
        !           243:        if(!didsub && nest==0)
        !           244:                error(Enosub);
        !           245:        f->dot.r.p1=addr.r.p1, f->dot.r.p2=addr.r.p2+delta;
        !           246:        return TRUE;
        !           247: }
        !           248: u_cmd(f, cp)
        !           249:        File *f;
        !           250:        Cmd *cp;
        !           251: {
        !           252:        register n;
        !           253:        UNUSED(f);
        !           254:        UNUSED(cp);
        !           255:        n=cp->num;
        !           256:        while(n--)
        !           257:                undo();
        !           258:        return TRUE;
        !           259: }
        !           260: w_cmd(f, cp)
        !           261:        File *f;
        !           262:        Cmd *cp;
        !           263: {
        !           264:        if(getname(f, cp->ctext, FALSE)==0)
        !           265:                error(Enoname);
        !           266:        writef(f);
        !           267:        return TRUE;
        !           268: }
        !           269: x_cmd(f, cp)
        !           270:        File *f;
        !           271:        Cmd *cp;
        !           272: {
        !           273:        if(cp->re)
        !           274:                looper(f, cp, cp->cmdc=='x');
        !           275:        else
        !           276:                linelooper(f, cp);
        !           277:        return TRUE;
        !           278: }
        !           279: X_cmd(f, cp)
        !           280:        File *f;
        !           281:        Cmd *cp;
        !           282: {
        !           283:        UNUSED(f);
        !           284:        filelooper(cp, cp->cmdc=='X');
        !           285:        return TRUE;
        !           286: }
        !           287: unix_cmd(f, cp)
        !           288:        File *f;
        !           289:        Cmd *cp;
        !           290: {
        !           291:        Unix(f, cp->cmdc, cp->ctext, nest);
        !           292:        return TRUE;
        !           293: }
        !           294: eq_cmd(f, cp)
        !           295:        File *f;
        !           296:        Cmd *cp;
        !           297: {
        !           298:        register charsonly;
        !           299:        switch(cp->ctext->n){
        !           300:        case 1:
        !           301:                charsonly=FALSE;
        !           302:                break;
        !           303:        case 2:
        !           304:                if(cp->ctext->s[0]=='#'){
        !           305:                        charsonly=TRUE;
        !           306:                        break;
        !           307:                }
        !           308:        default:
        !           309:                error(Enewline);
        !           310:        }
        !           311:        printposn(f, charsonly);
        !           312:        return TRUE;
        !           313: }
        !           314: nl_cmd(f, cp)
        !           315:        register File *f;
        !           316:        register Cmd *cp;
        !           317: {
        !           318:        register Address ad; /* SUN fix */
        !           319:        if(cp->addr==0){
        !           320:                /* First put it on newline boundaries */
        !           321:                addr=lineaddr((Posn)0, f->dot, -1);
        !           322:                ad=lineaddr((Posn)0, f->dot, 1);
        !           323:                addr.r.p2=ad.r.p2;
        !           324:                if(addr.r.p1==f->dot.r.p1 && addr.r.p2==f->dot.r.p2)
        !           325:                        addr=lineaddr((Posn)1, f->dot, 1);
        !           326:                display(f);
        !           327:        }else if(downloaded)
        !           328:                moveto(f, addr.r);
        !           329:        else
        !           330:                display(f);
        !           331:        return TRUE;
        !           332: }
        !           333: cd_cmd(f, cp)
        !           334:        register File *f;
        !           335:        register Cmd *cp;
        !           336: {
        !           337:        UNUSED(f);
        !           338:        cd(cp->ctext);
        !           339:        return TRUE;
        !           340: }
        !           341: append(f, cp, p)
        !           342:        register File *f;
        !           343:        register Cmd *cp;
        !           344:        register Posn p;
        !           345: {
        !           346:        if(cp->ctext->n>0 && cp->ctext->s[cp->ctext->n-1]==0)
        !           347:                --cp->ctext->n;
        !           348:        if(cp->ctext->n>0)
        !           349:                Finsert(f, cp->ctext, p);
        !           350:        f->dot.r.p1=p;
        !           351:        f->dot.r.p2=p+cp->ctext->n;
        !           352:        return TRUE;
        !           353: }
        !           354: display(f)
        !           355:        register File *f;
        !           356: {
        !           357:        register Posn p1=addr.r.p1, p2=addr.r.p2;
        !           358:        register np, n;
        !           359:        if(f!=addr.f)panic("display f!=addr.f");
        !           360:        while(p1<p2){
        !           361:                np=p2-p1;
        !           362:                if(np>BLOCKSIZE)
        !           363:                        np=BLOCKSIZE;
        !           364:                n=Fchars(f, genbuf, p1, p1+np);
        !           365:                if(n<=0)
        !           366:                        panic("display");
        !           367:                if(downloaded)
        !           368:                        termwrite(genbuf, n);
        !           369:                else
        !           370:                        Write(1, genbuf, n);
        !           371:                p1+=n;
        !           372:        }
        !           373:        f->dot=addr;
        !           374:        return TRUE;
        !           375: }
        !           376: looper(f, cp, xy)
        !           377:        register File *f;
        !           378:        register Cmd *cp;
        !           379: {
        !           380:        register Posn p, op;
        !           381:        Range r;
        !           382:        r=addr.r;
        !           383:        op= xy? -1 : r.p1;
        !           384:        nest++;
        !           385:        compile(cp->re);
        !           386:        for(p=r.p1; p<=r.p2; ){
        !           387:                if(!execute(f, p, r.p2)){ /* no match, but y should still run */
        !           388:                        if(xy || op>r.p2)
        !           389:                                break;
        !           390:                        f->dot.r.p1=op, f->dot.r.p2=r.p2;
        !           391:                        p=r.p2+1;       /* exit next loop */
        !           392:                }else{
        !           393:                        if(sel.p1==sel.p2){     /* empty match? */
        !           394:                                if(sel.p1==op){
        !           395:                                        p++;
        !           396:                                        continue;
        !           397:                                }
        !           398:                                p=sel.p2+1;
        !           399:                        }else
        !           400:                                p=sel.p2;
        !           401:                        if(xy)
        !           402:                                f->dot.r=sel;
        !           403:                        else
        !           404:                                f->dot.r.p1=op, f->dot.r.p2=sel.p1;
        !           405:                }
        !           406:                op=sel.p2;
        !           407:                cmdexec(f, cp->ccmd);
        !           408:                compile(cp->re);
        !           409:        }
        !           410:        --nest;
        !           411: }
        !           412: linelooper(f, cp)
        !           413:        register File *f;
        !           414:        register Cmd *cp;
        !           415: {
        !           416:        register Posn p;
        !           417:        Range r, linesel;
        !           418:        Address a3, ad; /* SUN fix */
        !           419:        nest++;
        !           420:        r=addr.r;
        !           421:        a3.f=f;
        !           422:        a3.r.p1=a3.r.p2=r.p1;
        !           423:        for(p=r.p1; p<r.p2; p=a3.r.p2){
        !           424:                a3.r.p1=a3.r.p2;
        !           425: /*pjw          if(p!=r.p1 || (linesel=lineaddr((Posn)0, a3, 1)).r.p2==p)*/
        !           426:                if(p!=r.p1 || ((ad=lineaddr((Posn)0, a3, 1)), (linesel=ad.r), linesel.p2==p))
        !           427:                        ad=lineaddr((Posn)1, a3, 1), linesel=ad.r;
        !           428:                if(linesel.p1>=r.p2)
        !           429:                        break;
        !           430:                if(linesel.p2>=r.p2)
        !           431:                        linesel.p2=r.p2;
        !           432:                if(linesel.p2>linesel.p1)
        !           433:                        if(linesel.p1>=a3.r.p2 && linesel.p2>a3.r.p2){
        !           434:                                f->dot.r=linesel;
        !           435:                                cmdexec(f, cp->ccmd);
        !           436:                                a3.r=linesel;
        !           437:                                continue;
        !           438:                        }
        !           439:                break;
        !           440:        }
        !           441:        --nest;
        !           442: }
        !           443: filelooper(cp, XY)
        !           444:        register Cmd *cp;
        !           445: {
        !           446:        register File *f, *cur;
        !           447:        register i;
        !           448:        if(Glooping++)
        !           449:                error(EnestXY);
        !           450:        nest++;
        !           451:        settempfile();
        !           452:        cur=curfile;
        !           453:        for(i=0; i<tempfile.nused; i++){
        !           454:                f=tempfile.ptr[i];
        !           455:                if(f==cmd)
        !           456:                        continue;
        !           457:                if(cp->re==0 || filematch(f, cp->re)==XY)
        !           458:                        cmdexec(f, cp->ccmd);
        !           459:        }
        !           460:        if(cur && whichmenu(cur)>=0)    /* check that cur is still a file */
        !           461:                current(cur);
        !           462:        --Glooping;
        !           463:        --nest;
        !           464: }

unix.superglobalmegacorp.com

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