Commit | Line | Data |
---|---|---|
d94e2462 M |
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 | } |