xref: /csrg-svn/old/sh/io.c (revision 18425)
114478Ssam #ifndef lint
2*18425Smckusick static char sccsid[] = "@(#)io.c	4.3 03/19/85";
314478Ssam #endif
46693Smckusick 
56693Smckusick #
66693Smckusick /*
76693Smckusick  * UNIX shell
86693Smckusick  *
96693Smckusick  * S. R. Bourne
106693Smckusick  * Bell Telephone Laboratories
116693Smckusick  *
126693Smckusick  */
136693Smckusick 
146693Smckusick #include	"defs.h"
156693Smckusick 
166693Smckusick 
176693Smckusick /* ========	input output and file copying ======== */
186693Smckusick 
initf(fd)196693Smckusick initf(fd)
206693Smckusick 	UFD		fd;
216693Smckusick {
226693Smckusick 	REG FILE	f=standin;
236693Smckusick 
246693Smckusick 	f->fdes=fd; f->fsiz=((flags&(oneflg|ttyflg))==0 ? BUFSIZ : 1);
256693Smckusick 	f->fnxt=f->fend=f->fbuf; f->feval=0; f->flin=1;
266693Smckusick 	f->feof=FALSE;
276693Smckusick }
286693Smckusick 
estabf(s)296693Smckusick estabf(s)
306693Smckusick 	REG STRING	s;
316693Smckusick {
326693Smckusick 	REG FILE	f;
336693Smckusick 
346693Smckusick 	(f=standin)->fdes = -1;
356693Smckusick 	f->fend=length(s)+(f->fnxt=s);
366693Smckusick 	f->flin=1;
376693Smckusick 	return(f->feof=(s==0));
386693Smckusick }
396693Smckusick 
push(af)406693Smckusick push(af)
416693Smckusick 	FILE		af;
426693Smckusick {
436693Smckusick 	REG FILE	f;
446693Smckusick 
456693Smckusick 	(f=af)->fstak=standin;
466693Smckusick 	f->feof=0; f->feval=0;
476693Smckusick 	standin=f;
486693Smckusick }
496693Smckusick 
pop()506693Smckusick pop()
516693Smckusick {
526693Smckusick 	REG FILE	f;
536693Smckusick 
546693Smckusick 	IF (f=standin)->fstak
556693Smckusick 	THEN	IF f->fdes>=0 THEN close(f->fdes) FI
566693Smckusick 		standin=f->fstak;
576693Smckusick 		return(TRUE);
586693Smckusick 	ELSE	return(FALSE);
596693Smckusick 	FI
606693Smckusick }
616693Smckusick 
chkpipe(pv)626693Smckusick chkpipe(pv)
636693Smckusick 	INT		*pv;
646693Smckusick {
656693Smckusick 	IF pipe(pv)<0 ORF pv[INPIPE]<0 ORF pv[OTPIPE]<0
666693Smckusick 	THEN	error(piperr);
676693Smckusick 	FI
686693Smckusick }
696693Smckusick 
chkopen(idf)706693Smckusick chkopen(idf)
716693Smckusick 	STRING		idf;
726693Smckusick {
736693Smckusick 	REG INT		rc;
746693Smckusick 
756693Smckusick 	IF (rc=open(idf,0))<0
766693Smckusick 	THEN	failed(idf,badopen);
776693Smckusick 	ELSE	return(rc);
786693Smckusick 	FI
796693Smckusick }
806693Smckusick 
rename(f1,f2)816693Smckusick rename(f1,f2)
826693Smckusick 	REG INT		f1, f2;
836693Smckusick {
846693Smckusick 	IF f1!=f2
85*18425Smckusick 	THEN	dup2(f1, f2);
866693Smckusick 		close(f1);
876693Smckusick 		IF f2==0 THEN ioset|=1 FI
886693Smckusick 	FI
896693Smckusick }
906693Smckusick 
create(s)916693Smckusick create(s)
926693Smckusick 	STRING		s;
936693Smckusick {
946693Smckusick 	REG INT		rc;
956693Smckusick 
966693Smckusick 	IF (rc=creat(s,0666))<0
976693Smckusick 	THEN	failed(s,badcreate);
986693Smckusick 	ELSE	return(rc);
996693Smckusick 	FI
1006693Smckusick }
1016693Smckusick 
tmpfil()1026693Smckusick tmpfil()
1036693Smckusick {
1046693Smckusick 	itos(serial++); movstr(numbuf,tmpnam);
1056693Smckusick 	return(create(tmpout));
1066693Smckusick }
1076693Smckusick 
1086693Smckusick /* set by trim */
1096693Smckusick BOOL		nosubst;
1106693Smckusick 
copy(ioparg)1116693Smckusick copy(ioparg)
1126693Smckusick 	IOPTR		ioparg;
1136693Smckusick {
1146693Smckusick 	CHAR		c, *ends;
1156693Smckusick 	REG CHAR	*cline, *clinep;
1166693Smckusick 	INT		fd;
1176693Smckusick 	REG IOPTR	iop;
1186693Smckusick 
1196693Smckusick 	IF iop=ioparg
1206693Smckusick 	THEN	copy(iop->iolst);
1216693Smckusick 		ends=mactrim(iop->ioname); IF nosubst THEN iop->iofile &= ~IODOC FI
1226693Smckusick 		fd=tmpfil();
1236693Smckusick 		iop->ioname=cpystak(tmpout);
1246693Smckusick 		iop->iolst=iotemp; iotemp=iop;
1256693Smckusick 		cline=locstak();
1266693Smckusick 
1276693Smckusick 		LOOP	clinep=cline; chkpr(NL);
1286693Smckusick 			WHILE (c = (nosubst ? readc() :  nextc(*ends)),  !eolchar(c)) DO *clinep++ = c OD
1296693Smckusick 			*clinep=0;
1306693Smckusick 			IF eof ORF eq(cline,ends) THEN break FI
1316693Smckusick 			*clinep++=NL;
1326693Smckusick 			write(fd,cline,clinep-cline);
1336693Smckusick 		POOL
1346693Smckusick 		close(fd);
1356693Smckusick 	FI
1366693Smckusick }
137