date and time created 82/05/07 19:37:44 by mckusick
[unix-history] / usr / src / old / sh / io.c
CommitLineData
ce24f27d
KM
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
18initf(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
28estabf(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
39push(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
49pop()
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
61chkpipe(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
69chkopen(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
80rename(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
90create(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
101tmpfil()
102{
103 itos(serial++); movstr(numbuf,tmpnam);
104 return(create(tmpout));
105}
106
107/* set by trim */
108BOOL nosubst;
109
110copy(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}