Annotation of researchv10no/cmd/sed/sed0.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include "sed.h"
                      3: 
                      4: struct label   *labtab = ltab;
                      5: char   CGMES[] = "sed: Command garbled: %s\n";
                      6: char   TMMES[] = "sed: Too much text: %s\n";
                      7: char   LTL[]   = "sed: Label too long: %s\n";
                      8: char   AD0MES[]        = "sed: No addresses allowed: %s\n";
                      9: char   AD1MES[]        = "sed: Only one address allowed: %s\n";
                     10: uchar  bittab[]  = {
                     11:                1,
                     12:                2,
                     13:                4,
                     14:                8,
                     15:                16,
                     16:                32,
                     17:                64,
                     18:                128
                     19:        };
                     20: 
                     21: main(argc, argv)
                     22: uchar  *argv[];
                     23: {
                     24: 
                     25:        eargc = argc;
                     26:        eargv = argv;
                     27: 
                     28:        badp = &bad;
                     29:        aptr = abuf;
                     30:        hspend = holdsp;
                     31:        lab = labtab + 1;       /* 0 reserved for end-pointer */
                     32:        rep = ptrspace;
                     33:        rep->r1.ad1 = respace;
                     34:        lbend = &linebuf[LBSIZE];
                     35:        hend = &holdsp[LBSIZE];
                     36:        lcomend = &genbuf[64];
                     37:        ptrend = &ptrspace[PTRSIZE];
                     38:        reend = &respace[RESIZE];
                     39:        labend = &labtab[LABSIZE];
                     40:        lnum = 0;
                     41:        pending = 0;
                     42:        depth = 0;
                     43:        spend = linebuf;
                     44:        hspend = holdsp;
                     45:        fcode[0] = stdout;
                     46:        nfiles = 1;
                     47:        lastre = NULL;
                     48: 
                     49:        if(eargc == 1)
                     50:                exit(0);
                     51: 
                     52: 
                     53:        while (--eargc > 0 && (++eargv)[0][0] == '-')
                     54:                switch (eargv[0][1]) {
                     55: 
                     56:                case 'n':
                     57:                        nflag++;
                     58:                        continue;
                     59: 
                     60:                case 'f':
                     61:                        if(eargc-- <= 0)        exit(2);
                     62: 
                     63:                        if((fin = fopen(*++eargv, "r")) == NULL) {
                     64:                                fprintf(stderr, "sed: Cannot open pattern-file: %s\n", *eargv);
                     65:                                exit(2);
                     66:                        }
                     67: 
                     68:                        fcomp();
                     69:                        fclose(fin);
                     70:                        continue;
                     71: 
                     72:                case 'e':
                     73:                        eflag++;
                     74:                        fcomp();
                     75:                        eflag = 0;
                     76:                        continue;
                     77: 
                     78:                case 'g':
                     79:                        gflag++;
                     80:                        continue;
                     81: 
                     82:                default:
                     83:                        fprintf(stderr, "sed: Unknown flag: %c\n", eargv[0][1]);
                     84:                        continue;
                     85:                }
                     86: 
                     87: 
                     88:        if(compfl == 0) {
                     89:                eargv--;
                     90:                eargc++;
                     91:                eflag++;
                     92:                fcomp();
                     93:                eargv++;
                     94:                eargc--;
                     95:                eflag = 0;
                     96:        }
                     97: 
                     98:        if(depth) {
                     99:                fprintf(stderr, "sed: Too many {'s\n");
                    100:                exit(2);
                    101:        }
                    102: 
                    103:        labtab->address = rep;
                    104: 
                    105:        dechain();
                    106: 
                    107: /*     abort();        /*DEBUG*/
                    108: 
                    109:        if(eargc <= 0)
                    110:                execute((uchar *)NULL);
                    111:        else while(--eargc >= 0) {
                    112:                execute(*eargv++);
                    113:        }
                    114:        fclose(stdout);
                    115:        exit(0);
                    116: }
                    117: fcomp()
                    118: {
                    119: 
                    120:        register uchar  *p, *op, *tp;
                    121:        uchar   *address();
                    122:        union reptr     *pt, *pt1;
                    123:        int     i;
                    124:        struct label    *lpt;
                    125: 
                    126:        compfl = 1;
                    127:        op = lastre;
                    128: 
                    129:        if(rline(linebuf) < 0) {
                    130:                lastre = op;
                    131:                return;
                    132:        }
                    133:        if(*linebuf == '#') {
                    134:                if(linebuf[1] == 'n')
                    135:                        nflag = 1;
                    136:        }
                    137:        else {
                    138:                cp = linebuf;
                    139:                goto comploop;
                    140:        }
                    141: 
                    142:        for(;;) {
                    143:                if(rline(linebuf) < 0)  break;
                    144: 
                    145:                cp = linebuf;
                    146: 
                    147: comploop:
                    148: /*     fprintf(stdout, "cp: %s\n", cp);        /*DEBUG*/
                    149:                while(*cp == ' ' || *cp == '\t')        cp++;
                    150:                if(*cp == '\0' || *cp == '#')           continue;
                    151:                if(*cp == ';') {
                    152:                        cp++;
                    153:                        goto comploop;
                    154:                }
                    155: 
                    156:                p = address(rep->r1.ad1);
                    157:                if(p == badp) {
                    158:                        fprintf(stderr, CGMES, linebuf);
                    159:                        exit(2);
                    160:                }
                    161: 
                    162:                if(p == 0) {
                    163:                        p = rep->r1.ad1;
                    164:                        rep->r1.ad1 = 0;
                    165:                } else {
                    166:                        if(p == rep->r1.ad1) {
                    167:                                if(op)
                    168:                                        rep->r1.ad1 = op;
                    169:                                else {
                    170:                                        fprintf(stderr, "sed: First RE may not be null\n");
                    171:                                        exit(2);
                    172:                                }
                    173:                        }
                    174:                        if(*rep->r1.ad1 != CLNUM && *rep->r1.ad1 != CEND)
                    175:                                op = rep->r1.ad1;
                    176:                        if(*cp == ',' || *cp == ';') {
                    177:                                cp++;
                    178:                                if((rep->r1.ad2 = p) > reend) {
                    179:                                        fprintf(stderr, TMMES, linebuf);
                    180:                                        exit(2);
                    181:                                }
                    182:                                p = address(rep->r1.ad2);
                    183:                                if(p == badp || p == 0) {
                    184:                                        fprintf(stderr, CGMES, linebuf);
                    185:                                        exit(2);
                    186:                                }
                    187:                                if(p == rep->r1.ad2)
                    188:                                        rep->r1.ad2 = op;
                    189:                                else{
                    190:                                if(*rep->r1.ad2 != CLNUM && *rep->r1.ad2 != CEND)
                    191:                                        op = rep->r1.ad2;
                    192:                                }
                    193: 
                    194:                        } else
                    195:                                rep->r1.ad2 = 0;
                    196:                }
                    197: 
                    198:                if(p > reend) {
                    199:                        fprintf(stderr, "sed: Too much text: %s\n", linebuf);
                    200:                        exit(2);
                    201:                }
                    202: 
                    203:                while(*cp == ' ' || *cp == '\t')        cp++;
                    204: 
                    205: swit:
                    206:                switch(*cp++) {
                    207: 
                    208:                        default:
                    209: /*fprintf(stderr, "cp = %d; *cp = %o\n", cp - linebuf, *cp);*/
                    210:                                fprintf(stderr, "sed: Unrecognized command: %s\n", linebuf);
                    211:                                exit(2);
                    212: 
                    213:                        case '!':
                    214:                                rep->r1.negfl = 1;
                    215:                                goto swit;
                    216: 
                    217:                        case '{':
                    218:                                rep->r1.command = BCOM;
                    219:                                rep->r1.negfl = !(rep->r1.negfl);
                    220:                                cmpend[depth++] = &rep->r2.lb1;
                    221:                                if(++rep >= ptrend) {
                    222:                                        fprintf(stderr, "sed: Too many commands: %s\n", linebuf);
                    223:                                        exit(2);
                    224:                                }
                    225:                                rep->r1.ad1 = p;
                    226:                                if(*cp == '\0') continue;
                    227: 
                    228:                                goto comploop;
                    229: 
                    230:                        case '}':
                    231:                                if(rep->r1.ad1) {
                    232:                                        fprintf(stderr, AD0MES, linebuf);
                    233:                                        exit(2);
                    234:                                }
                    235: 
                    236:                                if(--depth < 0) {
                    237:                                        fprintf(stderr, "sed: Too many }'s\n");
                    238:                                        exit(2);
                    239:                                }
                    240:                                *cmpend[depth] = rep;
                    241: 
                    242:                                rep->r1.ad1 = p;
                    243:                                if(*cp == 0)    continue;
                    244:                                goto comploop;
                    245: 
                    246:                        case '=':
                    247:                                rep->r1.command = EQCOM;
                    248:                                if(rep->r1.ad2) {
                    249:                                        fprintf(stderr, AD1MES, linebuf);
                    250:                                        exit(2);
                    251:                                }
                    252:                                break;
                    253: 
                    254:                        case ':':
                    255:                                if(rep->r1.ad1) {
                    256:                                        fprintf(stderr, AD0MES, linebuf);
                    257:                                        exit(2);
                    258:                                }
                    259: 
                    260:                                while(*cp++ == ' ');
                    261:                                cp--;
                    262: 
                    263: 
                    264:                                tp = lab->asc;
                    265:                                while((*tp = *cp++) && *tp != ';')
                    266:                                        if(++tp >= &(lab->asc[8])) {
                    267:                                                fprintf(stderr, LTL, linebuf);
                    268:                                                exit(2);
                    269:                                        }
                    270:                                *tp = '\0';
                    271:                                if(*lab->asc == 0) {
                    272:                                        fprintf(stderr, CGMES, linebuf);
                    273:                                        exit(2);
                    274:                                }
                    275: 
                    276:                                if(lpt = search(lab)) {
                    277:                                        if(lpt->address) {
                    278:                                                fprintf(stderr, "sed: Duplicate labels: %s\n", linebuf);
                    279:                                                exit(2);
                    280:                                        }
                    281:                                } else {
                    282:                                        lab->chain = 0;
                    283:                                        lpt = lab;
                    284:                                        if(++lab >= labend) {
                    285:                                                fprintf(stderr, "sed: Too many labels: %s\n", linebuf);
                    286:                                                exit(2);
                    287:                                        }
                    288:                                }
                    289:                                lpt->address = rep;
                    290:                                rep->r1.ad1 = p;
                    291: 
                    292:                                continue;
                    293: 
                    294:                        case 'a':
                    295:                                rep->r1.command = ACOM;
                    296:                                if(rep->r1.ad2) {
                    297:                                        fprintf(stderr, AD1MES, linebuf);
                    298:                                        exit(2);
                    299:                                }
                    300:                                if(*cp == '\\') cp++;
                    301:                                if(*cp++ != '\n') {
                    302:                                        fprintf(stderr, CGMES, linebuf);
                    303:                                        exit(2);
                    304:                                }
                    305:                                rep->r1.re1 = p;
                    306:                                p = text(rep->r1.re1);
                    307:                                break;
                    308:                        case 'c':
                    309:                                rep->r1.command = CCOM;
                    310:                                if(*cp == '\\') cp++;
                    311:                                if(*cp++ != ('\n')) {
                    312:                                        fprintf(stderr, CGMES, linebuf);
                    313:                                        exit(2);
                    314:                                }
                    315:                                rep->r1.re1 = p;
                    316:                                p = text(rep->r1.re1);
                    317:                                break;
                    318:                        case 'i':
                    319:                                rep->r1.command = ICOM;
                    320:                                if(rep->r1.ad2) {
                    321:                                        fprintf(stderr, AD1MES, linebuf);
                    322:                                        exit(2);
                    323:                                }
                    324:                                if(*cp == '\\') cp++;
                    325:                                if(*cp++ != ('\n')) {
                    326:                                        fprintf(stderr, CGMES, linebuf);
                    327:                                        exit(2);
                    328:                                }
                    329:                                rep->r1.re1 = p;
                    330:                                p = text(rep->r1.re1);
                    331:                                break;
                    332: 
                    333:                        case 'g':
                    334:                                rep->r1.command = GCOM;
                    335:                                break;
                    336: 
                    337:                        case 'G':
                    338:                                rep->r1.command = CGCOM;
                    339:                                break;
                    340: 
                    341:                        case 'h':
                    342:                                rep->r1.command = HCOM;
                    343:                                break;
                    344: 
                    345:                        case 'H':
                    346:                                rep->r1.command = CHCOM;
                    347:                                break;
                    348: 
                    349:                        case 't':
                    350:                                rep->r1.command = TCOM;
                    351:                                goto jtcommon;
                    352: 
                    353:                        case 'b':
                    354:                                rep->r1.command = BCOM;
                    355: jtcommon:
                    356:                                while(*cp++ == ' ');
                    357:                                cp--;
                    358: 
                    359:                                if(*cp == '\0') {
                    360:                                        if(pt = labtab->chain) {
                    361:                                                while(pt1 = pt->r2.lb1)
                    362:                                                        pt = pt1;
                    363:                                                pt->r2.lb1 = rep;
                    364:                                        } else
                    365:                                                labtab->chain = rep;
                    366:                                        break;
                    367:                                }
                    368:                                tp = lab->asc;
                    369:                                while((*tp = *cp++) && *tp != ';')
                    370:                                        if(++tp >= &(lab->asc[8])) {
                    371:                                                fprintf(stderr, LTL, linebuf);
                    372:                                                exit(2);
                    373:                                        }
                    374:                                cp--;
                    375:                                *tp = '\0';
                    376:                                if(*lab->asc == 0) {
                    377:                                        fprintf(stderr, CGMES, linebuf);
                    378:                                        exit(2);
                    379:                                }
                    380: 
                    381:                                if(lpt = search(lab)) {
                    382:                                        if(lpt->address) {
                    383:                                                rep->r2.lb1 = lpt->address;
                    384:                                        } else {
                    385:                                                pt = lpt->chain;
                    386:                                                while(pt1 = pt->r2.lb1)
                    387:                                                        pt = pt1;
                    388:                                                pt->r2.lb1 = rep;
                    389:                                        }
                    390:                                } else {
                    391:                                        lab->chain = rep;
                    392:                                        lab->address = 0;
                    393:                                        if(++lab >= labend) {
                    394:                                                fprintf(stderr, "sed: Too many labels: %s\n", linebuf);
                    395:                                                exit(2);
                    396:                                        }
                    397:                                }
                    398:                                break;
                    399: 
                    400:                        case 'n':
                    401:                                rep->r1.command = NCOM;
                    402:                                break;
                    403: 
                    404:                        case 'N':
                    405:                                rep->r1.command = CNCOM;
                    406:                                break;
                    407: 
                    408:                        case 'p':
                    409:                                rep->r1.command = PCOM;
                    410:                                break;
                    411: 
                    412:                        case 'P':
                    413:                                rep->r1.command = CPCOM;
                    414:                                break;
                    415: 
                    416:                        case 'r':
                    417:                                rep->r1.command = RCOM;
                    418:                                if(rep->r1.ad2) {
                    419:                                        fprintf(stderr, AD1MES, linebuf);
                    420:                                        exit(2);
                    421:                                }
                    422:                                if(*cp++ != ' ') {
                    423:                                        fprintf(stderr, CGMES, linebuf);
                    424:                                        exit(2);
                    425:                                }
                    426:                                rep->r1.re1 = p;
                    427:                                p = text(rep->r1.re1);
                    428:                                break;
                    429: 
                    430:                        case 'd':
                    431:                                rep->r1.command = DCOM;
                    432:                                break;
                    433: 
                    434:                        case 'D':
                    435:                                rep->r1.command = CDCOM;
                    436:                                rep->r2.lb1 = ptrspace;
                    437:                                break;
                    438: 
                    439:                        case 'q':
                    440:                                rep->r1.command = QCOM;
                    441:                                if(rep->r1.ad2) {
                    442:                                        fprintf(stderr, AD1MES, linebuf);
                    443:                                        exit(2);
                    444:                                }
                    445:                                break;
                    446: 
                    447:                        case 'l':
                    448:                                rep->r1.command = LCOM;
                    449:                                break;
                    450: 
                    451:                        case 's':
                    452:                                rep->r1.command = SCOM;
                    453:                                seof = *cp++;
                    454:                                rep->r1.re1 = p;
                    455:                                p = compile(rep->r1.re1);
                    456:                                if(p == badp) {
                    457:                                        fprintf(stderr, CGMES, linebuf);
                    458:                                        exit(2);
                    459:                                }
                    460:                                if(p == rep->r1.re1) {
                    461:                                        if(op == NULL) {
                    462:                                                fprintf(stderr, "sed: First RE may not be null.\n");
                    463:                                                exit(2);
                    464:                                        }
                    465:                                        rep->r1.re1 = op;
                    466:                                } else {
                    467:                                        op = rep->r1.re1;
                    468:                                }
                    469: 
                    470:                                if((rep->r1.rhs = p) > reend) {
                    471:                                        fprintf(stderr, TMMES, linebuf);
                    472:                                        exit(2);
                    473:                                }
                    474: 
                    475:                                if((p = compsub(rep->r1.rhs)) == badp) {
                    476:                                        fprintf(stderr, CGMES, linebuf);
                    477:                                        exit(2);
                    478:                                }
                    479:                                if(*cp == 'g') {
                    480:                                        cp++;
                    481:                                        rep->r1.gfl++;
                    482:                                } else if(gflag)
                    483:                                        rep->r1.gfl++;
                    484: 
                    485:                                if(*cp == 'p') {
                    486:                                        cp++;
                    487:                                        rep->r1.pfl = 1;
                    488:                                }
                    489: 
                    490:                                if(*cp == 'P') {
                    491:                                        cp++;
                    492:                                        rep->r1.pfl = 2;
                    493:                                }
                    494: 
                    495:                                if(*cp == 'w') {
                    496:                                        cp++;
                    497:                                        if(*cp++ !=  ' ') {
                    498:                                                fprintf(stderr, CGMES, linebuf);
                    499:                                                exit(2);
                    500:                                        }
                    501:                                        if(nfiles >= MAXFILES) {
                    502:                                                fprintf(stderr, "sed: Too many files in w commands 1 \n");
                    503:                                                exit(2);
                    504:                                        }
                    505: 
                    506:                                        text(fname[nfiles]);
                    507:                                        for(i = nfiles - 1; i >= 0; i--)
                    508:                                                if(cmp(fname[nfiles],fname[i]) == 0) {
                    509:                                                        rep->r1.fcode = fcode[i];
                    510:                                                        goto done;
                    511:                                                }
                    512:                                        if((rep->r1.fcode = fopen(fname[nfiles], "w")) == NULL) {
                    513:                                                fprintf(stderr, "sed: Cannot open %s\n", fname[nfiles]);
                    514:                                                exit(2);
                    515:                                        }
                    516:                                        fcode[nfiles++] = rep->r1.fcode;
                    517:                                }
                    518:                                break;
                    519: 
                    520:                        case 'w':
                    521:                                rep->r1.command = WCOM;
                    522:                                if(*cp++ != ' ') {
                    523:                                        fprintf(stderr, CGMES, linebuf);
                    524:                                        exit(2);
                    525:                                }
                    526:                                if(nfiles >= MAXFILES){
                    527:                                        fprintf(stderr, "sed: Too many files in w commands 2 \n");
                    528:                                        fprintf(stderr, "nfiles = %d; MAXF = %d\n", nfiles, MAXFILES);
                    529:                                        exit(2);
                    530:                                }
                    531: 
                    532:                                text(fname[nfiles]);
                    533:                                for(i = nfiles - 1; i >= 0; i--)
                    534:                                        if(cmp(fname[nfiles], fname[i]) == 0) {
                    535:                                                rep->r1.fcode = fcode[i];
                    536:                                                goto done;
                    537:                                        }
                    538: 
                    539:                                if((rep->r1.fcode = fopen(fname[nfiles], "w")) == NULL) {
                    540:                                        fprintf(stderr, "sed: Cannot create %s\n", fname[nfiles]);
                    541:                                        exit(2);
                    542:                                }
                    543:                                fcode[nfiles++] = rep->r1.fcode;
                    544:                                break;
                    545: 
                    546:                        case 'x':
                    547:                                rep->r1.command = XCOM;
                    548:                                break;
                    549: 
                    550:                        case 'y':
                    551:                                rep->r1.command = YCOM;
                    552:                                seof = *cp++;
                    553:                                rep->r1.re1 = p;
                    554:                                p = ycomp(rep->r1.re1);
                    555:                                if(p == badp) {
                    556:                                        fprintf(stderr, CGMES, linebuf);
                    557:                                        exit(2);
                    558:                                }
                    559:                                if(p > reend) {
                    560:                                        fprintf(stderr, TMMES, linebuf);
                    561:                                        exit(2);
                    562:                                }
                    563:                                break;
                    564: 
                    565:                }
                    566: done:
                    567:                if(++rep >= ptrend) {
                    568:                        fprintf(stderr, "sed: Too many commands, last: %s\n", linebuf);
                    569:                        exit(2);
                    570:                }
                    571: 
                    572:                rep->r1.ad1 = p;
                    573: 
                    574:                if(*cp++ != '\0') {
                    575:                        if(cp[-1] == ';')
                    576:                                goto comploop;
                    577:                        fprintf(stderr, CGMES, linebuf);
                    578:                        exit(2);
                    579:                }
                    580: 
                    581:        }
                    582: }
                    583: 
                    584: uchar  *
                    585: compsub(rhsbuf)
                    586: uchar  *rhsbuf;
                    587: {
                    588:        register uchar  *p, *q, *r;
                    589:        p = rhsbuf;
                    590:        q = cp;
                    591:        for(;;) {
                    592:                if((*p = *q++) == '\\') {
                    593:                        *++p = *q++;
                    594:                        if(*p >= '1' && *p <= '9' && *p > numbra + '0')
                    595:                                return(badp);
                    596:                        if(*p == 'n')
                    597:                                *--p = '\n';
                    598:                } else if(*p == seof) {
                    599:                        *p++ = '\0';
                    600:                        cp = q;
                    601:                        return(p);
                    602:                }
                    603:                if(*p++ == '\0') {
                    604:                        return(badp);
                    605:                }
                    606: 
                    607:        }
                    608: }
                    609: 
                    610: uchar *
                    611: compile(expbuf)
                    612: uchar  *expbuf;
                    613: {
                    614:        register c;
                    615:        register uchar *ep, *sp;
                    616:        uchar   neg;
                    617:        uchar *lastep, *cstart;
                    618:        int cclcnt;
                    619:        int     closed;
                    620:        uchar   bracket[NBRA], *bracketp;
                    621: 
                    622:        if(*cp == seof) {
                    623:                cp++;
                    624:                return(expbuf);
                    625:        }
                    626: 
                    627:        ep = expbuf;
                    628:        lastep = 0;
                    629:        bracketp = bracket;
                    630:        closed = numbra = 0;
                    631:        sp = cp;
                    632:        if (*sp == '^') {
                    633:                *ep++ = 1;
                    634:                sp++;
                    635:        } else {
                    636:                *ep++ = 0;
                    637:        }
                    638:        for (;;) {
                    639:                if (ep >= reend) {
                    640:                        cp = sp;
                    641:                        return(badp);
                    642:                }
                    643:                if((c = *sp++) == seof) {
                    644:                        if(bracketp != bracket) {
                    645:                                cp = sp;
                    646:                                return(badp);
                    647:                        }
                    648:                        cp = sp;
                    649:                        *ep++ = CEOF;
                    650:                        return(ep);
                    651:                }
                    652:                if(c != '*')
                    653:                        lastep = ep;
                    654:                switch (c) {
                    655: 
                    656:                case '\\':
                    657:                        if((c = *sp++) == '(') {
                    658:                                if(numbra >= NBRA) {
                    659:                                        cp = sp;
                    660:                                        return(badp);
                    661:                                }
                    662:                                *bracketp++ = numbra;
                    663:                                *ep++ = CBRA;
                    664:                                *ep++ = numbra++;
                    665:                                continue;
                    666:                        }
                    667:                        if(c == ')') {
                    668:                                if(bracketp <= bracket) {
                    669:                                        cp = sp;
                    670:                                        return(badp);
                    671:                                }
                    672:                                *ep++ = CKET;
                    673:                                *ep++ = *--bracketp;
                    674:                                closed++;
                    675:                                continue;
                    676:                        }
                    677: 
                    678:                        if(c >= '1' && c <= '9') {
                    679:                                if((c -= '1') >= closed)
                    680:                                        return(badp);
                    681:        
                    682:                                *ep++ = CBACK;
                    683:                                *ep++ = c;
                    684:                                continue;
                    685:                        }
                    686:                        if(c == '\n') {
                    687:                                cp = sp;
                    688:                                return(badp);
                    689:                        }
                    690:                        if(c == 'n') {
                    691:                                c = '\n';
                    692:                        }
                    693:                        goto defchar;
                    694: 
                    695:                case '\0':
                    696:                case '\n':
                    697:                        cp = sp;
                    698:                        return(badp);
                    699: 
                    700:                case '.':
                    701:                        *ep++ = CDOT;
                    702:                        continue;
                    703: 
                    704:                case '*':
                    705:                        if (lastep == 0)
                    706:                                goto defchar;
                    707:                        if(*lastep == CKET) {
                    708:                                cp = sp;
                    709:                                return(badp);
                    710:                        }
                    711:                        *lastep |= STAR;
                    712:                        continue;
                    713: 
                    714:                case '$':
                    715:                        if (*sp != seof)
                    716:                                goto defchar;
                    717:                        *ep++ = CDOL;
                    718:                        continue;
                    719: 
                    720:                case '[':
                    721:                        if(&ep[33] >= reend) {
                    722:                                fprintf(stderr, "sed: RE too long: %s\n", linebuf);
                    723:                                exit(2);
                    724:                        }
                    725: 
                    726:                        *ep++ = CCL;
                    727: 
                    728:                        neg = 0;
                    729:                        if((c = *sp++) == '^') {
                    730:                                neg = 1;
                    731:                                c = *sp++;
                    732:                        }
                    733: 
                    734:                        cstart = sp;
                    735:                        do {
                    736:                                if(c == '\0') {
                    737:                                        fprintf(stderr, CGMES, linebuf);
                    738:                                        exit(2);
                    739:                                }
                    740:                                if (c=='-' && sp>cstart && *sp!=']') {
                    741:                                        for (c = sp[-2]; c<*sp; c++)
                    742:                                                ep[c>>3] |= bittab[c&07];
                    743:                                }
                    744:                                if(c == '\\') {
                    745:                                        switch(c = *sp++) {
                    746:                                                case 'n':
                    747:                                                        c = '\n';
                    748:                                                        break;
                    749:                                        }
                    750:                                }
                    751: 
                    752:                                ep[c >> 3] |= bittab[c & 07];
                    753:                        } while((c = *sp++) != ']');
                    754: 
                    755:                        if(neg)
                    756:                                for(cclcnt = 0; cclcnt < 32; cclcnt++)
                    757:                                        ep[cclcnt] ^= -1;
                    758:                        ep[0] &= 0376;
                    759: 
                    760:                        ep += 32;
                    761: 
                    762:                        continue;
                    763: 
                    764:                defchar:
                    765:                default:
                    766:                        *ep++ = CCHR;
                    767:                        *ep++ = c;
                    768:                }
                    769:        }
                    770: }
                    771: rline(lbuf)
                    772: uchar  *lbuf;
                    773: {
                    774:        register uchar  *p, *q;
                    775:        register        t;
                    776:        static uchar    *saveq;
                    777: 
                    778:        p = lbuf - 1;
                    779: 
                    780:        if(eflag) {
                    781:                if(eflag > 0) {
                    782:                        eflag = -1;
                    783:                        if(eargc-- <= 0)
                    784:                                exit(2);
                    785:                        q = *++eargv;
                    786:                        while(*++p = *q++) {
                    787:                                if(*p == '\\') {
                    788:                                        if((*++p = *q++) == '\0') {
                    789:                                                saveq = 0;
                    790:                                                return(-1);
                    791:                                        } else
                    792:                                                continue;
                    793:                                }
                    794:                                if(*p == '\n') {
                    795:                                        *p = '\0';
                    796:                                        saveq = q;
                    797:                                        return(1);
                    798:                                }
                    799:                        }
                    800:                        saveq = 0;
                    801:                        return(1);
                    802:                }
                    803:                if((q = saveq) == 0)    return(-1);
                    804: 
                    805:                while(*++p = *q++) {
                    806:                        if(*p == '\\') {
                    807:                                if((*++p = *q++) == '0') {
                    808:                                        saveq = 0;
                    809:                                        return(-1);
                    810:                                } else
                    811:                                        continue;
                    812:                        }
                    813:                        if(*p == '\n') {
                    814:                                *p = '\0';
                    815:                                saveq = q;
                    816:                                return(1);
                    817:                        }
                    818:                }
                    819:                saveq = 0;
                    820:                return(1);
                    821:        }
                    822: 
                    823:        while((t = getc(fin)) != EOF) {
                    824:                *++p = t;
                    825:                if(*p == '\\') {
                    826:                        t = getc(fin);
                    827:                        *++p = t;
                    828:                }
                    829:                else if(*p == '\n') {
                    830:                        *p = '\0';
                    831:                        return(1);
                    832:                }
                    833:        }
                    834:        *++p = '\0';
                    835:        return(-1);
                    836: }
                    837: 
                    838: uchar  *address(expbuf)
                    839: uchar  *expbuf;
                    840: {
                    841:        register uchar  *rcp;
                    842:        long    lno;
                    843: 
                    844:        if(*cp == '$') {
                    845:                cp++;
                    846:                *expbuf++ = CEND;
                    847:                *expbuf++ = CEOF;
                    848:                return(expbuf);
                    849:        }
                    850: 
                    851:        if(*cp == '/') {
                    852:                seof = '/';
                    853:                cp++;
                    854:                return(compile(expbuf));
                    855:        }
                    856: 
                    857:        rcp = cp;
                    858:        lno = 0;
                    859: 
                    860:        while(*rcp >= '0' && *rcp <= '9')
                    861:                lno = lno*10 + *rcp++ - '0';
                    862: 
                    863:        if(rcp > cp) {
                    864:                if(!lno){
                    865:                        fprintf(stderr, "sed: line number 0 is illegal\n");
                    866:                        exit(2);
                    867:                }
                    868:                *expbuf++ = CLNUM;
                    869:                *expbuf++ = lno;
                    870:                *expbuf++ = lno >> 8;
                    871:                *expbuf++ = lno >> 16;
                    872:                *expbuf++ = lno >> 24;
                    873:                *expbuf++ = CEOF;
                    874:                cp = rcp;
                    875:                return(expbuf);
                    876:        }
                    877:        return(0);
                    878: }
                    879: cmp(a, b)
                    880: uchar  *a,*b;
                    881: {
                    882:        register uchar  *ra, *rb;
                    883: 
                    884:        ra = a - 1;
                    885:        rb = b - 1;
                    886: 
                    887:        while(*++ra == *++rb)
                    888:                if(*ra == '\0') return(0);
                    889:        return(1);
                    890: }
                    891: 
                    892: uchar  *text(textbuf)
                    893: uchar  *textbuf;
                    894: {
                    895:        register uchar  *p, *q;
                    896: 
                    897:        p = textbuf;
                    898:        q = cp;
                    899:        while(*q == '\t' || *q == ' ')  q++;
                    900:        for(;;) {
                    901: 
                    902:                if((*p = *q++) == '\\')
                    903:                        *p = *q++;
                    904:                if(*p == '\0') {
                    905:                        cp = --q;
                    906:                        return(++p);
                    907:                }
                    908:                if(*p == '\n') {
                    909:                        while(*q == '\t' || *q == ' ')  q++;
                    910:                }
                    911:                p++;
                    912:        }
                    913: }
                    914: 
                    915: 
                    916: struct label   *search(ptr)
                    917: struct label   *ptr;
                    918: {
                    919:        struct label    *rp;
                    920: 
                    921:        rp = labtab;
                    922:        while(rp < ptr) {
                    923:                if(cmp(rp->asc, ptr->asc) == 0)
                    924:                        return(rp);
                    925:                rp++;
                    926:        }
                    927: 
                    928:        return(0);
                    929: }
                    930: 
                    931: 
                    932: dechain()
                    933: {
                    934:        struct label    *lptr;
                    935:        union reptr     *rptr, *trptr;
                    936: 
                    937:        for(lptr = labtab; lptr < lab; lptr++) {
                    938: 
                    939:                if(lptr->address == 0) {
                    940:                        fprintf(stderr, "sed: Undefined label: %s\n", lptr->asc);
                    941:                        exit(2);
                    942:                }
                    943: 
                    944:                if(lptr->chain) {
                    945:                        rptr = lptr->chain;
                    946:                        while(trptr = rptr->r2.lb1) {
                    947:                                rptr->r2.lb1 = lptr->address;
                    948:                                rptr = trptr;
                    949:                        }
                    950:                        rptr->r2.lb1 = lptr->address;
                    951:                }
                    952:        }
                    953: }
                    954: 
                    955: uchar *ycomp(expbuf)
                    956: uchar  *expbuf;
                    957: {
                    958:        register uchar *ep, *tsp;
                    959:        register c;
                    960:        uchar   *sp;
                    961: 
                    962:        ep = expbuf;
                    963:        sp = cp;
                    964:        for(tsp = cp; *tsp != seof; tsp++) {
                    965:                if(*tsp == '\\')
                    966:                        tsp++;
                    967:                if(*tsp == '\n' || *tsp == '\0')
                    968:                        return(badp);
                    969:        }
                    970:        tsp++;
                    971: 
                    972:        while((c = *sp++) != seof) {
                    973:                if(c == '\\' && *sp == 'n') {
                    974:                        sp++;
                    975:                        c = '\n';
                    976:                }
                    977:                if((ep[c] = *tsp++) == '\\' && *tsp == 'n') {
                    978:                        ep[c] = '\n';
                    979:                        tsp++;
                    980:                }
                    981:                if(ep[c] == seof || ep[c] == '\0')
                    982:                        return(badp);
                    983:        }
                    984:        if(*tsp != seof)
                    985:                return(badp);
                    986:        cp = ++tsp;
                    987: 
                    988:        for(c = 0; c<0400; c++)
                    989:                if(ep[c] == 0)
                    990:                        ep[c] = c;
                    991: 
                    992:        return(ep + 0400);
                    993: }
                    994: 

unix.superglobalmegacorp.com

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