#include "defs.h" /* * input output library * * S. R. Bourne * Bell Telephone Laboratories * */ openf(f, idf, chan) FILEPTR f; STRING idf; STRING chan; { UFD r; IF any('r', chan) THEN IF idf==nil(STRING) ORF *idf==0 THEN r = dup(0); ELSE r = open(idf, 0); FI f->fstatus = F_READING; f->flin=1; f->fnxt=f->fbuf; f->fend=f->fbuf; ELIF any('w', chan) THEN IF idf==nil(STRING) ORF *idf==0 THEN r = dup(1); ELSE r=open(idf, 1); IF r<0 ANDF any('c', chan) THEN r=creat(idf, 0666); FI FI f->fstatus = F_WRITING; f->flin=1; f->fnxt=f->fbuf; f->fend=f->fbuf+F_BUFSIZ; ELIF any('c', chan) THEN r=creat(idf,0666); ELSE r = -1; FI f->fdes = r; f->fsiz = F_BUFSIZ; return(r); } initf(f, fd) REG FILEPTR f; UFD fd; { f->fdes=fd; f->fsiz=F_BUFSIZ; f->fnxt=f->fend=f->fbuf; f->flin=1; f->fstatus=F_READING; } estabf(f, s) REG FILEPTR f; REG STRING s; { f->fdes = -1; f->fend=upbstr(s)+(f->fnxt=s); f->flin=1; f->fstatus=F_READING; IF s==nil(STRING) THEN f->fstatus |= F_EOF; FI return(s==0); } pushf(af) FILEPTR af; { REG FILEPTR f; (f=af)->fstak=standin; standin=f; } popf() { REG FILEPTR f; IF (f=standin)->fstak THEN IF f->fdes>=0 THEN close(f->fdes); FI standin=f->fstak; return(TRUE); ELSE return(FALSE); FI } linepos(f) FILEPTR f; { return(f->flin); } setline(f) FILEPTR f; { f->flin=1; } closef(f) FILEPTR f; { IF f->fdes >= 0 THEN close(f->fdes); f->fdes = -1; FI } setfile(f, tab) FILEPTR f; CHAR *tab; { /* set up translation table for file */ f->ftab=tab; } charpos(f) REG FILEPTR f; { return(f->fnxt-f->fbuf); } setmode(f, s) FILEPTR f; STRING s; { /* set mode for output * t => convert tabs * s => strip blanks * u => upper case output only */ REG CHAR c; WHILE c = *s++ DO SWITCH c IN case 't': f->fstatus |= F_TABCVT; break; case 's': f->fstatus |= F_SBLANK; break; case 'u': f->fstatus |= F_UPPER; break; ENDSW OD }