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