diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ cmd.c.orig cmd.c
--- cmd.c.orig	Fri Jun  4 02:51:01 2004
+++ cmd.c	Sat Jun 19 18:42:21 2004
@@ -10,17 +10,17 @@
 #include	"defs.h"
 #include	"sym.h"
 
-PROC IOPTR	inout();
-PROC VOID	chkword();
-PROC VOID	chksym();
-PROC TREPTR	term();
-PROC TREPTR	makelist();
-PROC TREPTR	list();
-PROC REGPTR	syncase();
-PROC TREPTR	item();
-PROC VOID	skipnl();
-PROC VOID	prsym();
-PROC VOID	synbad();
+LOCAL TREPTR	makelist(INT,TREPTR,TREPTR);
+LOCAL TREPTR	list(INT);
+LOCAL TREPTR	term(INT);
+LOCAL REGPTR	syncase(INT);
+LOCAL TREPTR	item(BOOL);
+LOCAL INT	skipnl(VOID);
+LOCAL IOPTR	inout(IOPTR);
+LOCAL VOID	chkword(VOID);
+LOCAL VOID	chksym(INT);
+LOCAL VOID	prsym(INT);
+LOCAL VOID	synbad(VOID);
 
 
 /* ========	command line decoding	========*/
@@ -34,8 +34,10 @@
 {
 	REG TREPTR	t;
 
-	t=getstak(FORKTYPE);
-	t->forktyp=flgs|TFORK; t->forktre=i; t->forkio=0;
+	t=(TREPTR) getstak(FORKTYPE);
+	t->forknod.forktyp=flgs|TFORK;
+	t->forknod.forktre=i;
+	t->forknod.forkio=0;
 	return(t);
 }
 
@@ -43,13 +45,14 @@
 	INT		type;
 	TREPTR		i, r;
 {
-	REG TREPTR	t;
+	REG TREPTR	t=NIL;			/* GCC */
 
 	IF i==0 ORF r==0
 	THEN	synbad();
-	ELSE	t = getstak(LSTTYPE);
-		t->lsttyp = type;
-		t->lstlef = i; t->lstrit = r;
+	ELSE	t=(TREPTR) getstak(LSTTYPE);
+		t->lstnod.lsttyp = type;
+		t->lstnod.lstlef = i;
+		t->lstnod.lstrit = r;
 	FI
 	return(t);
 }
@@ -85,10 +88,15 @@
 		THEN	i = makefork(FINT|FPRS|FAMP, i);
 		ELSE	synbad();
 		FI
+		/*FALLTHROUGH*/
 
 	    case ';':
-		IF e=cmd(sym,flg|MTFLG)
+		IF (e=cmd(sym,flg|MTFLG))!=NIL	/* GCC */
 		THEN	i=makelist(TLST, i, e);
+#if defined(SYSIII)
+		ELIF	i == 0
+		THEN	synbad();
+#endif
 		FI
 		break;
 
@@ -96,6 +104,7 @@
 		IF sym==NL
 		THEN	break;
 		FI
+		/*FALLTHROUGH*/
 
 	    default:
 		IF sym
@@ -114,6 +123,7 @@
  */
 
 LOCAL TREPTR	list(flg)
