static char sccsid[] = "@(#)expr.c.bad 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¨±);
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))