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