BSD 3 development
[unix-history] / usr / src / cmd / adb / expr.c
index e73b325..996315a 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include "defs.h"
  */
 
 #include "defs.h"
+SCCSID(@(#)expr.c      2.5);
 
 
 MSG            BADSYM;
 
 
 MSG            BADSYM;
@@ -17,22 +18,22 @@ MSG         NOADR;
 MSG            BADLOC;
 
 SYMTAB         symbol;
 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;
 CHAR           isymbol[8];
 
 STRING         errflg;
 L_INT          localval;
 CHAR           isymbol[8];
 
-CHAR           lastc;
-POS            *endhdr;
+CHAR           lastc,peekc;
+char u[ctob(UPAGES)];  /* struct user u; */
 
 L_INT          dot;
 L_INT          ditto;
 
 L_INT          dot;
 L_INT          ditto;
@@ -53,7 +54,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 +91,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,11 +120,10 @@ 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;
 
        hex=FALSE;
        SYMPTR          symp;
 
        hex=FALSE;
@@ -132,15 +132,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[0])+FP); lastframe=0;
+                       callpc= *(ADDR *)(((ADDR)&u[0])+PC);
                        WHILE errflg==0
                        DO  savpc=callpc;
                        WHILE errflg==0
                        DO  savpc=callpc;
-                           findroutine(frame);
+                               findsym(callpc,ISYM);
                            IF  eqsym(symbol.symc,isymbol,'~')
                            THEN break;
                            FI
                            IF  eqsym(symbol.symc,isymbol,'~')
                            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
@@ -156,33 +158,12 @@ item(a)
                lp--;
 
 
                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 +181,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[0])+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 +191,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,6 +205,44 @@ 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 digit(lastc) ORF (hex=TRUE, lastc=='#' ANDF hexdigit((*rdf)()))
+       THEN    expv = 0;
+               base = (hex ? 16 : radix);
+               WHILE (base>10 ? hexdigit(lastc) : digit(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 digit((*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()
 {
 
 readsym()
 {
@@ -244,8 +263,12 @@ STRING     symstr;
        SYMPTR          symp;
        symset();
        WHILE (symp=symget())
        SYMPTR          symp;
        symset();
        WHILE (symp=symget())
+#ifndef EDDT
        DO IF (symp->symf&SYMCHK)==symp->symf
           ANDF eqsym(symp->symc, symstr,'_')
        DO IF (symp->symf&SYMCHK)==symp->symf
           ANDF eqsym(symp->symc, symstr,'_')
+#else
+       DO      IF eqsym(symp->symc, symstr, '_')
+#endif
            THEN return(symp);
            FI
        OD
            THEN return(symp);
            FI
        OD