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