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