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