xref: /csrg-svn/old/sh/io.c (revision 6693)
1*6693Smckusick /*	io.c	4.1	82/05/07	*/
2*6693Smckusick 
3*6693Smckusick #
4*6693Smckusick /*
5*6693Smckusick  * UNIX shell
6*6693Smckusick  *
7*6693Smckusick  * S. R. Bourne
8*6693Smckusick  * Bell Telephone Laboratories
9*6693Smckusick  *
10*6693Smckusick  */
11*6693Smckusick 
12*6693Smckusick #include	"defs.h"
13*6693Smckusick #include	"dup.h"
14*6693Smckusick 
15*6693Smckusick 
16*6693Smckusick /* ========	input output and file copying ======== */
17*6693Smckusick 
18*6693Smckusick initf(fd)
19*6693Smckusick 	UFD		fd;
20*6693Smckusick {
21*6693Smckusick 	REG FILE	f=standin;
22*6693Smckusick 
23*6693Smckusick 	f->fdes=fd; f->fsiz=((flags&(oneflg|ttyflg))==0 ? BUFSIZ : 1);
24*6693Smckusick 	f->fnxt=f->fend=f->fbuf; f->feval=0; f->flin=1;
25*6693Smckusick 	f->feof=FALSE;
26*6693Smckusick }
27*6693Smckusick 
28*6693Smckusick estabf(s)
29*6693Smckusick 	REG STRING	s;
30*6693Smckusick {
31*6693Smckusick 	REG FILE	f;
32*6693Smckusick 
33*6693Smckusick 	(f=standin)->fdes = -1;
34*6693Smckusick 	f->fend=length(s)+(f->fnxt=s);
35*6693Smckusick 	f->flin=1;
36*6693Smckusick 	return(f->feof=(s==0));
37*6693Smckusick }
38*6693Smckusick 
39*6693Smckusick push(af)
40*6693Smckusick 	FILE		af;
41*6693Smckusick {
42*6693Smckusick 	REG FILE	f;
43*6693Smckusick 
44*6693Smckusick 	(f=af)->fstak=standin;
45*6693Smckusick 	f->feof=0; f->feval=0;
46*6693Smckusick 	standin=f;
47*6693Smckusick }
48*6693Smckusick 
49*6693Smckusick pop()
50*6693Smckusick {
51*6693Smckusick 	REG FILE	f;
52*6693Smckusick 
53*6693Smckusick 	IF (f=standin)->fstak
54*6693Smckusick 	THEN	IF f->fdes>=0 THEN close(f->fdes) FI
55*6693Smckusick 		standin=f->fstak;
56*6693Smckusick 		return(TRUE);
57*6693Smckusick 	ELSE	return(FALSE);
58*6693Smckusick 	FI
59*6693Smckusick }
60*6693Smckusick 
61*6693Smckusick chkpipe(pv)
62*6693Smckusick 	INT		*pv;
63*6693Smckusick {
64*6693Smckusick 	IF pipe(pv)<0 ORF pv[INPIPE]<0 ORF pv[OTPIPE]<0
65*6693Smckusick 	THEN	error(piperr);
66*6693Smckusick 	FI
67*6693Smckusick }
68*6693Smckusick 
69*6693Smckusick chkopen(idf)
70*6693Smckusick 	STRING		idf;
71*6693Smckusick {
72*6693Smckusick 	REG INT		rc;
73*6693Smckusick 
74*6693Smckusick 	IF (rc=open(idf,0))<0
75*6693Smckusick 	THEN	failed(idf,badopen);
76*6693Smckusick 	ELSE	return(rc);
77*6693Smckusick 	FI
78*6693Smckusick }
79*6693Smckusick 
80*6693Smckusick rename(f1,f2)
81*6693Smckusick 	REG INT		f1, f2;
82*6693Smckusick {
83*6693Smckusick 	IF f1!=f2
84*6693Smckusick 	THEN	dup(f1|DUPFLG, f2);
85*6693Smckusick 		close(f1);
86*6693Smckusick 		IF f2==0 THEN ioset|=1 FI
87*6693Smckusick 	FI
88*6693Smckusick }
89*6693Smckusick 
90*6693Smckusick create(s)
91*6693Smckusick 	STRING		s;
92*6693Smckusick {
93*6693Smckusick 	REG INT		rc;
94*6693Smckusick 
95*6693Smckusick 	IF (rc=creat(s,0666))<0
96*6693Smckusick 	THEN	failed(s,badcreate);
97*6693Smckusick 	ELSE	return(rc);
98*6693Smckusick 	FI
99*6693Smckusick }
100*6693Smckusick 
101*6693Smckusick tmpfil()
102*6693Smckusick {
103*6693Smckusick 	itos(serial++); movstr(numbuf,tmpnam);
104*6693Smckusick 	return(create(tmpout));
105*6693Smckusick }
106*6693Smckusick 
107*6693Smckusick /* set by trim */
108*6693Smckusick BOOL		nosubst;
109*6693Smckusick 
110*6693Smckusick copy(ioparg)
111*6693Smckusick 	IOPTR		ioparg;
112*6693Smckusick {
113*6693Smckusick 	CHAR		c, *ends;
114*6693Smckusick 	REG CHAR	*cline, *clinep;
115*6693Smckusick 	INT		fd;
116*6693Smckusick 	REG IOPTR	iop;
117*6693Smckusick 
118*6693Smckusick 	IF iop=ioparg
119*6693Smckusick 	THEN	copy(iop->iolst);
120*6693Smckusick 		ends=mactrim(iop->ioname); IF nosubst THEN iop->iofile &= ~IODOC FI
121*6693Smckusick 		fd=tmpfil();
122*6693Smckusick 		iop->ioname=cpystak(tmpout);
123*6693Smckusick 		iop->iolst=iotemp; iotemp=iop;
124*6693Smckusick 		cline=locstak();
125*6693Smckusick 
126*6693Smckusick 		LOOP	clinep=cline; chkpr(NL);
127*6693Smckusick 			WHILE (c = (nosubst ? readc() :  nextc(*ends)),  !eolchar(c)) DO *clinep++ = c OD
128*6693Smckusick 			*clinep=0;
129*6693Smckusick 			IF eof ORF eq(cline,ends) THEN break FI
130*6693Smckusick 			*clinep++=NL;
131*6693Smckusick 			write(fd,cline,clinep-cline);
132*6693Smckusick 		POOL
133*6693Smckusick 		close(fd);
134*6693Smckusick 	FI
135*6693Smckusick }
136