+	INT		flg;
 {
 	REG TREPTR	r;
 	REG INT		b;
@@ -132,6 +142,7 @@
  */
 
 LOCAL TREPTR	term(flg)
+	INT		flg;
 {
 	REG TREPTR	t;
 
@@ -153,7 +164,7 @@
 	skipnl();
 	IF wdval==esym
 	THEN	return(0);
-	ELSE	REG REGPTR	r=getstak(REGTYPE);
+	ELSE	REG REGPTR	r=(REGPTR) getstak(REGTYPE);
 		r->regptr=0;
 		LOOP wdarg->argnxt=r->regptr;
 		     r->regptr=wdarg;
@@ -201,54 +212,54 @@
 
 	    case CASYM:
 		BEGIN
-		   t=getstak(SWTYPE);
+		   t=(TREPTR) getstak(SWTYPE);
 		   chkword();
-		   t->swarg=wdarg->argval;
+		   t->swnod.swarg=wdarg->argval;
 		   skipnl(); chksym(INSYM|BRSYM);
-		   t->swlst=syncase(wdval==INSYM?ESSYM:KTSYM);
-		   t->swtyp=TSW;
+		   t->swnod.swlst=syncase(wdval==INSYM?ESSYM:KTSYM);
+		   t->swnod.swtyp=TSW;
 		   break;
 		END
 
 	    case IFSYM:
 		BEGIN
 		   REG INT	w;
-		   t=getstak(IFTYPE);
-		   t->iftyp=TIF;
-		   t->iftre=cmd(THSYM,NLFLG);
-		   t->thtre=cmd(ELSYM|FISYM|EFSYM,NLFLG);
-		   t->eltre=((w=wdval)==ELSYM ? cmd(FISYM,NLFLG) : (w==EFSYM ? (wdval=IFSYM, item(0)) : 0));
+		   t=(TREPTR) getstak(IFTYPE);
+		   t->ifnod.iftyp=TIF;
+		   t->ifnod.iftre=cmd(THSYM,NLFLG);
+		   t->ifnod.thtre=cmd(ELSYM|FISYM|EFSYM,NLFLG);
+		   t->ifnod.eltre=((w=wdval)==ELSYM ? cmd(FISYM,NLFLG) : (w==EFSYM ? (wdval=IFSYM, item(0)) : 0));
 		   IF w==EFSYM THEN return(t) FI
 		   break;
 		END
 
 	    case FORSYM:
 		BEGIN
-		   t=getstak(FORTYPE);
-		   t->fortyp=TFOR;
-		   t->forlst=0;
+		   t=(TREPTR) getstak(FORTYPE);
+		   t->fornod.fortyp=TFOR;
+		   t->fornod.forlst=0;
 		   chkword();
-		   t->fornam=wdarg->argval;
+		   t->fornod.fornam=wdarg->argval;
 		   IF skipnl()==INSYM
 		   THEN	chkword();
-			t->forlst=item(0);
+			t->fornod.forlst=(COMPTR) item(0);
 			IF wdval!=NL ANDF wdval!=';'
 			THEN	synbad();
 			FI
 			chkpr(wdval); skipnl();
 		   FI
 		   chksym(DOSYM|BRSYM);
-		   t->fortre=cmd(wdval==DOSYM?ODSYM:KTSYM,NLFLG);
+		   t->fornod.fortre=cmd(wdval==DOSYM?ODSYM:KTSYM,NLFLG);
 		   break;
 		END
 
 	    case WHSYM:
 	    case UNSYM:
 		BEGIN
-		   t=getstak(WHTYPE);
-		   t->whtyp=(wdval==WHSYM ? TWH : TUN);
-		   t->whtre = cmd(DOSYM,NLFLG);
-		   t->dotre = cmd(ODSYM,NLFLG);
+		   t=(TREPTR) getstak(WHTYPE);
+		   t->whnod.whtyp=(wdval==WHSYM ? TWH : TUN);
+		   t->whnod.whtre = cmd(DOSYM,NLFLG);
+		   t->whnod.dotre = cmd(ODSYM,NLFLG);
 		   break;
 		END
 
@@ -259,10 +270,10 @@
 	    case '(':
 		BEGIN
 		   REG PARPTR	 p;
-		   p=getstak(PARTYPE);
+		   p=(PARPTR) getstak(PARTYPE);
 		   p->partre=cmd(')',NLFLG);
 		   p->partyp=TPAR;
-		   t=makefork(0,p);
+		   t=makefork(0,(TREPTR) p);
 		   break;
 		END
 
@@ -270,6 +281,7 @@
 		IF io==0
 		THEN	return(0);
 		FI
+		/*FALLTHROUGH*/
 
 	    case 0:
 		BEGIN
@@ -277,35 +289,37 @@
 		   REG ARGPTR	*argtail;
 		   REG ARGPTR	*argset=0;
 		   INT		keywd=1;
-		   t=getstak(COMTYPE);
-		   t->comio=io; /*initial io chain*/
-		   argtail = &(t->comarg);
+		   t=(TREPTR) getstak(COMTYPE);
+		   t->comnod.comio=io; /*initial io chain*/
+		   argtail = &(t->comnod.comarg);
 		   WHILE wdval==0
 		   DO	argp = wdarg;
 			IF wdset ANDF keywd
-			THEN	argp->argnxt=argset; argset=argp;
+			THEN	argp->argnxt=(ARGPTR) argset; argset=(ARGPTR *) argp;
 			ELSE	*argtail=argp; argtail = &(argp->argnxt); keywd=flags&keyflg;
 			FI
 			word();
 			IF flag
-			THEN t->comio=inout(t->comio);
+			THEN t->comnod.comio=inout(t->comnod.comio);
 			FI
 		   OD
 
-		   t->comtyp=TCOM; t->comset=argset; *argtail=0;
+		   t->comnod.comtyp=TCOM;
+		   t->comnod.comset=(ARGPTR) argset;
+		   *argtail=0;
 		   return(t);
 		END
 
 	ENDSW
 	reserv++; word();
-	IF io=inout(io)
-	THEN	t=makefork(0,t); t->treio=io;
+	IF (io=inout(io))!=NIL
+	THEN	t=makefork(0,t); t->treio.treio=io;
 	FI
 	return(t);
 }
 
 
-LOCAL VOID	skipnl()
+LOCAL INT	skipnl()
 {
 	WHILE (reserv++, word()==NL) DO chkpr(NL) OD
 	return(wdval);
@@ -316,27 +330,33 @@
 {
 	REG INT		iof;
 	REG IOPTR	iop;
-	REG CHAR	c;
+	REG INT		c;
 
 	iof=wdnum;
 
 	SWITCH wdval IN
 
 	    case DOCSYM:
+		/*	<<	*/
 		iof |= IODOC; break;
+		/*FALLTHROUGH*/
 
 	    case APPSYM:
+	        /*	>>	*/
 	    case '>':
 		IF wdnum==0 THEN iof |= 1 FI
 		iof |= IOPUT;
 		IF wdval==APPSYM
 		THEN	iof |= IOAPP; break;
 		FI
+		/*FALLTHROUGH*/
 
 	    case '<':
 		IF (c=nextc(0))=='&'
 		THEN	iof |= IOMOV;
 		ELIF c=='>'
+		/*	<> is open for read and write	*/
+		/*	unadvertised feature		*/
 		THEN	iof |= IORDW;
 		ELSE	peekc=c|MARK;
 		FI
@@ -347,7 +367,7 @@
 	ENDSW
 
 	chkword();
-	iop=getstak(IOTYPE); iop->ioname=wdarg->argval; iop->iofile=iof;
+	iop=(IOPTR) getstak(IOTYPE); iop->ioname=wdarg->argval; iop->iofile=iof;
 	IF iof&IODOC
 	THEN iop->iolst=iopend; iopend=iop;
 	FI
@@ -363,6 +383,7 @@
 }
 
 LOCAL VOID	chksym(sym)
+	INT		sym;
 {
 	REG INT		x = sym&wdval;
 	IF ((x&SYMFLG) ? x : sym) != wdval
@@ -371,6 +392,7 @@
 }
 
 LOCAL VOID	prsym(sym)
+	INT		sym;
 {
 	IF sym&SYMFLG
 	THEN	REG SYSPTR	sp=reserved;
@@ -382,7 +404,7 @@
 	THEN	prs(endoffile);
 	ELSE	IF sym&SYMREP THEN prc(sym) FI
 		IF sym==NL
-		THEN	prs("newline");
+		THEN	prs(endofline);
 		ELSE	prc(sym);
 		FI
 	FI
@@ -392,7 +414,7 @@
 {
 	prp(); prs(synmsg);
 	IF (flags&ttyflg)==0
-	THEN	prs(atline); prn(standin->flin);
+	THEN	prs(atline); prn((INT) standin->flin);
 	FI
 	prs(colon);
 	prc(LQ);
@@ -403,4 +425,5 @@
 	prc(RQ); prs(unexpected);
 	newline();
 	exitsh(SYNBAD);
+	/*NOTREACHED*/
 }