|
|
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.