Research V7 development
[unix-history] / usr / src / cmd / adb / sym.c
CommitLineData
d94e2462
M
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9
10
11MSG BADFIL;
12
13SYMTAB symbol;
14BOOL localok;
15INT lastframe;
16SYMSLAVE *symvec;
17POS maxoff;
18L_INT maxstor;
19
20/* symbol management */
21L_INT symbas;
22L_INT symcnt;
23L_INT symnum;
24L_INT localval;
25char symrqd -1;
26SYMTAB symbuf[SYMSIZ];
27SYMPTR symnxt;
28SYMPTR symend;
29
30
31INT fsym;
32STRING errflg;
33POS findsym();
34
35
36/* symbol table and file handling service routines */
37
38longseek(f, a)
39L_INT a;
40{
41 return(lseek(f,a,0) != -1);
42}
43
44valpr(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
56localsym(cframe)
57L_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}
76psymoff(v,type,s)
77L_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
89POS findsym(svalue,type)
90POS svalue;
91INT 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
120nextsym()
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 */
132symset()
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
143SYMPTR 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
154symread()
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}