\19sym.c - RSS feed" href="/unix-history/.git/rss?f=usr/src/cmd/adb/old%19sym.c" type="application/rss+xml" /> \19sym.c - RSS feed (no merges)" href="/unix-history/.git/rss?f=usr/src/cmd/adb/old%19sym.c;opt=--no-merges" type="application/rss+xml" /> \19sym.c - Atom feed" href="/unix-history/.git/atom?f=usr/src/cmd/adb/old%19sym.c" type="application/atom+xml" /> \19sym.c - Atom feed (no merges)" href="/unix-history/.git/atom?f=usr/src/cmd/adb/old%19sym.c;opt=--no-merges" type="application/atom+xml" />
BSD 3 development
[unix-history] / usr / src / cmd / adb / old\19sym.c
CommitLineData
54ee7326
BJ
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9SCCSID(@(#)sym.c 2.4);
10#include "a.out.h"
11
12
13MSG BADFIL;
14
15SYMTAB symbol;
16BOOL localok;
17ADDR lastframe;
18SYMSLAVE *symvec;
19ADDR maxoff;
20ADDR maxstor;
21
22/* symbol management */
23L_INT symbas;
24L_INT symcnt;
25L_INT symnum;
26ADDR localval;
27char symrqd = -1;
28SYMTAB symbuf[SYMSIZ];
29SYMPTR symnxt;
30SYMPTR symend;
31
32
33INT fsym;
34STRING errflg;
35POS findsym();
36
37
38/* symbol table and file handling service routines */
39
40longseek(f, a)
41L_INT a;
42{
43#ifndef EDDT
44 return(lseek(f,a,0) != -1);
45#endif
46}
47
48valpr(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
60localsym(cframe,cargp)
61ADDR 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}
79psymoff(v,type,s)
80L_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
92POS
93findsym(svalue,type)
94L_INT svalue;
95INT 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
143cpsym(fm,to) register char *fm,*to;{
144register int i=12; do *to++= *fm++; while (--i);
145}
146#endif
147
148nextsym()
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 */
162symset()
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
177SYMPTR 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
193symread()
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