Home | History | Annotate | Download | only in sed
      1    0  stevel /*
      2    0  stevel  * CDDL HEADER START
      3    0  stevel  *
      4    0  stevel  * The contents of this file are subject to the terms of the
      5    0  stevel  * Common Development and Distribution License, Version 1.0 only
      6    0  stevel  * (the "License").  You may not use this file except in compliance
      7    0  stevel  * with the License.
      8    0  stevel  *
      9    0  stevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10    0  stevel  * or http://www.opensolaris.org/os/licensing.
     11    0  stevel  * See the License for the specific language governing permissions
     12    0  stevel  * and limitations under the License.
     13    0  stevel  *
     14    0  stevel  * When distributing Covered Code, include this CDDL HEADER in each
     15    0  stevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16    0  stevel  * If applicable, add the following below this CDDL HEADER, with the
     17    0  stevel  * fields enclosed by brackets "[]" replaced with your own identifying
     18    0  stevel  * information: Portions Copyright [yyyy] [name of copyright owner]
     19    0  stevel  *
     20    0  stevel  * CDDL HEADER END
     21    0  stevel  */
     22  640  basabi /*
     23  640  basabi  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
     24  640  basabi  * Use is subject to license terms.
     25  640  basabi  */
     26  640  basabi 
     27    0  stevel /*	Copyright (c) 1984 AT&T	*/
     28    0  stevel /*	  All Rights Reserved  	*/
     29    0  stevel 
     30    0  stevel 
     31  640  basabi #pragma ident	"%Z%%M%	%I%	%E% SMI"
     32    0  stevel 
     33    0  stevel #include <stdio.h>
     34    0  stevel #include <sys/types.h>
     35    0  stevel #include <sys/stat.h>
     36    0  stevel #include <fcntl.h>
     37    0  stevel #include "sed.h"
     38    0  stevel #include <regexp.h>
     39    0  stevel 
     40    0  stevel union reptr     *abuf[ABUFSIZE+1];
     41    0  stevel union reptr **aptr;
     42    0  stevel char    ibuf[BUFSIZ];
     43    0  stevel char    *cbp;
     44    0  stevel char    *ebp;
     45    0  stevel char    genbuf[LBSIZE+1];
     46    0  stevel char	*lcomend;
     47    0  stevel int     dolflag;
     48    0  stevel int     sflag;
     49    0  stevel int     jflag;
     50    0  stevel int     delflag;
     51    0  stevel long long lnum;
     52    0  stevel char    holdsp[LBSIZE+1];
     53    0  stevel char    *spend;
     54    0  stevel char    *hspend;
     55    0  stevel int     nflag;
     56    0  stevel long long tlno[NLINES];
     57    0  stevel int     f;
     58    0  stevel char	*ifname;
     59    0  stevel int	numpass;
     60    0  stevel union reptr     *pending;
     61    0  stevel char	*trans[040]  = {
     62    0  stevel 	"\\01",
     63    0  stevel 	"\\02",
     64    0  stevel 	"\\03",
     65    0  stevel 	"\\04",
     66    0  stevel 	"\\05",
     67    0  stevel 	"\\06",
     68    0  stevel 	"\\07",
     69    0  stevel 	"-<",
     70    0  stevel 	"->",
     71    0  stevel 	"\n",
     72    0  stevel 	"\\13",
     73    0  stevel 	"\\14",
     74    0  stevel 	"\\15",
     75    0  stevel 	"\\16",
     76    0  stevel 	"\\17",
     77    0  stevel 	"\\20",
     78    0  stevel 	"\\21",
     79    0  stevel 	"\\22",
     80    0  stevel 	"\\23",
     81    0  stevel 	"\\24",
     82    0  stevel 	"\\25",
     83    0  stevel 	"\\26",
     84    0  stevel 	"\\27",
     85    0  stevel 	"\\30",
     86    0  stevel 	"\\31",
     87    0  stevel 	"\\32",
     88    0  stevel 	"\\33",
     89    0  stevel 	"\\34",
     90    0  stevel 	"\\35",
     91    0  stevel 	"\\36",
     92    0  stevel 	"\\37"
     93    0  stevel };
     94    0  stevel char	rub[] = {"\\177"};
     95    0  stevel 
     96    0  stevel extern char TMMES[];
     97    0  stevel 
     98  640  basabi static int match(char *expbuf, int gf);
     99  640  basabi static int substitute(union reptr *ipc);
    100  640  basabi static void dosub(char *rhsbuf, int n);
    101  640  basabi static void command(union reptr *ipc);
    102  640  basabi static void arout(void);
    103  640  basabi 
    104  640  basabi void
    105  640  basabi execute(char *file)
    106    0  stevel {
    107  640  basabi 	char *p1, *p2;
    108  640  basabi 	union reptr	*ipc;
    109    0  stevel 	int	c;
    110    0  stevel 	char	*execp;
    111    0  stevel 
    112    0  stevel 	if (file) {
    113    0  stevel 		if ((f = open(file, 0)) < 0) {
    114    0  stevel 			(void) fprintf(stderr, "sed: ");
    115    0  stevel 			perror(file);
    116    0  stevel 		}
    117    0  stevel 		ifname = file;
    118    0  stevel 	} else {
    119    0  stevel 		f = 0;
    120    0  stevel 		ifname = "standard input";
    121    0  stevel 	}
    122    0  stevel 
    123    0  stevel 	ebp = ibuf;
    124    0  stevel 	cbp = ibuf;
    125    0  stevel 
    126    0  stevel 	if(pending) {
    127    0  stevel 		ipc = pending;
    128    0  stevel 		pending = 0;
    129    0  stevel 		goto yes;
    130    0  stevel 	}
    131    0  stevel 
    132    0  stevel 	for(;;) {
    133    0  stevel 		if((execp = gline(linebuf)) == 0) {
    134    0  stevel 			(void) close(f);
    135    0  stevel 			return;
    136    0  stevel 		}
    137    0  stevel 		spend = execp;
    138    0  stevel 
    139    0  stevel 		for(ipc = ptrspace; ipc->r1.command; ) {
    140    0  stevel 
    141    0  stevel 			p1 = ipc->r1.ad1;
    142    0  stevel 			p2 = ipc->r1.ad2;
    143    0  stevel 
    144    0  stevel 			if(p1) {
    145    0  stevel 
    146    0  stevel 				if(ipc->r1.inar) {
    147    0  stevel 					if(*p2 == CEND) {
    148    0  stevel 						p1 = 0;
    149    0  stevel 					} else if(*p2 == CLNUM) {
    150    0  stevel 						c = (unsigned char)p2[1];
    151    0  stevel 						if(lnum > tlno[c]) {
    152    0  stevel 							ipc->r1.inar = 0;
    153    0  stevel 							if(ipc->r1.negfl)
    154    0  stevel 								goto yes;
    155    0  stevel 							ipc++;
    156    0  stevel 							continue;
    157    0  stevel 						}
    158    0  stevel 						if(lnum == tlno[c]) {
    159    0  stevel 							ipc->r1.inar = 0;
    160    0  stevel 						}
    161    0  stevel 					} else if(match(p2, 0)) {
    162    0  stevel 						ipc->r1.inar = 0;
    163    0  stevel 					}
    164    0  stevel 				} else if(*p1 == CEND) {
    165    0  stevel 					if(!dolflag) {
    166    0  stevel 						if(ipc->r1.negfl)
    167    0  stevel 							goto yes;
    168    0  stevel 						ipc++;
    169    0  stevel 						continue;
    170    0  stevel 					}
    171    0  stevel 
    172    0  stevel 				} else if(*p1 == CLNUM) {
    173    0  stevel 					c = (unsigned char)p1[1];
    174    0  stevel 					if(lnum != tlno[c]) {
    175    0  stevel 						if(ipc->r1.negfl)
    176    0  stevel 							goto yes;
    177    0  stevel 						ipc++;
    178    0  stevel 						continue;
    179    0  stevel 					}
    180    0  stevel 					if(p2)
    181    0  stevel 						ipc->r1.inar = 1;
    182    0  stevel 				} else if(match(p1, 0)) {
    183    0  stevel 					if(p2)
    184    0  stevel 						ipc->r1.inar = 1;
    185    0  stevel 				} else {
    186    0  stevel 					if(ipc->r1.negfl)
    187    0  stevel 						goto yes;
    188    0  stevel 					ipc++;
    189    0  stevel 					continue;
    190    0  stevel 				}
    191    0  stevel 			}
    192    0  stevel 
    193    0  stevel 			if(ipc->r1.negfl) {
    194    0  stevel 				ipc++;
    195    0  stevel 				continue;
    196    0  stevel 			}
    197    0  stevel 	yes:
    198    0  stevel 			command(ipc);
    199    0  stevel 
    200    0  stevel 			if(delflag)
    201    0  stevel 				break;
    202    0  stevel 
    203    0  stevel 			if(jflag) {
    204    0  stevel 				jflag = 0;
    205    0  stevel 				if((ipc = ipc->r2.lb1) == 0) {
    206    0  stevel 					ipc = ptrspace;
    207    0  stevel 					break;
    208    0  stevel 				}
    209    0  stevel 			} else
    210    0  stevel 				ipc++;
    211    0  stevel 
    212    0  stevel 		}
    213    0  stevel 		if(!nflag && !delflag) {
    214    0  stevel 			for(p1 = linebuf; p1 < spend; p1++)
    215    0  stevel 				(void) putc(*p1, stdout);
    216    0  stevel 			(void) putc('\n', stdout);
    217    0  stevel 		}
    218    0  stevel 
    219    0  stevel 		if(aptr > abuf) {
    220    0  stevel 			arout();
    221    0  stevel 		}
    222    0  stevel 
    223    0  stevel 		delflag = 0;
    224    0  stevel 
    225    0  stevel 	}
    226    0  stevel }
    227  640  basabi 
    228  640  basabi static int
    229  640  basabi match(char *expbuf, int gf)
    230    0  stevel {
    231  640  basabi 	char   *p1;
    232    0  stevel 
    233    0  stevel 	if(gf) {
    234    0  stevel 		if(*expbuf)	return(0);
    235    0  stevel 		locs = p1 = loc2;
    236    0  stevel 	} else {
    237    0  stevel 		p1 = linebuf;
    238    0  stevel 		locs = 0;
    239    0  stevel 	}
    240    0  stevel 
    241    0  stevel 	circf = *expbuf++;
    242    0  stevel 	return(step(p1, expbuf));
    243    0  stevel }
    244    0  stevel 
    245  640  basabi static int
    246  640  basabi substitute(union reptr *ipc)
    247    0  stevel {
    248    0  stevel 	if(match(ipc->r1.re1, 0) == 0)	return(0);
    249    0  stevel 
    250    0  stevel 	numpass = 0;
    251    0  stevel 	sflag = 0;		/* Flags if any substitution was made */
    252    0  stevel 	dosub(ipc->r1.rhs, ipc->r1.gfl);
    253    0  stevel 
    254    0  stevel 	if(ipc->r1.gfl) {
    255    0  stevel 		while(*loc2) {
    256    0  stevel 			if(match(ipc->r1.re1, 1) == 0) break;
    257    0  stevel 			dosub(ipc->r1.rhs, ipc->r1.gfl);
    258    0  stevel 		}
    259    0  stevel 	}
    260    0  stevel 	return(sflag);
    261    0  stevel }
    262    0  stevel 
    263  640  basabi static void
    264  640  basabi dosub(char *rhsbuf, int n)
    265    0  stevel {
    266  640  basabi 	char *lp, *sp, *rp;
    267    0  stevel 	int c;
    268    0  stevel 
    269    0  stevel 	if(n > 0 && n < 999)
    270    0  stevel 		{numpass++;
    271    0  stevel 		if(n != numpass) return;
    272    0  stevel 		}
    273    0  stevel 	sflag = 1;
    274    0  stevel 	lp = linebuf;
    275    0  stevel 	sp = genbuf;
    276    0  stevel 	rp = rhsbuf;
    277    0  stevel 	while (lp < loc1)
    278    0  stevel 		*sp++ = *lp++;
    279    0  stevel 	while(c = *rp++) {
    280    0  stevel 		if (c == '&')
    281    0  stevel 			sp = place(sp, loc1, loc2);
    282    0  stevel 		else if (c == '\\') {
    283    0  stevel 			c = *rp++;
    284    0  stevel 			if (c >= '1' && c < NBRA+'1')
    285    0  stevel 				sp = place(sp, braslist[c-'1'], braelist[c-'1']);
    286    0  stevel 			else
    287    0  stevel 				*sp++ = c;
    288    0  stevel   		} else
    289    0  stevel 			*sp++ = c;
    290    0  stevel 		if (sp == &genbuf[LBSIZE+1]) {
    291    0  stevel 			(void) fprintf(stderr, "Output line too long.\n");
    292    0  stevel 			*--sp = '\0';
    293    0  stevel 			goto out;
    294    0  stevel 		}
    295    0  stevel 	}
    296    0  stevel 	lp = loc2;
    297    0  stevel 	loc2 = sp - genbuf + linebuf;
    298    0  stevel 	while(*sp++ = *lp++)
    299    0  stevel 		if (sp == &genbuf[LBSIZE+1]) {
    300    0  stevel 			(void) fprintf(stderr, "Output line too long.\n");
    301    0  stevel 			*--sp = '\0';
    302    0  stevel 			break;
    303    0  stevel 		}
    304    0  stevel out:
    305    0  stevel 	lp = linebuf;
    306    0  stevel 	sp = genbuf;
    307    0  stevel 	while (*lp++ = *sp++);
    308    0  stevel 	spend = lp-1;
    309    0  stevel }
    310    0  stevel 
    311    0  stevel char	*place(asp, al1, al2)
    312    0  stevel char	*asp, *al1, *al2;
    313    0  stevel {
    314  640  basabi 	char *sp, *l1, *l2;
    315    0  stevel 
    316    0  stevel 	sp = asp;
    317    0  stevel 	l1 = al1;
    318    0  stevel 	l2 = al2;
    319    0  stevel 	while (l1 < l2) {
    320    0  stevel 		*sp++ = *l1++;
    321    0  stevel 		if (sp == &genbuf[LBSIZE+1])
    322    0  stevel 			break;
    323    0  stevel 	}
    324    0  stevel 	return(sp);
    325    0  stevel }
    326    0  stevel 
    327  640  basabi static void
    328  640  basabi command(union reptr *ipc)
    329    0  stevel {
    330  640  basabi 	int	i;
    331  640  basabi 	char   *p1, *p2, *p3;
    332    0  stevel 	char	*execp;
    333    0  stevel 
    334    0  stevel 
    335    0  stevel 	switch(ipc->r1.command) {
    336    0  stevel 
    337    0  stevel 		case ACOM:
    338    0  stevel 			if(aptr >= &abuf[ABUFSIZE]) {
    339    0  stevel 				(void) fprintf(stderr, "Too many appends or reads after line %lld\n",
    340    0  stevel 					lnum);
    341    0  stevel 			} else {
    342    0  stevel 				*aptr++ = ipc;
    343    0  stevel 				*aptr = 0;
    344    0  stevel 			}
    345    0  stevel 			break;
    346    0  stevel 
    347    0  stevel 		case CCOM:
    348    0  stevel 			delflag = 1;
    349    0  stevel 			if(!ipc->r1.inar || dolflag) {
    350    0  stevel 				for(p1 = ipc->r1.re1; *p1; )
    351    0  stevel 					(void) putc(*p1++, stdout);
    352    0  stevel 				(void) putc('\n', stdout);
    353    0  stevel 			}
    354    0  stevel 			break;
    355    0  stevel 		case DCOM:
    356    0  stevel 			delflag++;
    357    0  stevel 			break;
    358    0  stevel 		case CDCOM:
    359    0  stevel 			p1 = p2 = linebuf;
    360    0  stevel 
    361    0  stevel 			while(*p1 != '\n') {
    362    0  stevel 				if(*p1++ == 0) {
    363    0  stevel 					delflag++;
    364    0  stevel 					return;
    365    0  stevel 				}
    366    0  stevel 			}
    367    0  stevel 
    368    0  stevel 			p1++;
    369    0  stevel 			while(*p2++ = *p1++);
    370    0  stevel 			spend = p2-1;
    371    0  stevel 			jflag++;
    372    0  stevel 			break;
    373    0  stevel 
    374    0  stevel 		case EQCOM:
    375    0  stevel 			(void) fprintf(stdout, "%lld\n", lnum);
    376    0  stevel 			break;
    377    0  stevel 
    378    0  stevel 		case GCOM:
    379    0  stevel 			p1 = linebuf;
    380    0  stevel 			p2 = holdsp;
    381    0  stevel 			while(*p1++ = *p2++);
    382    0  stevel 			spend = p1-1;
    383    0  stevel 			break;
    384    0  stevel 
    385    0  stevel 		case CGCOM:
    386    0  stevel 			*spend++ = '\n';
    387    0  stevel 			p1 = spend;
    388    0  stevel 			p2 = holdsp;
    389    0  stevel 			do {
    390    0  stevel 				if (p1 == &linebuf[LBSIZE+1]) {
    391    0  stevel 					(void) fprintf(stderr, "Output line too long.\n");
    392    0  stevel 					*--p1 = '\0';
    393    0  stevel 				}
    394    0  stevel 			} while(*p1++ = *p2++);
    395    0  stevel 			spend = p1-1;
    396    0  stevel 			break;
    397    0  stevel 
    398    0  stevel 		case HCOM:
    399    0  stevel 			p1 = holdsp;
    400    0  stevel 			p2 = linebuf;
    401    0  stevel 			while(*p1++ = *p2++);
    402    0  stevel 			hspend = p1-1;
    403    0  stevel 			break;
    404    0  stevel 
    405    0  stevel 		case CHCOM:
    406    0  stevel 			*hspend++ = '\n';
    407    0  stevel 			p1 = hspend;
    408    0  stevel 			p2 = linebuf;
    409    0  stevel 			do {
    410    0  stevel 				if (p1 == &holdsp[LBSIZE+1]) {
    411    0  stevel 					(void) fprintf(stderr, "Hold space overflowed.\n");
    412    0  stevel 					*--p1 = '\0';
    413    0  stevel 				}
    414    0  stevel 			} while(*p1++ = *p2++);
    415    0  stevel 			hspend = p1-1;
    416    0  stevel 			break;
    417    0  stevel 
    418    0  stevel 		case ICOM:
    419    0  stevel 			for(p1 = ipc->r1.re1; *p1; )
    420    0  stevel 				(void) putc(*p1++, stdout);
    421    0  stevel 			(void) putc('\n', stdout);
    422    0  stevel 			break;
    423    0  stevel 
    424    0  stevel 		case BCOM:
    425    0  stevel 			jflag = 1;
    426    0  stevel 			break;
    427    0  stevel 
    428    0  stevel 
    429    0  stevel 		case LCOM:
    430    0  stevel 			p1 = linebuf;
    431    0  stevel 			p2 = genbuf;
    432    0  stevel 			genbuf[72] = 0;
    433    0  stevel 			while(*p1)
    434    0  stevel 				if((unsigned char)*p1 >= 040) {
    435    0  stevel 					if(*p1 == 0177) {
    436    0  stevel 						p3 = rub;
    437    0  stevel 						while(*p2++ = *p3++)
    438    0  stevel 							if(p2 >= lcomend) {
    439    0  stevel 								*p2 = '\\';
    440    0  stevel 								(void) fprintf(stdout, "%s\n", genbuf);
    441    0  stevel 								p2 = genbuf;
    442    0  stevel 							}
    443    0  stevel 						p2--;
    444    0  stevel 						p1++;
    445    0  stevel 						continue;
    446    0  stevel 					}
    447    0  stevel 					if(!isprint(*p1 & 0377)) {
    448    0  stevel 						*p2++ = '\\';
    449    0  stevel 						if(p2 >= lcomend) {
    450    0  stevel 							*p2 = '\\';
    451    0  stevel 							(void) fprintf(stdout, "%s\n", genbuf);
    452    0  stevel 							p2 = genbuf;
    453    0  stevel 						}
    454    0  stevel 						*p2++ = (*p1 >> 6) + '0';
    455    0  stevel 						if(p2 >= lcomend) {
    456    0  stevel 							*p2 = '\\';
    457    0  stevel 							(void) fprintf(stdout, "%s\n", genbuf);
    458    0  stevel 							p2 = genbuf;
    459    0  stevel 						}
    460    0  stevel 						*p2++ = ((*p1 >> 3) & 07) + '0';
    461    0  stevel 						if(p2 >= lcomend) {
    462    0  stevel 							*p2 = '\\';
    463    0  stevel 							(void) fprintf(stdout, "%s\n", genbuf);
    464    0  stevel 							p2 = genbuf;
    465    0  stevel 						}
    466    0  stevel 						*p2++ = (*p1++ & 07) + '0';
    467    0  stevel 						if(p2 >= lcomend) {
    468    0  stevel 							*p2 = '\\';
    469    0  stevel 							(void) fprintf(stdout, "%s\n", genbuf);
    470    0  stevel 							p2 = genbuf;
    471    0  stevel 						}
    472    0  stevel 					} else {
    473    0  stevel 						*p2++ = *p1++;
    474    0  stevel 						if(p2 >= lcomend) {
    475    0  stevel 							*p2 = '\\';
    476    0  stevel 							(void) fprintf(stdout, "%s\n", genbuf);
    477    0  stevel 							p2 = genbuf;
    478    0  stevel 						}
    479    0  stevel 					}
    480    0  stevel 				} else {
    481    0  stevel 					p3 = trans[(unsigned char)*p1-1];
    482    0  stevel 					while(*p2++ = *p3++)
    483    0  stevel 						if(p2 >= lcomend) {
    484    0  stevel 							*p2 = '\\';
    485    0  stevel 							(void) fprintf(stdout, "%s\n", genbuf);
    486    0  stevel 							p2 = genbuf;
    487    0  stevel 						}
    488    0  stevel 					p2--;
    489    0  stevel 					p1++;
    490    0  stevel 				}
    491    0  stevel 			*p2 = 0;
    492    0  stevel 			(void) fprintf(stdout, "%s\n", genbuf);
    493    0  stevel 			break;
    494    0  stevel 
    495    0  stevel 		case NCOM:
    496    0  stevel 			if(!nflag) {
    497    0  stevel 				for(p1 = linebuf; p1 < spend; p1++)
    498    0  stevel 					(void) putc(*p1, stdout);
    499    0  stevel 				(void) putc('\n', stdout);
    500    0  stevel 			}
    501    0  stevel 
    502    0  stevel 			if(aptr > abuf)
    503    0  stevel 				arout();
    504    0  stevel 			if((execp = gline(linebuf)) == 0) {
    505    0  stevel 				pending = ipc;
    506    0  stevel 				delflag = 1;
    507    0  stevel 				break;
    508    0  stevel 			}
    509    0  stevel 			spend = execp;
    510    0  stevel 
    511    0  stevel 			break;
    512    0  stevel 		case CNCOM:
    513    0  stevel 			if(aptr > abuf)
    514    0  stevel 				arout();
    515    0  stevel 			*spend++ = '\n';
    516    0  stevel 			if((execp = gline(spend)) == 0) {
    517    0  stevel 				pending = ipc;
    518    0  stevel 				delflag = 1;
    519    0  stevel 				break;
    520    0  stevel 			}
    521    0  stevel 			spend = execp;
    522    0  stevel 			break;
    523    0  stevel 
    524    0  stevel 		case PCOM:
    525    0  stevel 			for(p1 = linebuf; p1 < spend; p1++)
    526    0  stevel 				(void) putc(*p1, stdout);
    527    0  stevel 			(void) putc('\n', stdout);
    528    0  stevel 			break;
    529    0  stevel 		case CPCOM:
    530    0  stevel 	cpcom:
    531    0  stevel 			for(p1 = linebuf; *p1 != '\n' && *p1 != '\0'; )
    532    0  stevel 				(void) putc(*p1++, stdout);
    533    0  stevel 			(void) putc('\n', stdout);
    534    0  stevel 			break;
    535    0  stevel 
    536    0  stevel 		case QCOM:
    537    0  stevel 			if(!nflag) {
    538    0  stevel 				for(p1 = linebuf; p1 < spend; p1++)
    539    0  stevel 					(void) putc(*p1, stdout);
    540    0  stevel 				(void) putc('\n', stdout);
    541    0  stevel 			}
    542    0  stevel 			if(aptr > abuf) arout();
    543    0  stevel 			(void) fclose(stdout);
    544    0  stevel 			exit(0);
    545    0  stevel 		case RCOM:
    546    0  stevel 			if(aptr >= &abuf[ABUFSIZE]) {
    547    0  stevel 				(void) fprintf(stderr, "Too many appends or reads after line %lld\n",
    548    0  stevel 					lnum);
    549    0  stevel 			} else {
    550    0  stevel 				*aptr++ = ipc;
    551    0  stevel 				*aptr = 0;
    552    0  stevel 			}
    553    0  stevel 			break;
    554    0  stevel 
    555    0  stevel 		case SCOM:
    556    0  stevel 			i = substitute(ipc);
    557    0  stevel 			if(ipc->r1.pfl && nflag && i)
    558    0  stevel 				if(ipc->r1.pfl == 1) {
    559    0  stevel 					for(p1 = linebuf; p1 < spend; p1++)
    560    0  stevel 						(void) putc(*p1, stdout);
    561    0  stevel 					(void) putc('\n', stdout);
    562    0  stevel 				}
    563    0  stevel 				else
    564    0  stevel 					goto cpcom;
    565    0  stevel 			if(i && ipc->r1.fcode)
    566    0  stevel 				goto wcom;
    567    0  stevel 			break;
    568    0  stevel 
    569    0  stevel 		case TCOM:
    570    0  stevel 			if(sflag == 0)  break;
    571    0  stevel 			sflag = 0;
    572    0  stevel 			jflag = 1;
    573    0  stevel 			break;
    574    0  stevel 
    575    0  stevel 		wcom:
    576    0  stevel 		case WCOM:
    577    0  stevel 			(void) fprintf(ipc->r1.fcode, "%s\n", linebuf);
    578    0  stevel 			(void) fflush(ipc->r1.fcode);
    579    0  stevel 			break;
    580    0  stevel 		case XCOM:
    581    0  stevel 			p1 = linebuf;
    582    0  stevel 			p2 = genbuf;
    583    0  stevel 			while(*p2++ = *p1++);
    584    0  stevel 			p1 = holdsp;
    585    0  stevel 			p2 = linebuf;
    586    0  stevel 			while(*p2++ = *p1++);
    587    0  stevel 			spend = p2 - 1;
    588    0  stevel 			p1 = genbuf;
    589    0  stevel 			p2 = holdsp;
    590    0  stevel 			while(*p2++ = *p1++);
    591    0  stevel 			hspend = p2 - 1;
    592    0  stevel 			break;
    593    0  stevel 
    594    0  stevel 		case YCOM:
    595    0  stevel 			p1 = linebuf;
    596    0  stevel 			p2 = ipc->r1.re1;
    597    0  stevel 			while(*p1 = p2[(unsigned char)*p1])	p1++;
    598    0  stevel 			break;
    599    0  stevel 	}
    600    0  stevel 
    601    0  stevel }
    602    0  stevel 
    603    0  stevel char	*gline(addr)
    604    0  stevel char	*addr;
    605    0  stevel {
    606  640  basabi 	char   *p1, *p2;
    607  640  basabi 	int	c;
    608    0  stevel 	sflag = 0;
    609    0  stevel 	p1 = addr;
    610    0  stevel 	p2 = cbp;
    611    0  stevel 	for (;;) {
    612    0  stevel 		if (p2 >= ebp) {
    613    0  stevel 			if(f < 0 || (c = read(f, ibuf, BUFSIZ)) == 0) {
    614    0  stevel 				return(0);
    615    0  stevel 			}
    616    0  stevel 			if(c < 0) {
    617    0  stevel 				(void) fprintf(stderr, "sed: error reading ");
    618    0  stevel 				perror(ifname);
    619    0  stevel 				exit(2);
    620    0  stevel 			}
    621    0  stevel 			p2 = ibuf;
    622    0  stevel 			ebp = ibuf+c;
    623    0  stevel 		}
    624    0  stevel 		if ((c = *p2++) == '\n') {
    625    0  stevel 			if(p2 >=  ebp) {
    626    0  stevel 				if(f < 0 || (c = read(f, ibuf, BUFSIZ)) == 0) {
    627    0  stevel 					if(f >= 0) {
    628    0  stevel 						(void) close(f);
    629    0  stevel 						f = -1;
    630    0  stevel 					}
    631    0  stevel 					if(eargc == 0)
    632    0  stevel 							dolflag = 1;
    633    0  stevel 				}
    634    0  stevel 				if(c < 0) {
    635    0  stevel 					(void) fprintf(stderr, "sed: error reading ");
    636    0  stevel 					perror(ifname);
    637    0  stevel 					exit(2);
    638    0  stevel 				}
    639    0  stevel 
    640    0  stevel 				p2 = ibuf;
    641    0  stevel 				ebp = ibuf + c;
    642    0  stevel 			}
    643    0  stevel 			break;
    644    0  stevel 		}
    645    0  stevel 		if(c)
    646    0  stevel 		if(p1 < &linebuf[LBSIZE])
    647    0  stevel 			*p1++ = c;
    648    0  stevel 	}
    649    0  stevel 	lnum++;
    650    0  stevel 	*p1 = 0;
    651    0  stevel 	cbp = p2;
    652    0  stevel 
    653    0  stevel 	return(p1);
    654    0  stevel }
    655    0  stevel 
    656    0  stevel char *comple(x1, ep, x3, x4)
    657    0  stevel char *x1, *x3;
    658    0  stevel char x4;
    659  640  basabi char *ep;
    660    0  stevel {
    661  640  basabi 	char *p;
    662    0  stevel 
    663    0  stevel 	p = compile(x1, ep + 1, x3, x4);
    664    0  stevel 	if(p == ep + 1)
    665    0  stevel 		return(ep);
    666    0  stevel 	*ep = circf;
    667    0  stevel 	return(p);
    668    0  stevel }
    669    0  stevel 
    670  640  basabi int
    671  640  basabi regerr(int err)
    672    0  stevel {
    673    0  stevel 	switch(err) {
    674    0  stevel 
    675    0  stevel 	case 11:
    676    0  stevel 		comperr("Range endpoint too large: %s");
    677    0  stevel 		break;
    678    0  stevel 
    679    0  stevel 	case 16:
    680    0  stevel 		comperr("Bad number: %s");
    681    0  stevel 		break;
    682    0  stevel 
    683    0  stevel 	case 25:
    684    0  stevel 		comperr("``\\digit'' out of range: %s");
    685    0  stevel 		break;
    686    0  stevel 
    687    0  stevel 	case 36:
    688    0  stevel 		comperr("Illegal or missing delimiter: %s");
    689    0  stevel 		break;
    690    0  stevel 
    691    0  stevel 	case 41:
    692    0  stevel 		comperr("No remembered search string: %s");
    693    0  stevel 		break;
    694    0  stevel 
    695    0  stevel 	case 42:
    696    0  stevel 		comperr("\\( \\) imbalance: %s");
    697    0  stevel 		break;
    698    0  stevel 
    699    0  stevel 	case 43:
    700    0  stevel 		comperr("Too many \\(: %s");
    701    0  stevel 		break;
    702    0  stevel 
    703    0  stevel 	case 44:
    704    0  stevel 		comperr("More than 2 numbers given in \\{ \\}: %s");
    705    0  stevel 		break;
    706    0  stevel 
    707    0  stevel 	case 45:
    708    0  stevel 		comperr("} expected after \\: %s");
    709    0  stevel 		break;
    710    0  stevel 
    711    0  stevel 	case 46:
    712    0  stevel 		comperr("First number exceeds second in \\{ \\}: %s");
    713    0  stevel 		break;
    714    0  stevel 
    715    0  stevel 	case 49:
    716    0  stevel 		comperr("[ ] imbalance: %s");
    717    0  stevel 		break;
    718    0  stevel 
    719    0  stevel 	case 50:
    720    0  stevel 		comperr(TMMES);
    721    0  stevel 		break;
    722    0  stevel 
    723    0  stevel 	default:
    724    0  stevel 		(void) fprintf(stderr, "Unknown regexp error code %d: %s\n",
    725    0  stevel 		    err, linebuf);
    726    0  stevel 		exit(2);
    727    0  stevel 		break;
    728    0  stevel 	}
    729  640  basabi 	return (0);
    730    0  stevel }
    731    0  stevel 
    732  640  basabi static void
    733  640  basabi arout(void)
    734    0  stevel {
    735  640  basabi 	char   *p1;
    736    0  stevel 	FILE	*fi;
    737    0  stevel 	char	c;
    738    0  stevel 	int	t;
    739    0  stevel 
    740    0  stevel 	aptr = abuf - 1;
    741    0  stevel 	while(*++aptr) {
    742    0  stevel 		if((*aptr)->r1.command == ACOM) {
    743    0  stevel 			for(p1 = (*aptr)->r1.re1; *p1; )
    744    0  stevel 				(void) putc(*p1++, stdout);
    745    0  stevel 			(void) putc('\n', stdout);
    746    0  stevel 		} else {
    747    0  stevel 			if((fi = fopen((*aptr)->r1.re1, "r")) == NULL)
    748    0  stevel 				continue;
    749    0  stevel 			while((t = getc(fi)) != EOF) {
    750    0  stevel 				c = t;
    751    0  stevel 				(void) putc(c, stdout);
    752    0  stevel 			}
    753    0  stevel 			(void) fclose(fi);
    754    0  stevel 		}
    755    0  stevel 	}
    756    0  stevel 	aptr = abuf;
    757    0  stevel 	*aptr = 0;
    758    0  stevel }
    759