xref: /csrg-svn/old/sed/sed1.c (revision 48309)
1*48309Sbostic /*-
2*48309Sbostic  * %sccs.include.proprietary.c%
3*48309Sbostic  */
418578Sralph 
5*48309Sbostic #ifndef lint
6*48309Sbostic static char sccsid[] = "@(#)sed1.c	4.4 (Berkeley) 04/18/91";
7*48309Sbostic #endif /* not lint */
8*48309Sbostic 
918578Sralph #include	<stdio.h>
1018578Sralph #include "sed.h"
1118578Sralph 
1218578Sralph char	*trans[040]  = {
1318578Sralph 	"\\01",
1418578Sralph 	"\\02",
1518578Sralph 	"\\03",
1618578Sralph 	"\\04",
1718578Sralph 	"\\05",
1818578Sralph 	"\\06",
1918578Sralph 	"\\07",
2018578Sralph 	"<-",
2118578Sralph 	">-",
2218578Sralph 	"\n",
2318578Sralph 	"\\13",
2418578Sralph 	"\\14",
2518578Sralph 	"\\15",
2618578Sralph 	"\\16",
2718578Sralph 	"\\17",
2818578Sralph 	"\\20",
2918578Sralph 	"\\21",
3018578Sralph 	"\\22",
3118578Sralph 	"\\23",
3218578Sralph 	"\\24",
3318578Sralph 	"\\25",
3418578Sralph 	"\\26",
3518578Sralph 	"\\27",
3618578Sralph 	"\\30",
3718578Sralph 	"\\31",
3818578Sralph 	"\\32",
3918578Sralph 	"\\33",
4018578Sralph 	"\\34",
4118578Sralph 	"\\35",
4218578Sralph 	"\\36",
4318578Sralph 	"\\37"
4418578Sralph };
4518578Sralph char	rub[] = {"\177"};
4618578Sralph 
execute(file)4718578Sralph execute(file)
4818578Sralph char *file;
4918578Sralph {
5018578Sralph 	register char *p1, *p2;
5133077Sbostic 	register struct reptr	*ipc;
5218578Sralph 	int	c;
5318578Sralph 	char	*execp;
5418578Sralph 
5518578Sralph 	if (file) {
5618578Sralph 		if ((f = open(file, 0)) < 0) {
5718578Sralph 			fprintf(stderr, "Can't open %s\n", file);
5818578Sralph 		}
5918578Sralph 	} else
6018578Sralph 		f = 0;
6118578Sralph 
6218578Sralph 	ebp = ibuf;
6318578Sralph 	cbp = ibuf;
6418578Sralph 
6518578Sralph 	if(pending) {
6618578Sralph 		ipc = pending;
6718578Sralph 		pending = 0;
6818578Sralph 		goto yes;
6918578Sralph 	}
7018578Sralph 
7118578Sralph 	for(;;) {
7218578Sralph 		if((execp = gline(linebuf)) == badp) {
7318578Sralph 			close(f);
7418578Sralph 			return;
7518578Sralph 		}
7618578Sralph 		spend = execp;
7718578Sralph 
7818578Sralph 		for(ipc = ptrspace; ipc->command; ) {
7918578Sralph 
8018578Sralph 			p1 = ipc->ad1;
8118578Sralph 			p2 = ipc->ad2;
8218578Sralph 
8318578Sralph 			if(p1) {
8418578Sralph 
8518578Sralph 				if(ipc->inar) {
8618578Sralph 					if(*p2 == CEND) {
8718578Sralph 						p1 = 0;
8818578Sralph 					} else if(*p2 == CLNUM) {
8918578Sralph 						c = p2[1];
9018578Sralph 						if(lnum > tlno[c]) {
9118578Sralph 							ipc->inar = 0;
9218578Sralph 							if(ipc->negfl)
9318578Sralph 								goto yes;
9418578Sralph 							ipc++;
9518578Sralph 							continue;
9618578Sralph 						}
9718578Sralph 						if(lnum == tlno[c]) {
9818578Sralph 							ipc->inar = 0;
9918578Sralph 						}
10018578Sralph 					} else if(match(p2, 0)) {
10118578Sralph 						ipc->inar = 0;
10218578Sralph 					}
10318578Sralph 				} else if(*p1 == CEND) {
10418578Sralph 					if(!dolflag) {
10518578Sralph 						if(ipc->negfl)
10618578Sralph 							goto yes;
10718578Sralph 						ipc++;
10818578Sralph 						continue;
10918578Sralph 					}
11018578Sralph 
11118578Sralph 				} else if(*p1 == CLNUM) {
11218578Sralph 					c = p1[1];
11318578Sralph 					if(lnum != tlno[c]) {
11418578Sralph 						if(ipc->negfl)
11518578Sralph 							goto yes;
11618578Sralph 						ipc++;
11718578Sralph 						continue;
11818578Sralph 					}
11918578Sralph 					if(p2)
12018578Sralph 						ipc->inar = 1;
12118578Sralph 				} else if(match(p1, 0)) {
12218578Sralph 					if(p2)
12318578Sralph 						ipc->inar = 1;
12418578Sralph 				} else {
12518578Sralph 					if(ipc->negfl)
12618578Sralph 						goto yes;
12718578Sralph 					ipc++;
12818578Sralph 					continue;
12918578Sralph 				}
13018578Sralph 			}
13118578Sralph 
13218578Sralph 			if(ipc->negfl) {
13318578Sralph 				ipc++;
13418578Sralph 				continue;
13518578Sralph 			}
13618578Sralph 	yes:
13718578Sralph 			command(ipc);
13818578Sralph 
13918578Sralph 			if(delflag)
14018578Sralph 				break;
14118578Sralph 
14218578Sralph 			if(jflag) {
14318578Sralph 				jflag = 0;
14418578Sralph 				if((ipc = ipc->lb1) == 0) {
14518578Sralph 					ipc = ptrspace;
14618578Sralph 					break;
14718578Sralph 				}
14818578Sralph 			} else
14918578Sralph 				ipc++;
15018578Sralph 
15118578Sralph 		}
15218578Sralph 		if(!nflag && !delflag) {
15318578Sralph 			for(p1 = linebuf; p1 < spend; p1++)
15418578Sralph 				putc(*p1, stdout);
15518578Sralph 			putc('\n', stdout);
15618578Sralph 		}
15718578Sralph 
15818578Sralph 		if(aptr > abuf) {
15918578Sralph 			arout();
16018578Sralph 		}
16118578Sralph 
16218578Sralph 		delflag = 0;
16318578Sralph 
16418578Sralph 	}
16518578Sralph }
match(expbuf,gf)16618578Sralph match(expbuf, gf)
16718578Sralph char	*expbuf;
16818578Sralph {
16918578Sralph 	register char	*p1, *p2, c;
17018578Sralph 
17118578Sralph 	if(gf) {
17218578Sralph 		if(*expbuf)	return(0);
17318578Sralph 		p1 = linebuf;
17418578Sralph 		p2 = genbuf;
17518578Sralph 		while(*p1++ = *p2++);
17618578Sralph 		locs = p1 = loc2;
17718578Sralph 	} else {
17818578Sralph 		p1 = linebuf;
17918578Sralph 		locs = 0;
18018578Sralph 	}
18118578Sralph 
18218578Sralph 	p2 = expbuf;
18318578Sralph 	if(*p2++) {
18418578Sralph 		loc1 = p1;
18518578Sralph 		if(*p2 == CCHR && p2[1] != *p1)
18618578Sralph 			return(0);
18718578Sralph 		return(advance(p1, p2));
18818578Sralph 	}
18918578Sralph 
19018578Sralph 	/* fast check for first character */
19118578Sralph 
19218578Sralph 	if(*p2 == CCHR) {
19318578Sralph 		c = p2[1];
19418578Sralph 		do {
19518578Sralph 			if(*p1 != c)
19618578Sralph 				continue;
19718578Sralph 			if(advance(p1, p2)) {
19818578Sralph 				loc1 = p1;
19918578Sralph 				return(1);
20018578Sralph 			}
20118578Sralph 		} while(*p1++);
20218578Sralph 		return(0);
20318578Sralph 	}
20418578Sralph 
20518578Sralph 	do {
20618578Sralph 		if(advance(p1, p2)) {
20718578Sralph 			loc1 = p1;
20818578Sralph 			return(1);
20918578Sralph 		}
21018578Sralph 	} while(*p1++);
21118578Sralph 	return(0);
21218578Sralph }
advance(alp,aep)21318578Sralph advance(alp, aep)
21418578Sralph char	*alp, *aep;
21518578Sralph {
21618578Sralph 	register char *lp, *ep, *curlp;
21718578Sralph 	char	c;
21818578Sralph 	char *bbeg;
21918578Sralph 	int	ct;
22018578Sralph 
22118578Sralph /*fprintf(stderr, "*lp = %c, %o\n*ep = %c, %o\n", *lp, *lp, *ep, *ep);	/*DEBUG*/
22218578Sralph 
22318578Sralph 	lp = alp;
22418578Sralph 	ep = aep;
22518578Sralph 	for (;;) switch (*ep++) {
22618578Sralph 
22718578Sralph 	case CCHR:
22818578Sralph 		if (*ep++ == *lp++)
22918578Sralph 			continue;
23018578Sralph 		return(0);
23118578Sralph 
23218578Sralph 	case CDOT:
23318578Sralph 		if (*lp++)
23418578Sralph 			continue;
23518578Sralph 		return(0);
23618578Sralph 
23718578Sralph 	case CNL:
23818578Sralph 	case CDOL:
23918578Sralph 		if (*lp == 0)
24018578Sralph 			continue;
24118578Sralph 		return(0);
24218578Sralph 
24318578Sralph 	case CEOF:
24418578Sralph 		loc2 = lp;
24518578Sralph 		return(1);
24618578Sralph 
24718578Sralph 	case CCL:
24818578Sralph 		c = *lp++ & 0177;
24918578Sralph 		if(ep[c>>3] & bittab[c & 07]) {
25018578Sralph 			ep += 16;
25118578Sralph 			continue;
25218578Sralph 		}
25318578Sralph 		return(0);
25418578Sralph 
25518578Sralph 	case CBRA:
25618578Sralph 		braslist[*ep++] = lp;
25718578Sralph 		continue;
25818578Sralph 
25918578Sralph 	case CKET:
26018578Sralph 		braelist[*ep++] = lp;
26118578Sralph 		continue;
26218578Sralph 
26318578Sralph 	case CBACK:
26418578Sralph 		bbeg = braslist[*ep];
26518578Sralph 		ct = braelist[*ep++] - bbeg;
26618578Sralph 
26718578Sralph 		if(ecmp(bbeg, lp, ct)) {
26818578Sralph 			lp += ct;
26918578Sralph 			continue;
27018578Sralph 		}
27118578Sralph 		return(0);
27218578Sralph 
27318578Sralph 	case CBACK|STAR:
27418578Sralph 		bbeg = braslist[*ep];
27518578Sralph 		ct = braelist[*ep++] - bbeg;
27618578Sralph 		curlp = lp;
27718578Sralph 		while(ecmp(bbeg, lp, ct))
27818578Sralph 			lp += ct;
27918578Sralph 
28018578Sralph 		while(lp >= curlp) {
28118578Sralph 			if(advance(lp, ep))	return(1);
28218578Sralph 			lp -= ct;
28318578Sralph 		}
28418578Sralph 		return(0);
28518578Sralph 
28618578Sralph 
28718578Sralph 	case CDOT|STAR:
28818578Sralph 		curlp = lp;
28918578Sralph 		while (*lp++);
29018578Sralph 		goto star;
29118578Sralph 
29218578Sralph 	case CCHR|STAR:
29318578Sralph 		curlp = lp;
29418578Sralph 		while (*lp++ == *ep);
29518578Sralph 		ep++;
29618578Sralph 		goto star;
29718578Sralph 
29818578Sralph 	case CCL|STAR:
29918578Sralph 		curlp = lp;
30018578Sralph 		do {
30118578Sralph 			c = *lp++ & 0177;
30218578Sralph 		} while(ep[c>>3] & bittab[c & 07]);
30318578Sralph 		ep += 16;
30418578Sralph 		goto star;
30518578Sralph 
30618578Sralph 	star:
30718578Sralph 		if(--lp == curlp) {
30818578Sralph 			continue;
30918578Sralph 		}
31018578Sralph 
31118578Sralph 		if(*ep == CCHR) {
31218578Sralph 			c = ep[1];
31318578Sralph 			do {
31418578Sralph 				if(*lp != c)
31518578Sralph 					continue;
31618578Sralph 				if(advance(lp, ep))
31718578Sralph 					return(1);
31818578Sralph 			} while(lp-- > curlp);
31918578Sralph 			return(0);
32018578Sralph 		}
32118578Sralph 
32218578Sralph 		if(*ep == CBACK) {
32318578Sralph 			c = *(braslist[ep[1]]);
32418578Sralph 			do {
32518578Sralph 				if(*lp != c)
32618578Sralph 					continue;
32718578Sralph 				if(advance(lp, ep))
32818578Sralph 					return(1);
32918578Sralph 			} while(lp-- > curlp);
33018578Sralph 			return(0);
33118578Sralph 		}
33218578Sralph 
33318578Sralph 		do {
33418578Sralph 			if(lp == locs)	break;
33518578Sralph 			if (advance(lp, ep))
33618578Sralph 				return(1);
33718578Sralph 		} while (lp-- > curlp);
33818578Sralph 		return(0);
33918578Sralph 
34018578Sralph 	default:
34118578Sralph 		fprintf(stderr, "RE botch, %o\n", *--ep);
34218578Sralph 	}
34318578Sralph }
34418578Sralph substitute(ipc)
34533077Sbostic struct reptr	*ipc;
34618578Sralph {
34718578Sralph 	if(match(ipc->re1, 0) == 0)	return(0);
34818578Sralph 
34918578Sralph 	sflag = 1;
35018578Sralph 	dosub(ipc->rhs);
35118578Sralph 
35218578Sralph 	if(ipc->gfl) {
35318578Sralph 		while(*loc2) {
35418578Sralph 			if(match(ipc->re1, 1) == 0) break;
35518578Sralph 			dosub(ipc->rhs);
35618578Sralph 		}
35718578Sralph 	}
35818578Sralph 	return(1);
35918578Sralph }
36018578Sralph 
dosub(rhsbuf)36118578Sralph dosub(rhsbuf)
36218578Sralph char	*rhsbuf;
36318578Sralph {
36418578Sralph 	register char *lp, *sp, *rp;
36518578Sralph 	int c;
36618578Sralph 
36718578Sralph 	lp = linebuf;
36818578Sralph 	sp = genbuf;
36918578Sralph 	rp = rhsbuf;
37018578Sralph 	while (lp < loc1)
37118578Sralph 		*sp++ = *lp++;
37218578Sralph 	while(c = *rp++) {
37318578Sralph 		if (c == '&') {
37418578Sralph 			sp = place(sp, loc1, loc2);
37518578Sralph 			continue;
37618578Sralph 		} else if (c&0200 && (c &= 0177) >= '1' && c < NBRA+'1') {
37718578Sralph 			sp = place(sp, braslist[c-'1'], braelist[c-'1']);
37818578Sralph 			continue;
37918578Sralph 		}
38018578Sralph 		*sp++ = c&0177;
38118578Sralph 		if (sp >= &genbuf[LBSIZE])
38218578Sralph 			fprintf(stderr, "output line too long.\n");
38318578Sralph 	}
38418578Sralph 	lp = loc2;
38518578Sralph 	loc2 = sp - genbuf + linebuf;
38618578Sralph 	while (*sp++ = *lp++)
38718578Sralph 		if (sp >= &genbuf[LBSIZE]) {
38818578Sralph 			fprintf(stderr, "Output line too long.\n");
38918578Sralph 		}
39018578Sralph 	lp = linebuf;
39118578Sralph 	sp = genbuf;
39218578Sralph 	while (*lp++ = *sp++);
39318578Sralph 	spend = lp-1;
39418578Sralph }
place(asp,al1,al2)39518578Sralph char	*place(asp, al1, al2)
39618578Sralph char	*asp, *al1, *al2;
39718578Sralph {
39818578Sralph 	register char *sp, *l1, *l2;
39918578Sralph 
40018578Sralph 	sp = asp;
40118578Sralph 	l1 = al1;
40218578Sralph 	l2 = al2;
40318578Sralph 	while (l1 < l2) {
40418578Sralph 		*sp++ = *l1++;
40518578Sralph 		if (sp >= &genbuf[LBSIZE])
40618578Sralph 			fprintf(stderr, "Output line too long.\n");
40718578Sralph 	}
40818578Sralph 	return(sp);
40918578Sralph }
41018578Sralph 
41118578Sralph command(ipc)
41233077Sbostic struct reptr	*ipc;
41318578Sralph {
41418578Sralph 	register int	i;
41518578Sralph 	register char	*p1, *p2, *p3;
41618578Sralph 	char	*execp;
41718578Sralph 
41818578Sralph 
41918578Sralph 	switch(ipc->command) {
42018578Sralph 
42118578Sralph 		case ACOM:
42218578Sralph 			*aptr++ = ipc;
42318578Sralph 			if(aptr >= &abuf[ABUFSIZE]) {
42418578Sralph 				fprintf(stderr, "Too many appends after line %ld\n",
42518578Sralph 					lnum);
42618578Sralph 			}
42718578Sralph 			*aptr = 0;
42818578Sralph 			break;
42918578Sralph 
43018578Sralph 		case CCOM:
43118578Sralph 			delflag = 1;
43218578Sralph 			if(!ipc->inar || dolflag) {
43318578Sralph 				for(p1 = ipc->re1; *p1; )
43418578Sralph 					putc(*p1++, stdout);
43518578Sralph 				putc('\n', stdout);
43618578Sralph 			}
43718578Sralph 			break;
43818578Sralph 		case DCOM:
43918578Sralph 			delflag++;
44018578Sralph 			break;
44118578Sralph 		case CDCOM:
44218578Sralph 			p1 = p2 = linebuf;
44318578Sralph 
44418578Sralph 			while(*p1 != '\n') {
44518578Sralph 				if(*p1++ == 0) {
44618578Sralph 					delflag++;
44718578Sralph 					return;
44818578Sralph 				}
44918578Sralph 			}
45018578Sralph 
45118578Sralph 			p1++;
45218578Sralph 			while(*p2++ = *p1++);
45318578Sralph 			spend = p2-1;
45418578Sralph 			jflag++;
45518578Sralph 			break;
45618578Sralph 
45718578Sralph 		case EQCOM:
45818578Sralph 			fprintf(stdout, "%ld\n", lnum);
45918578Sralph 			break;
46018578Sralph 
46118578Sralph 		case GCOM:
46218578Sralph 			p1 = linebuf;
46318578Sralph 			p2 = holdsp;
46418578Sralph 			while(*p1++ = *p2++);
46518578Sralph 			spend = p1-1;
46618578Sralph 			break;
46718578Sralph 
46818578Sralph 		case CGCOM:
46918578Sralph 			*spend++ = '\n';
47018578Sralph 			p1 = spend;
47118578Sralph 			p2 = holdsp;
47218578Sralph 			while(*p1++ = *p2++)
47318578Sralph 				if(p1 >= lbend)
47418578Sralph 					break;
47518578Sralph 			spend = p1-1;
47618578Sralph 			break;
47718578Sralph 
47818578Sralph 		case HCOM:
47918578Sralph 			p1 = holdsp;
48018578Sralph 			p2 = linebuf;
48118578Sralph 			while(*p1++ = *p2++);
48218578Sralph 			hspend = p1-1;
48318578Sralph 			break;
48418578Sralph 
48518578Sralph 		case CHCOM:
48618578Sralph 			*hspend++ = '\n';
48718578Sralph 			p1 = hspend;
48818578Sralph 			p2 = linebuf;
48918578Sralph 			while(*p1++ = *p2++)
49018578Sralph 				if(p1 >= hend)
49118578Sralph 					break;
49218578Sralph 			hspend = p1-1;
49318578Sralph 			break;
49418578Sralph 
49518578Sralph 		case ICOM:
49618578Sralph 			for(p1 = ipc->re1; *p1; )
49718578Sralph 				putc(*p1++, stdout);
49818578Sralph 			putc('\n', stdout);
49918578Sralph 			break;
50018578Sralph 
50118578Sralph 		case BCOM:
50218578Sralph 			jflag = 1;
50318578Sralph 			break;
50418578Sralph 
50518578Sralph 		case LCOM:
50618578Sralph 			p1 = linebuf;
50718578Sralph 			p2 = genbuf;
50818578Sralph 			genbuf[72] = 0;
50918578Sralph 			while(*p1)
51018578Sralph 				if(*p1 >= 040) {
51118578Sralph 					if(*p1 == 0177) {
51218578Sralph 						p3 = rub;
51318578Sralph 						while(*p2++ = *p3++)
51418578Sralph 							if(p2 >= lcomend) {
51518578Sralph 								*p2 = '\\';
51618578Sralph 								fprintf(stdout, "%s\n", genbuf);
51718578Sralph 								p2 = genbuf;
51818578Sralph 							}
51918578Sralph 						p2--;
52018578Sralph 						p1++;
52118578Sralph 						continue;
52218578Sralph 					}
52318578Sralph 					*p2++ = *p1++;
52418578Sralph 					if(p2 >= lcomend) {
52518578Sralph 						*p2 = '\\';
52618578Sralph 						fprintf(stdout, "%s\n", genbuf);
52718578Sralph 						p2 = genbuf;
52818578Sralph 					}
52918578Sralph 				} else {
53018578Sralph 					p3 = trans[*p1-1];
53118578Sralph 					while(*p2++ = *p3++)
53218578Sralph 						if(p2 >= lcomend) {
53318578Sralph 							*p2 = '\\';
53418578Sralph 							fprintf(stdout, "%s\n", genbuf);
53518578Sralph 							p2 = genbuf;
53618578Sralph 						}
53718578Sralph 					p2--;
53818578Sralph 					p1++;
53918578Sralph 				}
54018578Sralph 			*p2 = 0;
54118578Sralph 			fprintf(stdout, "%s\n", genbuf);
54218578Sralph 			break;
54318578Sralph 
54418578Sralph 		case NCOM:
54518578Sralph 			if(!nflag) {
54618578Sralph 				for(p1 = linebuf; p1 < spend; p1++)
54718578Sralph 					putc(*p1, stdout);
54818578Sralph 				putc('\n', stdout);
54918578Sralph 			}
55018578Sralph 
55118578Sralph 			if(aptr > abuf)
55218578Sralph 				arout();
55318578Sralph 			if((execp = gline(linebuf)) == badp) {
55418578Sralph 				pending = ipc;
55518578Sralph 				delflag = 1;
55618578Sralph 				break;
55718578Sralph 			}
55818578Sralph 			spend = execp;
55918578Sralph 
56018578Sralph 			break;
56118578Sralph 		case CNCOM:
56218578Sralph 			if(aptr > abuf)
56318578Sralph 				arout();
56418578Sralph 			*spend++ = '\n';
56518578Sralph 			if((execp = gline(spend)) == badp) {
56618578Sralph 				pending = ipc;
56718578Sralph 				delflag = 1;
56818578Sralph 				break;
56918578Sralph 			}
57018578Sralph 			spend = execp;
57118578Sralph 			break;
57218578Sralph 
57318578Sralph 		case PCOM:
57418578Sralph 			for(p1 = linebuf; p1 < spend; p1++)
57518578Sralph 				putc(*p1, stdout);
57618578Sralph 			putc('\n', stdout);
57718578Sralph 			break;
57818578Sralph 		case CPCOM:
57918578Sralph 	cpcom:
58018578Sralph 			for(p1 = linebuf; *p1 != '\n' && *p1 != '\0'; )
58118578Sralph 				putc(*p1++, stdout);
58218578Sralph 			putc('\n', stdout);
58318578Sralph 			break;
58418578Sralph 
58518578Sralph 		case QCOM:
58618578Sralph 			if(!nflag) {
58718578Sralph 				for(p1 = linebuf; p1 < spend; p1++)
58818578Sralph 					putc(*p1, stdout);
58918578Sralph 				putc('\n', stdout);
59018578Sralph 			}
59118578Sralph 			if(aptr > abuf)	arout();
59218578Sralph 			fclose(stdout);
59318578Sralph 			exit(0);
59418578Sralph 		case RCOM:
59518578Sralph 
59618578Sralph 			*aptr++ = ipc;
59718578Sralph 			if(aptr >= &abuf[ABUFSIZE])
59818578Sralph 				fprintf(stderr, "Too many reads after line%ld\n",
59918578Sralph 					lnum);
60018578Sralph 
60118578Sralph 			*aptr = 0;
60218578Sralph 
60318578Sralph 			break;
60418578Sralph 
60518578Sralph 		case SCOM:
60618578Sralph 			i = substitute(ipc);
60718578Sralph 			if(ipc->pfl && i)
60818578Sralph 				if(ipc->pfl == 1) {
60918578Sralph 					for(p1 = linebuf; p1 < spend; p1++)
61018578Sralph 						putc(*p1, stdout);
61118578Sralph 					putc('\n', stdout);
61218578Sralph 				}
61318578Sralph 				else
61418578Sralph 					goto cpcom;
61518578Sralph 			if(i && ipc->fcode)
61618578Sralph 				goto wcom;
61718578Sralph 			break;
61818578Sralph 
61918578Sralph 		case TCOM:
62018578Sralph 			if(sflag == 0)	break;
62118578Sralph 			sflag = 0;
62218578Sralph 			jflag = 1;
62318578Sralph 			break;
62418578Sralph 
62518578Sralph 		wcom:
62618578Sralph 		case WCOM:
62718578Sralph 			fprintf(ipc->fcode, "%s\n", linebuf);
62818579Sralph 			fflush(ipc->fcode);
62918578Sralph 			break;
63018578Sralph 		case XCOM:
63118578Sralph 			p1 = linebuf;
63218578Sralph 			p2 = genbuf;
63318578Sralph 			while(*p2++ = *p1++);
63418578Sralph 			p1 = holdsp;
63518578Sralph 			p2 = linebuf;
63618578Sralph 			while(*p2++ = *p1++);
63718578Sralph 			spend = p2 - 1;
63818578Sralph 			p1 = genbuf;
63918578Sralph 			p2 = holdsp;
64018578Sralph 			while(*p2++ = *p1++);
64118578Sralph 			hspend = p2 - 1;
64218578Sralph 			break;
64318578Sralph 
64418578Sralph 		case YCOM:
64518578Sralph 			p1 = linebuf;
64618578Sralph 			p2 = ipc->re1;
64718578Sralph 			while(*p1 = p2[*p1])	p1++;
64818578Sralph 			break;
64918578Sralph 	}
65018578Sralph 
65118578Sralph }
65218578Sralph 
65318578Sralph char	*
gline(addr)65418578Sralph gline(addr)
65518578Sralph char	*addr;
65618578Sralph {
65718578Sralph 	register char	*p1, *p2;
65818578Sralph 	register	c;
65918578Sralph 	p1 = addr;
66018578Sralph 	p2 = cbp;
66118578Sralph 	for (;;) {
66218578Sralph 		if (p2 >= ebp) {
66318578Sralph 			if ((c = read(f, ibuf, BUFSIZ)) <= 0) {
66418578Sralph 				return(badp);
66518578Sralph 			}
66618578Sralph 			p2 = ibuf;
66718578Sralph 			ebp = ibuf+c;
66818578Sralph 		}
66918578Sralph 		if ((c = *p2++) == '\n') {
67018578Sralph 			if(p2 >=  ebp) {
67118578Sralph 				if((c = read(f, ibuf, BUFSIZ)) <= 0) {
67218578Sralph 					close(f);
67318578Sralph 					if(eargc == 0)
67418578Sralph 							dolflag = 1;
67518578Sralph 				}
67618578Sralph 
67718578Sralph 				p2 = ibuf;
67818578Sralph 				ebp = ibuf + c;
67918578Sralph 			}
68018578Sralph 			break;
68118578Sralph 		}
68218578Sralph 		if(c)
68318578Sralph 		if(p1 < lbend)
68418578Sralph 			*p1++ = c;
68518578Sralph 	}
68618578Sralph 	lnum++;
68718578Sralph 	*p1 = 0;
68818578Sralph 	cbp = p2;
68918578Sralph 
69018578Sralph 	return(p1);
69118578Sralph }
ecmp(a,b,count)69218578Sralph ecmp(a, b, count)
69318578Sralph char	*a, *b;
69418578Sralph {
69518578Sralph 	while(count--)
69618578Sralph 		if(*a++ != *b++)	return(0);
69718578Sralph 	return(1);
69818578Sralph }
69918578Sralph 
arout()70018578Sralph arout()
70118578Sralph {
70218578Sralph 	register char	*p1;
70318578Sralph 	FILE	*fi;
70418578Sralph 	char	c;
70518578Sralph 	int	t;
70618578Sralph 
70718578Sralph 	aptr = abuf - 1;
70818578Sralph 	while(*++aptr) {
70918578Sralph 		if((*aptr)->command == ACOM) {
71018578Sralph 			for(p1 = (*aptr)->re1; *p1; )
71118578Sralph 				putc(*p1++, stdout);
71218578Sralph 			putc('\n', stdout);
71318578Sralph 		} else {
71418578Sralph 			if((fi = fopen((*aptr)->re1, "r")) == NULL)
71518578Sralph 				continue;
71618578Sralph 			while((t = getc(fi)) != EOF) {
71718578Sralph 				c = t;
71818578Sralph 				putc(c, stdout);
71918578Sralph 			}
72018578Sralph 			fclose(fi);
72118578Sralph 		}
72218578Sralph 	}
72318578Sralph 	aptr = abuf;
72418578Sralph 	*aptr = 0;
72518578Sralph }
72618578Sralph 
727