BSD 4 release
[unix-history] / usr / src / cmd / adb / expr.c
index e73b325..c0b9f94 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 #include "defs.h"
  */
 
 #include "defs.h"
-
+static char sccsid[] = "%Z%%M% %I% %G%";
 
 MSG            BADSYM;
 MSG            BADVAR;
 
 MSG            BADSYM;
 MSG            BADVAR;
@@ -16,23 +16,21 @@ MSG         NOCFN;
 MSG            NOADR;
 MSG            BADLOC;
 
 MSG            NOADR;
 MSG            BADLOC;
 
-SYMTAB         symbol;
-INT            lastframe;
-INT            savlastf;
-L_INT          savframe;
-INT            savpc;
-INT            callpc;
+ADDR           lastframe;
+ADDR           savlastf;
+ADDR           savframe;
+ADDR           savpc;
+ADDR           callpc;
 
 
 
 CHAR           *lp;
 
 
 
 CHAR           *lp;
-INT            octal;
+INT            radix;
 STRING         errflg;
 L_INT          localval;
 STRING         errflg;
 L_INT          localval;
-CHAR           isymbol[8];
+CHAR           isymbol[BSIZE];
 
 
-CHAR           lastc;
-POS            *endhdr;
+CHAR           lastc,peekc;
 
 L_INT          dot;
 L_INT          ditto;
 
 L_INT          dot;
 L_INT          ditto;
@@ -53,7 +51,7 @@ expr(a)
        WHILE rc
        DO  lhs = expv;
 
        WHILE rc
        DO  lhs = expv;
 
