static char sccsid
[] = "@(#)cmd.c 4.2 8/11/83";
* Bell Telephone Laboratories
/* ======== command line decoding ========*/
t
->forktyp
=flgs
|TFORK
; t
->forktre
=i
; t
->forkio
=0;
LOCAL TREPTR
makelist(type
,i
,r
)
ELSE t
= getstak(LSTTYPE
);
t
->lstlef
= i
; t
->lstrit
= r
;
THEN wdval
=';'; chkpr(NL
);
ELIF i
==0 ANDF (flg
&MTFLG
)==0
THEN i
= makefork(FINT
|FPRS
|FAMP
, i
);
THEN i
=makelist(TLST
, i
, e
);
WHILE r
ANDF ((b
=(wdval
==ANDFSYM
)) ORF wdval
==ORFSYM
)
DO r
= makelist((b
? TAND
: TORF
), r
, term(NLFLG
));
IF (t
=item(TRUE
)) ANDF (wdval
=='^' ORF wdval
=='|')
THEN
return(makelist(TFIL
, makefork(FPOU
,t
), makefork(FPIN
|FPCL
,term(NLFLG
))));
LOCAL REGPTR
syncase(esym
)
ELSE REG REGPTR r
=getstak(REGTYPE
);
LOOP wdarg
->argnxt
=r
->regptr
;
IF wdval
ORF ( word()!=')' ANDF wdval
!='|' )
r
->regcom
=cmd(0,NLFLG
|MTFLG
);
THEN r
->regnxt
=syncase(esym
);
* ( cmd ) [ < in ] [ > out ]
* word word* [ < in ] [ > out ]
* if ... then ... else ... fi
* for ... while ... do ... done
skipnl(); chksym(INSYM
|BRSYM
);
t
->swlst
=syncase(wdval
==INSYM
?ESSYM
:KTSYM
);
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));
IF w
==EFSYM THEN
return(t
) FI
IF wdval
!=NL ANDF wdval
!=';'
t
->fortre
=cmd(wdval
==DOSYM
?ODSYM
:KTSYM
,NLFLG
);
t
->whtyp
=(wdval
==WHSYM
? TWH
: TUN
);
t
->whtre
= cmd(DOSYM
,NLFLG
);
t
->dotre
= cmd(ODSYM
,NLFLG
);
p
->partre
=cmd(')',NLFLG
);
t
->comio
=io
; /*initial io chain*/
THEN argp
->argnxt
=argset
; argset
=argp
;
ELSE
*argtail
=argp
; argtail
= &(argp
->argnxt
); keywd
=flags
&keyflg
;
THEN t
->comio
=inout(t
->comio
);
t
->comtyp
=TCOM
; t
->comset
=argset
; *argtail
=0;
THEN t
=makefork(0,t
); t
->treio
=io
;
WHILE (reserv
++, word()==NL
) DO
chkpr(NL
) OD
LOCAL IOPTR
inout(lastio
)
IF wdnum
==0 THEN iof
|= 1 FI
THEN iof
|= IOAPP
; break;
iop
=getstak(IOTYPE
); iop
->ioname
=wdarg
->argval
; iop
->iofile
=iof
;
THEN iop
->iolst
=iopend
; iopend
=iop
;
word(); iop
->ionxt
=inout(lastio
);
IF ((x
&SYMFLG
) ? x
: sym
) != wdval
THEN REG SYSPTR sp
=reserved
;
ELSE IF sym
&SYMREP THEN
prc(sym
) FI
THEN
prs(atline
); prn(standin
->flin
);
prc(RQ
); prs(unexpected
);