|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.