-           switch (readchar()) {
+           switch ((int)readchar()) {
 
                    case '+':
                        term(a|1); expv += lhs; break;
 
                    case '+':
                        term(a|1); expv += lhs; break;
@@ -90,7 +88,7 @@ expr(a)
 term(a)
 {      /* item | monadic item | (expr) | */
 
 term(a)
 {      /* item | monadic item | (expr) | */
 
-       switch (readchar()) {
+       switch ((int)readchar()) {
 
                    case '*':
                        term(a|1); expv=chkget(expv,DSP); return(1);
 
                    case '*':
                        term(a|1); expv=chkget(expv,DSP); return(1);
@@ -119,12 +117,11 @@ term(a)
 
 item(a)
 {      /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
 
 item(a)
 {      /* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
-       INT             base, d, frpt, regptr;
+       INT             base, d, regptr;
        CHAR            savc;
        BOOL            hex;
        L_INT           frame;
        CHAR            savc;
        BOOL            hex;
        L_INT           frame;
-       UNION{REAL r; L_INT i;} real;
-       SYMPTR          symp;
+       register struct nlist *symp;
 
        hex=FALSE;
 
 
        hex=FALSE;
 
@@ -132,15 +129,17 @@ item(a)
        IF symchar(0)
        THEN    readsym();
                IF lastc=='.'
        IF symchar(0)
        THEN    readsym();
                IF lastc=='.'
-               THEN    frame=endhdr[r5]&EVEN; lastframe=0; callpc=endhdr[pc];
+               THEN    frame= *(ADDR *)(((ADDR)&u)+FP); lastframe=0;
+                       callpc= *(ADDR *)(((ADDR)&u)+PC);
                        WHILE errflg==0
                        DO  savpc=callpc;
                        WHILE errflg==0
                        DO  savpc=callpc;
-                           findroutine(frame);
-                           IF  eqsym(symbol.symc,isymbol,'~')
+                               findsym(callpc,ISYM);
+                           IF  eqsym(cursym->n_un.n_name,isymbol,'~')
                            THEN break;
                            FI
                            THEN break;
                            FI
+                               callpc=get(frame+16, DSP);
                            lastframe=frame;
                            lastframe=frame;
-                           frame=get(frame,DSP)&EVEN;
+                           frame=get(frame+12,DSP)&EVEN;
                            IF frame==0
                            THEN error(NOCFN);
                            FI
                            IF frame==0
                            THEN error(NOCFN);
                            FI
@@ -150,39 +149,18 @@ item(a)
                        IF symchar(0)
                        THEN    chkloc(expv=frame);
                        FI
                        IF symchar(0)
                        THEN    chkloc(expv=frame);
                        FI
-               ELIF (symp=lookupsym(isymbol))==0 THEN error(BADSYM);
-               ELSE expv = symp->symv;
+               ELIF (symp=lookup(isymbol))==0 THEN error(BADSYM);
+               ELSE expv = symp->n_value;
                FI
                lp--;
 
 
                FI
                lp--;
 
 
-       ELIF digit(lastc) ORF (hex=TRUE, lastc=='#' ANDF hexdigit(readchar()))
-       THEN    expv = 0;
-               base = (lastc == '0' ORF octal ? 8 : (hex ? 16 : 10));
-               WHILE (hex ? hexdigit(lastc) : digit(lastc))
-               DO  expv *= base;
-                   IF (d=convdig(lastc))>=base THEN error(BADSYN); FI
-                   expv += d; readchar();
-                   IF expv==0 ANDF (lastc=='x' ORF lastc=='X')
-                   THEN hex=TRUE; base=16; readchar();
-                   FI
-               OD
-               IF lastc=='.' ANDF (base==10 ORF expv==0) ANDF !hex
-               THEN    real.r=expv; frpt=0; base=10;
-                       WHILE digit(readchar())
-                       DO      real.r *= base; frpt++;
-                               real.r += lastc-'0';
-                       OD
-                       WHILE frpt--
-                       DO      real.r /= base; OD
-                       expv = real.i;
-               FI
-               lp--;
-
+       ELIF getnum(readchar)
+       THEN ;
        ELIF lastc=='.'
        THEN    readchar();
                IF symchar(0)
        ELIF lastc=='.'
        THEN    readchar();
                IF symchar(0)
-               THEN    lastframe=savlastf; callpc=savpc; findroutine(savframe);
+               THEN    lastframe=savlastf; callpc=savpc;
                        chkloc(savframe);
                ELSE    expv=dot;
                FI
                        chkloc(savframe);
                ELSE    expv=dot;
                FI
@@ -200,7 +178,7 @@ item(a)
        ELIF lastc=='<'
        THEN    savc=rdc();
                IF regptr=getreg(savc)
        ELIF lastc=='<'
        THEN    savc=rdc();
                IF regptr=getreg(savc)
-               THEN    expv=endhdr[regptr];
+               THEN    expv= * (ADDR *)(((ADDR)&u)+regptr);
                ELIF (base=varchk(savc)) != -1
                THEN    expv=var[base];
                ELSE    error(BADVAR);
                ELIF (base=varchk(savc)) != -1
                THEN    expv=var[base];
                ELSE    error(BADVAR);
@@ -210,7 +188,7 @@ item(a)
        THEN    d=4; expv=0;
                WHILE quotchar()
                DO  IF d--
        THEN    d=4; expv=0;
                WHILE quotchar()
                DO  IF d--
-                   THEN IF d==1 THEN expv =<<16; FI
+                   THEN IF d==1 THEN expv <<=16; FI
                         expv |= ((d&1)?lastc:lastc<<8);
                    ELSE error(BADSYN);
                    FI
                         expv |= ((d&1)?lastc:lastc<<8);
                    ELSE error(BADSYN);
                    FI
@@ -224,64 +202,79 @@ item(a)
 }
 
 /* service routines for expression reading */
 }
 
 /* service routines for expression reading */
+getnum(rdf) int (*rdf)();
+{
+       INT base,d,frpt;
+       BOOL hex;
+       UNION{REAL r; L_INT i;} real;
+       IF isdigit(lastc) ORF (hex=TRUE, lastc=='#' ANDF isxdigit((*rdf)()))
+       THEN    expv = 0;
+               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
+                   expv += d; (*rdf)();
+                   IF expv==0
+                   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)();
+                                FI
+                   FI
+               OD
+               IF lastc=='.' ANDF (base==10 ORF expv==0) ANDF !hex
+               THEN    real.r=expv; frpt=0; base=10;
+                       WHILE isdigit((*rdf)())
+                       DO      real.r *= base; frpt++;
+                               real.r += lastc-'0';
+                       OD
+                       WHILE frpt--
+                       DO      real.r /= base; OD
+                       expv = real.i;
+               FI
+               peekc=lastc;
+/*             lp--; */
+               return(1);
+       ELSE return(0);
+       FI
+}
 
 readsym()
 {
        REG char        *p;
 
        p = isymbol;
 
 readsym()
 {
        REG char        *p;
 
        p = isymbol;
-       REP IF p < &isymbol[8]
+       REP IF p < &isymbol[sizeof(isymbol)-1]
            THEN *p++ = lastc;
            FI
            readchar();
        PER symchar(1) DONE
            THEN *p++ = lastc;
            FI
            readchar();
        PER symchar(1) DONE
-       WHILE p < &isymbol[8] DO *p++ = 0; OD
-}
-
-SYMPTR lookupsym(symstr)
-STRING symstr;
-{
-       SYMPTR          symp;
-       symset();
-       WHILE (symp=symget())
-       DO IF (symp->symf&SYMCHK)==symp->symf
-          ANDF eqsym(symp->symc, symstr,'_')
-           THEN return(symp);
-           FI
-       OD
-       return(0);
-}
-
-hexdigit(c)
-CHAR c;
-{      return((c>='0' ANDF c<='9') ORF (c>='a' ANDF c<='f'));
+       *p++ = 0;
 }
 
 convdig(c)
 CHAR c;
 {
 }
 
 convdig(c)
 CHAR c;
 {
-       IF digit(c)
+       IF isdigit(c)
        THEN    return(c-'0');
        THEN    return(c-'0');
-       ELIF hexdigit(c)
+       ELIF isxdigit(c)
        THEN    return(c-'a'+10);
        ELSE    return(17);
        FI
 }
 
        THEN    return(c-'a'+10);
        ELSE    return(17);
        FI
 }
 
-digit(c) char c;       {return(c>='0' ANDF c<='9');}
-
-letter(c) char c;      {return(c>='a' ANDF c<='z' ORF c>='A' ANDF c<='Z');}
-
 symchar(dig)
 {
        IF lastc=='\\' THEN readchar(); return(TRUE); FI
 symchar(dig)
 {
        IF lastc=='\\' THEN readchar(); return(TRUE); FI
-       return( letter(lastc) ORF lastc=='_' ORF dig ANDF digit(lastc) );
+       return( isalpha(lastc) ORF lastc=='_' ORF dig ANDF isdigit(lastc) );
 }
 
 varchk(name)
 {
 }
 
 varchk(name)
 {
-       IF digit(name) THEN return(name-'0'); FI
-       IF letter(name) THEN return((name&037)-1+10); FI
+       IF isdigit(name) THEN return(name-'0'); FI
+       IF isalpha(name) THEN return((name&037)-1+10); FI
        return(-1);
 }
 
        return(-1);
 }
 
@@ -291,23 +284,16 @@ L_INT             frame;
        readsym();
        REP IF localsym(frame)==0 THEN error(BADLOC); FI
            expv=localval;
        readsym();
        REP IF localsym(frame)==0 THEN error(BADLOC); FI
            expv=localval;
-       PER !eqsym(symbol.symc,isymbol,'~') DONE
+       PER !eqsym(cursym->n_un.n_name,isymbol,'~') DONE
 }
 
 eqsym(s1, s2, c)
 }
 
 eqsym(s1, s2, c)
-REG STRING     s1, s2;
-CHAR           c;
+       register char *s1, *s2;
 {
 {
-       IF eqstr(s1,s2)
-       THEN    return(TRUE);
-       ELIF *s1==c
-       THEN    CHAR            s3[8];
-               REG INT         i;
 
 
-               s3[0]=c;
-               FOR i=1; i<8; i++
-               DO s3[i] = *s2++; OD
-
-               return(eqstr(s1,s3));
-       FI
+       if (!strcmp(s1,s2))
+               return (1);
+       if (*s1 == c && !strcmp(s1+1, s2))
+               return (1);
+       return (0);
 }
 }