diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ io.c.orig io.c
--- io.c.orig	Fri Jun  4 02:51:01 2004
+++ io.c	Sat Jun 19 18:42:22 2004
@@ -8,25 +8,34 @@
  */
 
 #include	"defs.h"
-#include	"dup.h"
+
+IOPTR		iotemp;
+IOPTR		iopend;
+INT		stripflg;
+/* set by trim */
+BOOL		nosubst;
 
 
 /* ========	input output and file copying ======== */
 
-initf(fd)
+VOID	initf(fd)
 	UFD		fd;
 {
-	REG FILE	f=standin;
+	REG FILEPTR	f=standin;
 
+#if defined(SYSIII)
+	f->fdes=fd; f->fsiz=((flags&oneflg)==0 ? BUFSIZ : 1);
+#else /* V7 */
 	f->fdes=fd; f->fsiz=((flags&(oneflg|ttyflg))==0 ? BUFSIZ : 1);
+#endif
 	f->fnxt=f->fend=f->fbuf; f->feval=0; f->flin=1;
 	f->feof=FALSE;
 }
 
-estabf(s)
+INT	estabf(s)
 	REG STRING	s;
 {
-	REG FILE	f;
+	REG FILEPTR	f;
 
 	(f=standin)->fdes = -1;
 	f->fend=length(s)+(f->fnxt=s);
@@ -34,19 +43,19 @@
 	return(f->feof=(s==0));
 }
 
-push(af)
-	FILE		af;
+VOID	push(af)
+	FILEPTR		af;
 {
-	REG FILE	f;
+	REG FILEPTR	f;
 
 	(f=af)->fstak=standin;
 	f->feof=0; f->feval=0;
 	standin=f;
 }
 
-pop()
+INT	pop()
 {
-	REG FILE	f;
+	REG FILEPTR	f;
 
 	IF (f=standin)->fstak
 	THEN	IF f->fdes>=0 THEN close(f->fdes) FI
@@ -56,64 +65,66 @@
 	FI
 }
 
-chkpipe(pv)
+VOID	chkpipe(pv)
 	INT		*pv;
 {
 	IF pipe(pv)<0 ORF pv[INPIPE]<0 ORF pv[OTPIPE]<0
 	THEN	error(piperr);
+		/*NOTREACHED*/
 	FI
 }
 
-chkopen(idf)
-	STRING		idf;
+INT	chkopen(idf)
+	CSTRING		idf;
 {
 	REG INT		rc;
 
-	IF (rc=open(idf,0))<0
+	IF (rc=open(idf,O_RDONLY))<0
 	THEN	failed(idf,badopen);
-	ELSE	return(rc);
+		/*NOTREACHED*/
 	FI
+	return(rc);
 }
 
-rename(f1,f2)
+VOID	rename(f1,f2)
 	REG INT		f1, f2;
 {
 	IF f1!=f2
-	THEN	dup(f1|DUPFLG, f2);
+	THEN	dup2(f1, f2);
 		close(f1);
 		IF f2==0 THEN ioset|=1 FI
 	FI
 }
 
-create(s)
+INT	create(s)
 	STRING		s;
 {
 	REG INT		rc;
 
 	IF (rc=creat(s,0666))<0
 	THEN	failed(s,badcreate);
-	ELSE	return(rc);
+		/*NOTREACHED*/
 	FI
+	return(rc);
 }
 
-tmpfil()
+INT	tmpfil()
 {
 	itos(serial++); movstr(numbuf,tmpnam);
 	return(create(tmpout));
 }
 
-/* set by trim */
-BOOL		nosubst;
 
-copy(ioparg)
+VOID	copy(ioparg)
 	IOPTR		ioparg;
 {
-	CHAR		c, *ends;
-	REG CHAR	*cline, *clinep;
+	INT		c;
+	STRING		ends;
+	REG STRING	cline, clinep;
 	INT		fd;
 	REG IOPTR	iop;
 
-	IF iop=ioparg
+	IF (iop=ioparg)!=NIL			/* GCC */
 	THEN	copy(iop->iolst);
 		ends=mactrim(iop->ioname); IF nosubst THEN iop->iofile &= ~IODOC FI
 		fd=tmpfil();
@@ -121,13 +132,36 @@
 		iop->iolst=iotemp; iotemp=iop;
 		cline=locstak();
 
+#if defined(SYSIII)
+		IF stripflg
+		THEN	WHILE *ends=='\t' DO ends++ OD
+		FI
+#endif
 		LOOP	clinep=cline; chkpr(NL);
+#if defined(SYSIII)
+			IF stripflg
+			THEN
+				WHILE (c=(nosubst ? readc() : nextc(*ends)), !eolchar(c))
+				&& cline == clinep && c == '\t' DONE
+				WHILE (!eolchar(c))
+				DO
+					*clinep++=c;
+					c=(nosubst ? readc() : nextc(*ends));
+				OD
+			ELSE
+#endif
 			WHILE (c = (nosubst ? readc() :  nextc(*ends)),  !eolchar(c)) DO *clinep++ = c OD
+#if defined(SYSIII)
+			FI
+#endif
 			*clinep=0;
 			IF eof ORF eq(cline,ends) THEN break FI
 			*clinep++=NL;
-			write(fd,cline,clinep-cline);
+			write(fd,cline,(SIZE) (clinep-cline));
 		POOL
+#if defined(SYSIII)
+		IF stripflg THEN stripflg-- FI
+#endif
 		close(fd);
 	FI
 }