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