freebsd-ports/shells/v7sh/files/patch-cmd.c
Pav Lucistnik 6b787b91fc Add v7sh, the original Steve R. Bourne shell from the 7th edition Unix including
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>
2004-06-22 08:24:19 +00:00

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*/
}