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