|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "sed.h" ! 3: ! 4: char *trans[040] = { ! 5: "\\00", ! 6: "\\01", ! 7: "\\02", ! 8: "\\03", ! 9: "\\04", ! 10: "\\05", ! 11: "\\06", ! 12: "\\07", ! 13: "<\\b", ! 14: ">\\t", ! 15: "\\n", ! 16: "\\13", ! 17: "\\14", ! 18: "\\r", ! 19: "\\16", ! 20: "\\17", ! 21: "\\20", ! 22: "\\21", ! 23: "\\22", ! 24: "\\23", ! 25: "\\24", ! 26: "\\25", ! 27: "\\26", ! 28: "\\27", ! 29: "\\30", ! 30: "\\31", ! 31: "\\32", ! 32: "\\33", ! 33: "\\34", ! 34: "\\35", ! 35: "\\36", ! 36: "\\37" ! 37: }; ! 38: char rub[] = {"\\177"}; ! 39: ! 40: execute(file) ! 41: char *file; ! 42: { ! 43: register char *p1, *p2; ! 44: register union reptr *ipc; ! 45: int c; ! 46: long l; ! 47: char *execp; ! 48: ! 49: if (file) { ! 50: if ((f = open(file, 0)) < 0) { ! 51: fprintf(stderr, "sed: Can't open %s\n", file); ! 52: } ! 53: } else ! 54: f = 0; ! 55: ! 56: ebp = ibuf; ! 57: cbp = ibuf; ! 58: ! 59: if(pending) { ! 60: ipc = pending; ! 61: pending = 0; ! 62: goto yes; ! 63: } ! 64: ! 65: for(;;) { ! 66: if((execp = gline(linebuf)) == badp) { ! 67: close(f); ! 68: return; ! 69: } ! 70: spend = execp; ! 71: ! 72: for(ipc = ptrspace; ipc->r1.command; ) { ! 73: ! 74: p1 = ipc->r1.ad1; ! 75: p2 = ipc->r1.ad2; ! 76: ! 77: if(p1) { ! 78: ! 79: if(ipc->r1.inar) { ! 80: if(*p2 == CEND) { ! 81: p1 = 0; ! 82: } else if(*p2 == CLNUM) { ! 83: l = p2[1]&0377 ! 84: | ((p2[2]&0377)<<8) ! 85: | ((p2[3]&0377)<<16) ! 86: | ((p2[4]&0377)<<24); ! 87: if(lnum > l) { ! 88: ipc->r1.inar = 0; ! 89: if(ipc->r1.negfl) ! 90: goto yes; ! 91: ipc++; ! 92: continue; ! 93: } ! 94: if(lnum == l) { ! 95: ipc->r1.inar = 0; ! 96: } ! 97: } else if(match(p2, 0)) { ! 98: ipc->r1.inar = 0; ! 99: } ! 100: } else if(*p1 == CEND) { ! 101: if(!dolflag) { ! 102: if(ipc->r1.negfl) ! 103: goto yes; ! 104: ipc++; ! 105: continue; ! 106: } ! 107: ! 108: } else if(*p1 == CLNUM) { ! 109: l = p1[1]&0377 ! 110: | ((p1[2]&0377)<<8) ! 111: | ((p1[3]&0377)<<16) ! 112: | ((p1[4]&0377)<<24); ! 113: if(lnum != l) { ! 114: if(ipc->r1.negfl) ! 115: goto yes; ! 116: ipc++; ! 117: continue; ! 118: } ! 119: if(p2) ! 120: ipc->r1.inar = 1; ! 121: } else if(match(p1, 0)) { ! 122: if(p2) ! 123: ipc->r1.inar = 1; ! 124: } else { ! 125: if(ipc->r1.negfl) ! 126: goto yes; ! 127: ipc++; ! 128: continue; ! 129: } ! 130: } ! 131: ! 132: if(ipc->r1.negfl) { ! 133: ipc++; ! 134: continue; ! 135: } ! 136: yes: ! 137: command(ipc); ! 138: ! 139: if(delflag) ! 140: break; ! 141: ! 142: if(jflag) { ! 143: jflag = 0; ! 144: if((ipc = ipc->r2.lb1) == 0) { ! 145: ipc = ptrspace; ! 146: break; ! 147: } ! 148: } else ! 149: ipc++; ! 150: ! 151: } ! 152: if(!nflag && !delflag) { ! 153: for(p1 = linebuf; p1 < spend; p1++) ! 154: putc(*p1, stdout); ! 155: putc('\n', stdout); ! 156: } ! 157: ! 158: if(aptr > abuf) { ! 159: arout(); ! 160: } ! 161: ! 162: delflag = 0; ! 163: ! 164: } ! 165: } ! 166: match(expbuf, gf) ! 167: char *expbuf; ! 168: { ! 169: register char *p1, *p2, c; ! 170: ! 171: if(gf) { ! 172: if(*expbuf) return(0); ! 173: p1 = linebuf; ! 174: p2 = genbuf; ! 175: while(*p1++ = *p2++); ! 176: locs = p1 = loc2; ! 177: } else { ! 178: p1 = linebuf; ! 179: locs = 0; ! 180: } ! 181: ! 182: p2 = expbuf; ! 183: if(*p2++) { ! 184: loc1 = p1; ! 185: if(*p2 == CCHR && p2[1] != *p1) ! 186: return(0); ! 187: return(advance(p1, p2)); ! 188: } ! 189: ! 190: /* fast check for first character */ ! 191: ! 192: if(*p2 == CCHR) { ! 193: c = p2[1]; ! 194: do { ! 195: if(*p1 != c) ! 196: continue; ! 197: if(advance(p1, p2)) { ! 198: loc1 = p1; ! 199: return(1); ! 200: } ! 201: } while(*p1++); ! 202: return(0); ! 203: } ! 204: ! 205: do { ! 206: if(advance(p1, p2)) { ! 207: loc1 = p1; ! 208: return(1); ! 209: } ! 210: } while(*p1++); ! 211: return(0); ! 212: } ! 213: advance(alp, aep) ! 214: char *alp, *aep; ! 215: { ! 216: register char *lp, *ep, *curlp; ! 217: char c; ! 218: char *bbeg; ! 219: int ct; ! 220: ! 221: /*fprintf(stderr, "*lp = %c, %o\n*ep = %c, %o\n", *lp, *lp, *ep, *ep); /*DEBUG*/ ! 222: ! 223: lp = alp; ! 224: ep = aep; ! 225: for (;;) switch (*ep++) { ! 226: ! 227: case CCHR: ! 228: if (*ep++ == *lp++) ! 229: continue; ! 230: return(0); ! 231: ! 232: case CDOT: ! 233: if (*lp++) ! 234: continue; ! 235: return(0); ! 236: ! 237: case CNL: ! 238: case CDOL: ! 239: if (*lp == 0) ! 240: continue; ! 241: return(0); ! 242: ! 243: case CEOF: ! 244: loc2 = lp; ! 245: return(1); ! 246: ! 247: case CCL: ! 248: c = *lp++ & 0177; ! 249: if(ep[c>>3] & bittab[c & 07]) { ! 250: ep += 16; ! 251: continue; ! 252: } ! 253: return(0); ! 254: ! 255: case CBRA: ! 256: braslist[*ep++] = lp; ! 257: continue; ! 258: ! 259: case CKET: ! 260: braelist[*ep++] = lp; ! 261: continue; ! 262: ! 263: case CBACK: ! 264: bbeg = braslist[*ep]; ! 265: ct = braelist[*ep++] - bbeg; ! 266: ! 267: if(ecmp(bbeg, lp, ct)) { ! 268: lp += ct; ! 269: continue; ! 270: } ! 271: return(0); ! 272: ! 273: case CBACK|STAR: ! 274: bbeg = braslist[*ep]; ! 275: ct = braelist[*ep++] - bbeg; ! 276: curlp = lp; ! 277: while(ecmp(bbeg, lp, ct)) ! 278: lp += ct; ! 279: ! 280: while(lp >= curlp) { ! 281: if(advance(lp, ep)) return(1); ! 282: lp -= ct; ! 283: } ! 284: return(0); ! 285: ! 286: ! 287: case CDOT|STAR: ! 288: curlp = lp; ! 289: while (*lp++); ! 290: goto star; ! 291: ! 292: case CCHR|STAR: ! 293: curlp = lp; ! 294: while (*lp++ == *ep); ! 295: ep++; ! 296: goto star; ! 297: ! 298: case CCL|STAR: ! 299: curlp = lp; ! 300: do { ! 301: c = *lp++ & 0177; ! 302: } while(ep[c>>3] & bittab[c & 07]); ! 303: ep += 16; ! 304: goto star; ! 305: ! 306: star: ! 307: if(--lp == curlp) { ! 308: continue; ! 309: } ! 310: ! 311: if(*ep == CCHR) { ! 312: c = ep[1]; ! 313: do { ! 314: if(*lp != c) ! 315: continue; ! 316: if(advance(lp, ep)) ! 317: return(1); ! 318: } while(lp-- > curlp); ! 319: return(0); ! 320: } ! 321: ! 322: if(*ep == CBACK) { ! 323: c = *(braslist[ep[1]]); ! 324: do { ! 325: if(*lp != c) ! 326: continue; ! 327: if(advance(lp, ep)) ! 328: return(1); ! 329: } while(lp-- > curlp); ! 330: return(0); ! 331: } ! 332: ! 333: do { ! 334: if(lp == locs) break; ! 335: if (advance(lp, ep)) ! 336: return(1); ! 337: } while (lp-- > curlp); ! 338: return(0); ! 339: ! 340: default: ! 341: fprintf(stderr, "sed: RE botch, %o\n", *--ep); ! 342: exit(1); ! 343: } ! 344: } ! 345: substitute(ipc) ! 346: union reptr *ipc; ! 347: { ! 348: register char *oloc2; ! 349: ! 350: if(match(ipc->r1.re1, 0)) { ! 351: ! 352: sflag = 1; ! 353: if(!ipc->r1.gfl) { ! 354: dosub(ipc->r1.rhs); ! 355: return(1); ! 356: } ! 357: ! 358: oloc2 = NULL; ! 359: do { ! 360: if(oloc2 == loc2) { ! 361: loc2++; ! 362: continue; ! 363: } else { ! 364: dosub(ipc->r1.rhs); ! 365: if(*loc2 == 0) ! 366: break; ! 367: oloc2 = loc2; ! 368: } ! 369: } while(match(ipc->r1.re1, 1)); ! 370: return(1); ! 371: } ! 372: return(0); ! 373: } ! 374: ! 375: dosub(rhsbuf) ! 376: char *rhsbuf; ! 377: { ! 378: register char *lp, *sp, *rp; ! 379: int c; ! 380: ! 381: lp = linebuf; ! 382: sp = genbuf; ! 383: rp = rhsbuf; ! 384: while (lp < loc1) ! 385: *sp++ = *lp++; ! 386: while(c = *rp++) { ! 387: if (c == '&') { ! 388: sp = place(sp, loc1, loc2); ! 389: continue; ! 390: } else if (c&0200 && (c &= 0177) >= '1' && c < NBRA+'1') { ! 391: sp = place(sp, braslist[c-'1'], braelist[c-'1']); ! 392: continue; ! 393: } ! 394: *sp++ = c&0177; ! 395: if (sp >= &genbuf[LBSIZE]) ! 396: fprintf(stderr, "sed: Output line too long.\n"); ! 397: } ! 398: lp = loc2; ! 399: loc2 = sp - genbuf + linebuf; ! 400: while (*sp++ = *lp++) ! 401: if (sp >= &genbuf[LBSIZE]) { ! 402: fprintf(stderr, "sed: Output line too long.\n"); ! 403: } ! 404: lp = linebuf; ! 405: sp = genbuf; ! 406: while (*lp++ = *sp++); ! 407: spend = lp-1; ! 408: } ! 409: char *place(asp, al1, al2) ! 410: char *asp, *al1, *al2; ! 411: { ! 412: register char *sp, *l1, *l2; ! 413: ! 414: sp = asp; ! 415: l1 = al1; ! 416: l2 = al2; ! 417: while (l1 < l2) { ! 418: *sp++ = *l1++; ! 419: if (sp >= &genbuf[LBSIZE]) ! 420: fprintf(stderr, "sed: Output line too long.\n"); ! 421: } ! 422: return(sp); ! 423: } ! 424: ! 425: command(ipc) ! 426: union reptr *ipc; ! 427: { ! 428: register int i; ! 429: register char *p1, *p2, *p3; ! 430: char *execp; ! 431: ! 432: ! 433: switch(ipc->r1.command) { ! 434: ! 435: case ACOM: ! 436: *aptr++ = ipc; ! 437: if(aptr >= &abuf[ABUFSIZE]) { ! 438: fprintf(stderr, "sed: Too many appends after line %ld\n", ! 439: lnum); ! 440: } ! 441: *aptr = 0; ! 442: break; ! 443: ! 444: case CCOM: ! 445: delflag = 1; ! 446: if(!ipc->r1.inar || dolflag) { ! 447: for(p1 = ipc->r1.re1; *p1; ) ! 448: putc(*p1++, stdout); ! 449: putc('\n', stdout); ! 450: } ! 451: break; ! 452: case DCOM: ! 453: delflag++; ! 454: break; ! 455: case CDCOM: ! 456: p1 = p2 = linebuf; ! 457: ! 458: while(*p1 != '\n') { ! 459: if(*p1++ == 0) { ! 460: delflag++; ! 461: return; ! 462: } ! 463: } ! 464: ! 465: p1++; ! 466: while(*p2++ = *p1++); ! 467: spend = p2-1; ! 468: jflag++; ! 469: break; ! 470: ! 471: case EQCOM: ! 472: fprintf(stdout, "%ld\n", lnum); ! 473: break; ! 474: ! 475: case GCOM: ! 476: p1 = linebuf; ! 477: p2 = holdsp; ! 478: while(*p1++ = *p2++); ! 479: spend = p1-1; ! 480: break; ! 481: ! 482: case CGCOM: ! 483: *spend++ = '\n'; ! 484: p1 = spend; ! 485: p2 = holdsp; ! 486: while(*p1++ = *p2++) ! 487: if(p1 >= lbend) ! 488: break; ! 489: spend = p1-1; ! 490: break; ! 491: ! 492: case HCOM: ! 493: p1 = holdsp; ! 494: p2 = linebuf; ! 495: while(*p1++ = *p2++); ! 496: hspend = p1-1; ! 497: break; ! 498: ! 499: case CHCOM: ! 500: *hspend++ = '\n'; ! 501: p1 = hspend; ! 502: p2 = linebuf; ! 503: while(*p1++ = *p2++) ! 504: if(p1 >= hend) ! 505: break; ! 506: hspend = p1-1; ! 507: break; ! 508: ! 509: case ICOM: ! 510: for(p1 = ipc->r1.re1; *p1; ) ! 511: putc(*p1++, stdout); ! 512: putc('\n', stdout); ! 513: break; ! 514: ! 515: case BCOM: ! 516: jflag = 1; ! 517: break; ! 518: ! 519: case LCOM: ! 520: p1 = linebuf; ! 521: p2 = genbuf; ! 522: genbuf[72] = 0; ! 523: while(*p1) ! 524: if(*p1 >= 040) { ! 525: if(*p1 == 0177) { ! 526: p3 = rub; ! 527: while(*p2++ = *p3++) ! 528: if(p2 >= lcomend) { ! 529: *p2 = '\\'; ! 530: fprintf(stdout, "%s\n", genbuf); ! 531: p2 = genbuf; ! 532: } ! 533: p2--; ! 534: p1++; ! 535: continue; ! 536: } ! 537: *p2++ = *p1++; ! 538: if(p2 >= lcomend) { ! 539: *p2 = '\\'; ! 540: fprintf(stdout, "%s\n", genbuf); ! 541: p2 = genbuf; ! 542: } ! 543: } else { ! 544: p3 = trans[*p1]; ! 545: while(*p2++ = *p3++) ! 546: if(p2 >= lcomend) { ! 547: *p2 = '\\'; ! 548: fprintf(stdout, "%s\n", genbuf); ! 549: p2 = genbuf; ! 550: } ! 551: p2--; ! 552: p1++; ! 553: } ! 554: if(p2[-1] == ' ') { ! 555: p3 = trans['\n']; ! 556: while(*p2++ = *p3++); ! 557: } ! 558: *p2 = 0; ! 559: fprintf(stdout, "%s\n", genbuf); ! 560: break; ! 561: ! 562: case NCOM: ! 563: if(!nflag) { ! 564: for(p1 = linebuf; p1 < spend; p1++) ! 565: putc(*p1, stdout); ! 566: putc('\n', stdout); ! 567: } ! 568: ! 569: if(aptr > abuf) ! 570: arout(); ! 571: if((execp = gline(linebuf)) == badp) { ! 572: pending = ipc; ! 573: delflag = 1; ! 574: break; ! 575: } ! 576: spend = execp; ! 577: ! 578: break; ! 579: case CNCOM: ! 580: if(aptr > abuf) ! 581: arout(); ! 582: *spend++ = '\n'; ! 583: if((execp = gline(spend)) == badp) { ! 584: pending = ipc; ! 585: delflag = 1; ! 586: break; ! 587: } ! 588: spend = execp; ! 589: break; ! 590: ! 591: case PCOM: ! 592: for(p1 = linebuf; p1 < spend; p1++) ! 593: putc(*p1, stdout); ! 594: putc('\n', stdout); ! 595: break; ! 596: case CPCOM: ! 597: cpcom: ! 598: for(p1 = linebuf; *p1 != '\n' && *p1 != '\0'; ) ! 599: putc(*p1++, stdout); ! 600: putc('\n', stdout); ! 601: break; ! 602: ! 603: case QCOM: ! 604: if(!nflag) { ! 605: for(p1 = linebuf; p1 < spend; p1++) ! 606: putc(*p1, stdout); ! 607: putc('\n', stdout); ! 608: } ! 609: if(aptr > abuf) arout(); ! 610: fclose(stdout); ! 611: exit(0); ! 612: case RCOM: ! 613: ! 614: *aptr++ = ipc; ! 615: if(aptr >= &abuf[ABUFSIZE]) ! 616: fprintf(stderr, "sed: Too many reads after line%ld\n", ! 617: lnum); ! 618: ! 619: *aptr = 0; ! 620: ! 621: break; ! 622: ! 623: case SCOM: ! 624: i = substitute(ipc); ! 625: if(ipc->r1.pfl && i) ! 626: if(ipc->r1.pfl == 1) { ! 627: for(p1 = linebuf; p1 < spend; p1++) ! 628: putc(*p1, stdout); ! 629: putc('\n', stdout); ! 630: } ! 631: else ! 632: goto cpcom; ! 633: if(i && ipc->r1.fcode) ! 634: goto wcom; ! 635: break; ! 636: ! 637: case TCOM: ! 638: if(sflag == 0) break; ! 639: sflag = 0; ! 640: jflag = 1; ! 641: break; ! 642: ! 643: wcom: ! 644: case WCOM: ! 645: fprintf(ipc->r1.fcode, "%s\n", linebuf); ! 646: fflush(ipc->r1.fcode); ! 647: break; ! 648: case XCOM: ! 649: p1 = linebuf; ! 650: p2 = genbuf; ! 651: while(*p2++ = *p1++); ! 652: p1 = holdsp; ! 653: p2 = linebuf; ! 654: while(*p2++ = *p1++); ! 655: spend = p2 - 1; ! 656: p1 = genbuf; ! 657: p2 = holdsp; ! 658: while(*p2++ = *p1++); ! 659: hspend = p2 - 1; ! 660: break; ! 661: ! 662: case YCOM: ! 663: p1 = linebuf; ! 664: p2 = ipc->r1.re1; ! 665: while(*p1 = p2[*p1]) p1++; ! 666: break; ! 667: } ! 668: ! 669: } ! 670: ! 671: char * ! 672: gline(addr) ! 673: char *addr; ! 674: { ! 675: register char *p1, *p2; ! 676: register c; ! 677: sflag = 0; ! 678: p1 = addr; ! 679: p2 = cbp; ! 680: for (;;) { ! 681: if (p2 >= ebp) { ! 682: if ((c = read(f, ibuf, 512)) <= 0) { ! 683: return(badp); ! 684: } ! 685: p2 = ibuf; ! 686: ebp = ibuf+c; ! 687: } ! 688: if ((c = *p2++) == '\n') { ! 689: if(p2 >= ebp) { ! 690: if((c = read(f, ibuf, 512)) <= 0) { ! 691: close(f); ! 692: if(eargc == 0) ! 693: dolflag = 1; ! 694: } ! 695: ! 696: p2 = ibuf; ! 697: ebp = ibuf + c; ! 698: } ! 699: break; ! 700: } ! 701: if(c) ! 702: if(p1 < lbend) ! 703: *p1++ = c; ! 704: } ! 705: lnum++; ! 706: *p1 = 0; ! 707: cbp = p2; ! 708: ! 709: return(p1); ! 710: } ! 711: ecmp(a, b, count) ! 712: char *a, *b; ! 713: { ! 714: while(count--) ! 715: if(*a++ != *b++) return(0); ! 716: return(1); ! 717: } ! 718: ! 719: arout() ! 720: { ! 721: register char *p1; ! 722: FILE *fi; ! 723: char c; ! 724: int t; ! 725: ! 726: aptr = abuf - 1; ! 727: while(*++aptr) { ! 728: if((*aptr)->r1.command == ACOM) { ! 729: for(p1 = (*aptr)->r1.re1; *p1; ) ! 730: putc(*p1++, stdout); ! 731: putc('\n', stdout); ! 732: } else { ! 733: if((fi = fopen((*aptr)->r1.re1, "r")) == NULL) ! 734: continue; ! 735: while((t = getc(fi)) != EOF) { ! 736: c = t; ! 737: putc(c, stdout); ! 738: } ! 739: fclose(fi); ! 740: } ! 741: } ! 742: aptr = abuf; ! 743: *aptr = 0; ! 744: } ! 745:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.