1*14478Ssam #ifndef lint 2*14478Ssam static char sccsid[] = "@(#)io.c 4.2 08/11/83"; 3*14478Ssam #endif 46693Smckusick 56693Smckusick # 66693Smckusick /* 76693Smckusick * UNIX shell 86693Smckusick * 96693Smckusick * S. R. Bourne 106693Smckusick * Bell Telephone Laboratories 116693Smckusick * 126693Smckusick */ 136693Smckusick 146693Smckusick #include "defs.h" 156693Smckusick #include "dup.h" 166693Smckusick 176693Smckusick 186693Smckusick /* ======== input output and file copying ======== */ 196693Smckusick 206693Smckusick initf(fd) 216693Smckusick UFD fd; 226693Smckusick { 236693Smckusick REG FILE f=standin; 246693Smckusick 256693Smckusick f->fdes=fd; f->fsiz=((flags&(oneflg|ttyflg))==0 ? BUFSIZ : 1); 266693Smckusick f->fnxt=f->fend=f->fbuf; f->feval=0; f->flin=1; 276693Smckusick f->feof=FALSE; 286693Smckusick } 296693Smckusick 306693Smckusick estabf(s) 316693Smckusick REG STRING s; 326693Smckusick { 336693Smckusick REG FILE f; 346693Smckusick 356693Smckusick (f=standin)->fdes = -1; 366693Smckusick f->fend=length(s)+(f->fnxt=s); 376693Smckusick f->flin=1; 386693Smckusick return(f->feof=(s==0)); 396693Smckusick } 406693Smckusick 416693Smckusick push(af) 426693Smckusick FILE af; 436693Smckusick { 446693Smckusick REG FILE f; 456693Smckusick 466693Smckusick (f=af)->fstak=standin; 476693Smckusick f->feof=0; f->feval=0; 486693Smckusick standin=f; 496693Smckusick } 506693Smckusick 516693Smckusick pop() 526693Smckusick { 536693Smckusick REG FILE f; 546693Smckusick 556693Smckusick IF (f=standin)->fstak 566693Smckusick THEN IF f->fdes>=0 THEN close(f->fdes) FI 576693Smckusick standin=f->fstak; 586693Smckusick return(TRUE); 596693Smckusick ELSE return(FALSE); 606693Smckusick FI 616693Smckusick } 626693Smckusick 636693Smckusick chkpipe(pv) 646693Smckusick INT *pv; 656693Smckusick { 666693Smckusick IF pipe(pv)<0 ORF pv[INPIPE]<0 ORF pv[OTPIPE]<0 676693Smckusick THEN error(piperr); 686693Smckusick FI 696693Smckusick } 706693Smckusick 716693Smckusick chkopen(idf) 726693Smckusick STRING idf; 736693Smckusick { 746693Smckusick REG INT rc; 756693Smckusick 766693Smckusick IF (rc=open(idf,0))<0 776693Smckusick THEN failed(idf,badopen); 786693Smckusick ELSE return(rc); 796693Smckusick FI 806693Smckusick } 816693Smckusick 826693Smckusick rename(f1,f2) 836693Smckusick REG INT f1, f2; 846693Smckusick { 856693Smckusick IF f1!=f2 866693Smckusick THEN dup(f1|DUPFLG, f2); 876693Smckusick close(f1); 886693Smckusick IF f2==0 THEN ioset|=1 FI 896693Smckusick FI 906693Smckusick } 916693Smckusick 926693Smckusick create(s) 936693Smckusick STRING s; 946693Smckusick { 956693Smckusick REG INT rc; 966693Smckusick 976693Smckusick IF (rc=creat(s,0666))<0 986693Smckusick THEN failed(s,badcreate); 996693Smckusick ELSE return(rc); 1006693Smckusick FI 1016693Smckusick } 1026693Smckusick 1036693Smckusick tmpfil() 1046693Smckusick { 1056693Smckusick itos(serial++); movstr(numbuf,tmpnam); 1066693Smckusick return(create(tmpout)); 1076693Smckusick } 1086693Smckusick 1096693Smckusick /* set by trim */ 1106693Smckusick BOOL nosubst; 1116693Smckusick 1126693Smckusick copy(ioparg) 1136693Smckusick IOPTR ioparg; 1146693Smckusick { 1156693Smckusick CHAR c, *ends; 1166693Smckusick REG CHAR *cline, *clinep; 1176693Smckusick INT fd; 1186693Smckusick REG IOPTR iop; 1196693Smckusick 1206693Smckusick IF iop=ioparg 1216693Smckusick THEN copy(iop->iolst); 1226693Smckusick ends=mactrim(iop->ioname); IF nosubst THEN iop->iofile &= ~IODOC FI 1236693Smckusick fd=tmpfil(); 1246693Smckusick iop->ioname=cpystak(tmpout); 1256693Smckusick iop->iolst=iotemp; iotemp=iop; 1266693Smckusick cline=locstak(); 1276693Smckusick 1286693Smckusick LOOP clinep=cline; chkpr(NL); 1296693Smckusick WHILE (c = (nosubst ? readc() : nextc(*ends)), !eolchar(c)) DO *clinep++ = c OD 1306693Smckusick *clinep=0; 1316693Smckusick IF eof ORF eq(cline,ends) THEN break FI 1326693Smckusick *clinep++=NL; 1336693Smckusick write(fd,cline,clinep-cline); 1346693Smckusick POOL 1356693Smckusick close(fd); 1366693Smckusick FI 1376693Smckusick } 138