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