static char sccsid
[] = "@(#)expr.c 4.5 %G%";
{ /* term | term dyadic expr | */
switch ((int)readchar()) {
term(a
|1); expv
+= lhs
; break;
term(a
|1); expv
= lhs
- expv
; break;
term(a
|1); expv
= round(lhs
,expv
); break;
term(a
|1); expv
*= lhs
; break;
term(a
|1); expv
= lhs
/expv
; break;
term(a
|1); expv
&= lhs
; break;
term(a
|1); expv
|= lhs
; break;
IF (a
&2)==0 THEN
error(BADKET
); FI
{ /* item | monadic item | (expr) | */
switch ((int)readchar()) {
term(a
|1); expv
=chkget(expv
,DSP
); return(1);
term(a
|1); expv
=chkget(expv
,ISP
); return(1);
term(a
|1); expv
= -expv
; return(1);
term(a
|1); expv
= ~expv
; return(1);
term(a
|1); expv
= !expv
; return(1);
{ /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
register struct nlist
*symp
;
THEN frame
= *(ADDR
*)(((ADDR
)&u
)+FP
); lastframe
=0;
callpc
= *(ADDR
*)(((ADDR
)&u
)+PC
);
IF
eqsym(cursym
->n_un
.n_name
,isymbol
,'~')
callpc
=get(frame
+16, DSP
);
frame
=get(frame
+12,DSP
)&EVEN
;
savlastf
=lastframe
; savframe
=frame
;
ELIF (symp
=lookup(isymbol
))==0 THEN
error(BADSYM
);
ELSE expv
= symp
->n_value
;
THEN lastframe
=savlastf
; callpc
=savpc
;
THEN expv
=inkdot(dotinc
);
THEN expv
=inkdot(-dotinc
);
THEN IF kcore THEN expv
= *(int *)regptr
;
ELSE expv
= * (ADDR
*)(((ADDR
)&u
)+regptr
); FI
ELIF (base
=varchk(savc
)) != -1
THEN expv
= (expv
<< 8) | lastc
;
/* service routines for expression reading */
getnum(rdf
) int (*rdf
)();
UNION
{REAL r
; L_INT i
;} real
;
IF
isdigit(lastc
) ORF (hex
=TRUE
, lastc
=='#' ANDF
isxdigit((*rdf
)()))
base
= (hex
? 16 : radix
);
WHILE (base
>10 ? isxdigit(lastc
) : isdigit(lastc
))
DO expv
= (base
==16 ? expv
<<4 : expv
*base
);
IF (d
=convdig(lastc
))>=base THEN
error(BADSYN
); FI
THEN
IF (lastc
=='x' ORF lastc
=='X')
THEN hex
=TRUE
; base
=16; (*rdf
)();
ELIF (lastc
=='t' ORF lastc
=='T')
THEN hex
=FALSE
; base
=10; (*rdf
)();
ELIF (lastc
=='o' ORF lastc
=='O')
THEN hex
=FALSE
; base
=8; (*rdf
)();
IF lastc
=='.' ANDF (base
==10 ORF expv
==0) ANDF
!hex
THEN real
.r
=expv
; frpt
=0; base
=10;
DO real
.r
*= base
; frpt
++;
REP IF p
< &isymbol
[sizeof(isymbol
)-1]
IF lastc
=='\\' THEN
readchar(); return(TRUE
); FI
return( isalpha(lastc
) ORF lastc
=='_' ORF dig ANDF
isdigit(lastc
) );
IF
isdigit(name
) THEN
return(name
-'0'); FI
IF
isalpha(name
) THEN
return((name
&037)-1+10); FI
REP IF
localsym(frame
)==0 THEN
error(BADLOC
); FI
PER
!eqsym(cursym
->n_un
.n_name
,isymbol
,'~') DONE
if (*s1
== c
&& !strcmp(s1
+1, s2
))