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