home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / adb / sym.c < prev   
Encoding:
C/C++ Source or Header  |  1979-01-10  |  2.6 KB  |  165 lines

  1. #
  2. /*
  3.  *
  4.  *    UNIX debugger
  5.  *
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10.  
  11. MSG        BADFIL;
  12.  
  13. SYMTAB        symbol;
  14. BOOL        localok;
  15. INT        lastframe;
  16. SYMSLAVE        *symvec;
  17. POS        maxoff;
  18. L_INT        maxstor;
  19.  
  20. /* symbol management */
  21. L_INT        symbas;
  22. L_INT        symcnt;
  23. L_INT        symnum;
  24. L_INT        localval;
  25. char        symrqd -1;
  26. SYMTAB        symbuf[SYMSIZ];
  27. SYMPTR        symnxt;
  28. SYMPTR        symend;
  29.  
  30.  
  31. INT        fsym;
  32. STRING        errflg;
  33. POS        findsym();
  34.  
  35.  
  36. /* symbol table and file handling service routines */
  37.  
  38. longseek(f, a)
  39. L_INT a;
  40. {
  41.     return(lseek(f,a,0) != -1);
  42. }
  43.  
  44. valpr(v,idsp)
  45. {
  46.     POS        d;
  47.     d = findsym(v,idsp);
  48.     IF d < maxoff
  49.     THEN    printf("%.8s", symbol.symc);
  50.         IF d
  51.         THEN    printf(OFFMODE, d);
  52.         FI
  53.     FI
  54. }
  55.  
  56. localsym(cframe)
  57. L_INT cframe;
  58. {
  59.     INT symflg;
  60.     WHILE nextsym() ANDF localok
  61.         ANDF symbol.symc[0]!='~'
  62.         ANDF (symflg=symbol.symf)!=037
  63.     DO IF symflg>=2 ANDF symflg<=4
  64.        THEN localval=symbol.symv;
  65.         return(TRUE);
  66.        ELIF symflg==1
  67.        THEN localval=leng(shorten(cframe)+symbol.symv);
  68.         return(TRUE);
  69.        ELIF symflg==20 ANDF lastframe
  70.        THEN localval=leng(lastframe+2*symbol.symv-10);
  71.         return(TRUE);
  72.        FI
  73.     OD
  74.     return(FALSE);
  75. }
  76. psymoff(v,type,s)
  77. L_INT v; int type; char *s;
  78. {
  79.     POS        w;
  80.     w = findsym(shorten(v),type);
  81.     IF w >= maxoff
  82.     THEN printf(LPRMODE,v);
  83.     ELSE printf("%.8s", symbol.symc);
  84.          IF w THEN printf(OFFMODE,w); FI
  85.     FI
  86.     printf(s);
  87. }
  88.  
  89. POS    findsym(svalue,type)
  90. POS    svalue;
  91. INT    type;
  92. {
  93.     L_INT        diff, value, symval, offset;
  94.     INT        symtyp;
  95.     REG SYMSLAVE    *symptr;
  96.     SYMSLAVE    *symsav;
  97.     value=svalue; diff = 0377777L; symsav=0;
  98.     IF type!=NSYM ANDF (symptr=symvec)
  99.     THEN    WHILE diff ANDF (symtyp=symptr->typslave)!=ESYM
  100.         DO  IF symtyp==type
  101.             THEN symval=leng(symptr->valslave);
  102.              IF value-symval<diff
  103.                 ANDF value>=symval
  104.              THEN diff = value-symval;
  105.                   symsav=symptr;
  106.              FI
  107.             FI
  108.             symptr++;
  109.         OD
  110.         IF symsav
  111.         THEN    offset=leng(symsav-symvec);
  112.             symcnt=symnum-offset;
  113.             longseek(fsym, symbas+offset*SYMTABSIZ);
  114.             read(fsym,&symbol,SYMTABSIZ);
  115.         FI
  116.     FI
  117.     return(shorten(diff));
  118. }
  119.  
  120. nextsym()
  121. {
  122.     IF (--symcnt)<0
  123.     THEN    return(FALSE);
  124.     ELSE    return(longseek(fsym, symbas+(symnum-symcnt)*SYMTABSIZ)!=0 ANDF
  125.             read(fsym,&symbol,SYMTABSIZ)==SYMTABSIZ);
  126.     FI
  127. }
  128.  
  129.  
  130.  
  131. /* sequential search through file */
  132. symset()
  133. {
  134.     symcnt = symnum;
  135.     symnxt = symbuf;
  136.     IF symrqd
  137.     THEN    longseek(fsym, symbas);
  138.         symread(); symrqd=FALSE;
  139.     ELSE    longseek(fsym, symbas+sizeof symbuf);
  140.     FI
  141. }
  142.  
  143. SYMPTR    symget()
  144. {
  145.     REG INT    rc;
  146.     IF symnxt >= symend
  147.     THEN    rc=symread(); symrqd=TRUE;
  148.     ELSE    rc=TRUE;
  149.     FI
  150.     IF --symcnt>0 ANDF rc==0 THEN errflg=BADFIL; FI
  151.     return( (symcnt>=0 && rc) ? symnxt++ : 0);
  152. }
  153.  
  154. symread()
  155. {
  156.     INT        symlen;
  157.  
  158.     IF (symlen=read(fsym,symbuf,sizeof symbuf))>=SYMTABSIZ
  159.     THEN    symnxt = symbuf;
  160.         symend = &symbuf[symlen/SYMTABSIZ];
  161.         return(TRUE);
  162.     ELSE    return(FALSE);
  163.     FI
  164. }
  165.