Commit | Line | Data |
---|---|---|
9899b113 TL |
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 (shorten(v)<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 symtyp != 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 |