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