Annotation of 3BSD/cmd/adb/sym.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  *
                      4:  *     UNIX debugger
                      5:  *
                      6:  */
                      7: 
                      8: #include "defs.h"
                      9: SCCSID(@(#)sym.c       2.4);
                     10: #include "a.out.h"
                     11: 
                     12: 
                     13: MSG            BADFIL;
                     14: 
                     15: SYMTAB         symbol;
                     16: BOOL           localok;
                     17: ADDR           lastframe;
                     18: SYMSLAVE               *symvec;
                     19: ADDR           maxoff;
                     20: ADDR           maxstor;
                     21: 
                     22: /* symbol management */
                     23: L_INT          symbas;
                     24: L_INT          symcnt;
                     25: L_INT          symnum;
                     26: ADDR           localval;
                     27: char           symrqd = -1;
                     28: SYMTAB         symbuf[SYMSIZ];
                     29: SYMPTR         symnxt;
                     30: SYMPTR         symend;
                     31: 
                     32: 
                     33: INT            fsym;
                     34: STRING         errflg;
                     35: POS            findsym();
                     36: 
                     37: 
                     38: /* symbol table and file handling service routines */
                     39: 
                     40: longseek(f, a)
                     41: L_INT a;
                     42: {
                     43: #ifndef EDDT
                     44:        return(lseek(f,a,0) != -1);
                     45: #endif
                     46: }
                     47: 
                     48: valpr(v,idsp)
                     49: {
                     50:        POS             d;
                     51:        d = findsym(v,idsp);
                     52:        IF d < maxoff
                     53:        THEN    printf("%.8s", symbol.symc);
                     54:                IF d
                     55:                THEN    printf(OFFMODE, d);
                     56:                FI
                     57:        FI
                     58: }
                     59: 
                     60: localsym(cframe,cargp)
                     61: ADDR cframe,cargp;
                     62: {
                     63: #ifndef EDDT
                     64:        INT symflg;
                     65:        WHILE nextsym()
                     66:                ANDF symbol.symc[0]!='_'
                     67:                ANDF (symflg=symbol.symf)!=N_FN
                     68:        DO IF symflg>=N_TEXT ANDF symflg<=(N_BSS|N_EXT)
                     69:           THEN localval=symbol.symv;
                     70:                return(TRUE);
                     71:           ELIF symflg==N_ABS
                     72:           THEN localval=(symbol.symv<0 ? cframe:cargp)+symbol.symv;
                     73:                return(TRUE);
                     74:           FI
                     75:        OD
                     76: #endif
                     77:        return(FALSE);
                     78: }
                     79: psymoff(v,type,s)
                     80: L_INT v; int type; char *s;
                     81: {
                     82:        POS             w;
                     83:        IF (v!=0) THEN w = findsym(v,type); FI
                     84:        IF v==0 ORF w >= maxoff ORF ((v &~ 0x80000000)<maxoff ANDF w!=0)
                     85:        THEN printf(LPRMODE,v);
                     86:        ELSE printf("%.8s", symbol.symc);
                     87:             IF w THEN printf(OFFMODE,w); FI
                     88:        FI
                     89:        printf(s);
                     90: }
                     91: 
                     92: POS
                     93: findsym(svalue,type)
                     94: L_INT  svalue;
                     95: INT    type;
                     96: {
                     97:        L_INT           diff, value, symval, offset;
                     98:        INT             symtyp;
                     99: #ifndef EDDT
                    100:        REG SYMSLAVE    *symptr;
                    101:        SYMSLAVE        *symsav;
                    102: #else
                    103:        REG SYMPTR      *symptr;
                    104:        SYMPTR  *symsav;
                    105: #endif
                    106:        value=svalue; diff = 0x7fffffffL; symsav=0;
                    107:        IF type!=NSYM ANDF (symptr=symvec)
                    108: #ifndef EDDT
                    109:        THEN    WHILE diff ANDF (symtyp=symptr->typslave)!=ESYM
                    110:                DO  IF (type==0 ORF symtyp==type) ANDF symptr->typslave != XSYM
                    111:                    THEN symval=symptr->valslave;
                    112:                         IF value-symval<diff
                    113:                            ANDF value>=symval
                    114:                         THEN diff = value-symval;
                    115:                              symsav=symptr;
                    116:                         FI
                    117:                    FI
                    118:                    symptr++;
                    119:                OD
                    120:                IF symsav
                    121:                THEN    offset=leng(symsav-symvec);
                    122:                        symcnt=symnum-offset;
                    123:                        longseek(fsym, symbas+offset*SYMTABSIZ);
                    124:                        read(fsym,&symbol,SYMTABSIZ);
                    125:                FI
                    126:        FI
                    127: #else
                    128:        THEN    WHILE diff ANDF symptr<symend
                    129:                DO  IF value-symptr->symv<diff
                    130:                            ANDF value>=symptr->symv
                    131:                        THEN diff = value-symptr->symv;
                    132:                            symsav=symptr;
                    133:                    FI
                    134:                    symptr++;
                    135:                OD
                    136:                IF symsav THEN cpsym(symsav,&symbol); FI
                    137:        FI
                    138: #endif
                    139:        return(diff);
                    140: }
                    141: 
                    142: #ifdef EDDT
                    143: cpsym(fm,to) register char *fm,*to;{
                    144: register int i=12; do *to++= *fm++; while (--i);
                    145: }
                    146: #endif
                    147: 
                    148: nextsym()
                    149: {
                    150:        IF (--symcnt)<0
                    151:        THEN    return(FALSE);
                    152: #ifndef EDDT
                    153:        ELSE    return(longseek(fsym, symbas+(symnum-symcnt)*SYMTABSIZ)!=0 ANDF
                    154:                        read(fsym,&symbol,SYMTABSIZ)==SYMTABSIZ);
                    155: #endif
                    156:        FI
                    157: }
                    158: 
                    159: 
                    160: 
                    161: /* sequential search through file */
                    162: symset()
                    163: {
                    164:        symcnt = symnum;
                    165: #ifndef EDDT
                    166:        symnxt = symbuf;
                    167:        IF symrqd
                    168:        THEN    longseek(fsym, symbas);
                    169:                symread(); symrqd=FALSE;
                    170:        ELSE    longseek(fsym, symbas+sizeof symbuf);
                    171:        FI
                    172: #else
                    173:        symnxt=symvec;
                    174: #endif
                    175: }
                    176: 
                    177: SYMPTR symget()
                    178: {
                    179: #ifndef EDDT
                    180:        REG INT rc;
                    181:        IF symnxt >= symend
                    182:        THEN    rc=symread(); symrqd=TRUE;
                    183:        ELSE    rc=TRUE;
                    184:        FI
                    185:        IF --symcnt>0 ANDF rc==0 THEN errflg=BADFIL; FI
                    186:        return( (symcnt>=0 && rc) ? symnxt++ : 0);
                    187: #else
                    188:        IF --symcnt>=0 THEN return(symnxt++); ELSE return(0); FI
                    189: #endif
                    190: }
                    191: 
                    192: #ifndef EDDT
                    193: symread()
                    194: {
                    195:        INT             symlen;
                    196: #ifndef vax
                    197:        short t;        SYMTAB *p;
                    198: #endif
                    199: 
                    200:        symlen=read(fsym,symbuf,sizeof symbuf);
                    201: #ifndef vax
                    202:        p=symbuf;
                    203:        while ((char *)p<(char*)symbuf+symlen) {
                    204:                t=p->symv.hiword; p->symv.hiword=p->symv.loword; p->symv.loword=t;
                    205:                p++;
                    206:        }
                    207: #endif
                    208:        IF symlen>=SYMTABSIZ
                    209:        THEN    symnxt = symbuf;
                    210:                symend = &symbuf[symlen/SYMTABSIZ];
                    211:                return(TRUE);
                    212:        ELSE    return(FALSE);
                    213:        FI
                    214: }
                    215: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.