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