6b787b91fc
System III, 4.3BSD-Reno, Ultrix 3.1 and `home made'' fixes and enhancements PR: ports/68127 Submitted by: Cyrille Lefevre <cyrille.lefevre@laposte.net>
340 lines
7.1 KiB
C
340 lines
7.1 KiB
C
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*/
|
|
}
|