1 static char sccsid[] = "@(#)sub.c 4.2 08/17/82";
2 #include "head.h"
3 #include <a.out.h>
4 #include <stab.h>
5 #include "cdefs.h"
6 #include <stdio.h>
7 struct user u;
8
9 char *
readline(f)10 readline(f)
11 FILE *f; {
12 static char buff[128];
13
14 register char *p;
15 register int i;
16
17 p = buff;
18 do {
19 if ((i = getc(f)) == EOF) {
20 *p++ = '\004';
21 *p = '\n';
22 }
23 else *p = i;
24 } while (*p++ != '\n');
25
26 return(buff);
27 }
28
29 char *
cpname(p,q)30 cpname(p, q)
31 char *p, *q; {
32 while(varchar(*q) || number(*q))
33 *p++ = *q++;
34 *p = '\0';
35 return(q);
36 }
37
38 char *
cpall(p,q)39 cpall(p, q)
40 char *p, *q; {
41 while (*q != '\n')
42 *p++ = *q++;
43 *p = '\0';
44 return(q);
45 }
46
eqany(c,s)47 eqany(c, s)
48 char c, *s; {
49 while(*s != '\0')
50 if (c == *s++) return(1);
51 return(0);
52 }
53
error(s)54 error(s)
55 char *s; {
56 printf("%s\n", s);
57 }
58
59 char *
cpstr(p,q)60 cpstr(p,q)
61 char *p, *q; {
62 do {
63 *p++ = *q++;
64 } while (*q != '\0');
65 *p = '\0';
66 }
67 L_INT
round(a,b)68 round(a,b)
69 REG L_INT a, b;
70 {
71 REG L_INT w;
72 w = (a/b)*b;
73 IF a!=w THEN w += b; FI
74 return(w);
75 }
76
77 /* error handling */
78
chkerr()79 chkerr()
80 {
81 IF errflg ORF mkfault
82 THEN error(errflg);
83 longjmp(env, 0);
84 FI
85 }
86
eqstr(s1,s2)87 eqstr(s1, s2)
88 REG STRING s1, s2;
89 {
90 #ifndef FLEXNAMES
91 REG STRING es1;
92 #endif
93 if (s2 == (STRING) -1) return(0);
94 #ifndef FLEXNAMES
95 es1 = s1+8;
96 #endif
97 WHILE *s1++ == *s2
98 #ifndef FLEXNAMES
99 DO IF *s2++ == 0 ORF s1>=es1
100 #else
101 DO IF *s2++ == 0
102 #endif
103 THEN return(1);
104 FI
105 OD
106 return(0);
107 }
108
longseek(f,a)109 longseek(f, a)
110 L_INT a;
111 {
112 return(lseek(f,(long) a,0) != -1);
113 }
114
115
116 /* descriptor format to length */
dtol(d)117 dtol(d)
118 char d; {
119 switch(d) {
120
121 case 'a':
122 case 's':
123 return(0);
124
125 case 'b':
126 case 'c':
127 return(1);
128
129 case 'h':
130 return(2);
131
132 case 'l':
133 case 'f':
134 return(4);
135
136 case 'g':
137 return(8);
138
139 default:
140 return(WORDSIZE);
141 }
142 }
143
144 /*
145 * checks equality of pattern pat with str,
146 * assuming str is tructaed at length 8
147 */
eqpat(pat,str)148 eqpat(pat, str)
149 char *pat, *str; {
150 #ifndef FLEXNAMES
151 return(eqpatr(pat, str, 0));
152 #else
153 return(eqpatr(pat, str));
154 #endif
155 }
156
157 #ifndef FLEXNAMES
eqpatr(pat,str,cnt)158 eqpatr(pat, str, cnt)
159 #else
160 eqpatr(pat, str)
161 #endif
162 char *pat, *str; {
163 register int i;
164 register char p, s;
165
166 p = pat[0];
167 s = str[0];
168 #ifndef FLEXNAMES
169 if (cnt == 8) return(1);
170 #endif
171 if (p == '?') {
172 if (s == '\0') return(0);
173 #ifndef FLEXNAMES
174 return(eqpatr(pat+1, str+1, cnt+1));
175 #else
176 return(eqpatr(pat+1, str+1));
177 #endif
178 }
179 if (p == '*') {
180 if (pat[1] == '\0') return(1);
181 #ifndef FLEXNAMES
182 for(i=1; i<8-cnt; i++) {
183 if (eqpatr(pat+1, str+i, cnt+i)) return(1);
184 #else
185 for(i=1; ; i++) {
186 if (eqpatr(pat+1, str+i)) return(1);
187 #endif
188 if (str[i] == '\0') return(0);
189 }
190 #ifndef FLEXNAMES
191 return(0);
192 #else
193 /*NOTREACHED*/
194 #endif
195 }
196 if ((eqany(p, ".[->") || p == '\0') && s == '\0') return(1);
197 if (p != s) return(0);
198 #ifndef FLEXNAMES
199 return(eqpatr(pat+1, str+1, cnt+1));
200 #else
201 return(eqpatr(pat+1, str+1));
202 #endif
203 }
204
205 /* gets indirect address for pointers and subscripts */
getindir(class,addr,type)206 getindir(class, addr, type)
207 u_char class;
208 ADDR addr; {
209 if (ISARY(type)) return(addr);
210 if (class == N_RSYM)
211 return(*(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr));
212 return(getval(addr, 'd', DSP));
213 }
214
215 long
readint(p)216 readint(p)
217 char **p; {
218 int sign;
219
220 if (**p == '-') {
221 sign = -1;
222 (*p)++;
223 } else {
224 sign = 1;
225 }
226 if (**p == '0') {
227 (*p)++;
228 if (**p == 'x' || **p == 'X') {
229 (*p)++;
230 return(sign * rint(p, 16, hexdigit, hexconv));
231 }
232 else return(sign * rint(p, 8, octdigit, octconv));
233 }
234 else return(sign * rint(p, 10, decdigit, decconv));
235 }
236
237 long
rint(p,base,digit,conv)238 rint(p, base, digit, conv)
239 char **p;
240 int (*digit)(), (*conv)(); {
241 long value;
242
243 value = 0;
244 while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++);
245 return(value);
246 }
247
octdigit(c)248 octdigit(c)
249 char c; {
250 return(c >= '0' && c <= '7');
251 }
252
octconv(c)253 octconv(c)
254 char c; {
255 return(c - '0');
256 }
257
decdigit(c)258 decdigit(c)
259 char c; {
260 return(c >= '0' && c <= '9');
261 }
262
decconv(c)263 decconv(c)
264 char c; {
265 return(c - '0');
266 }
267
hexdigit(c)268 hexdigit(c)
269 char c; {
270 return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
271 (c >= 'A' && c <= 'F'));
272 }
273
hexconv(c)274 hexconv(c)
275 char c; {
276 if (c >= '0' && c <= '9') return(c - '0');
277 if (c >= 'a' && c <= 'f') return(c - 'a' + 10);
278 if (c >= 'A' && c <= 'F') return(c - 'A' + 10);
279 error("hex conversion error");
280 return(0);
281 }
282
283 /* decodes number, character or variable */
284 long
argvalue(p)285 argvalue(p)
286 char *p; {
287 register char ch;
288 register long value;
289 register ADDR j;
290 char var[30];
291
292 ch = *p;
293 if (ch == '\'') {
294 value = *(p+1);
295 } else if ((ch >= '0' && ch <= '9') || ch == '-') {
296 value = readint(&p);
297 } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
298 ch == '_') {
299 cpname(var, p);
300 j = varaddr(curproc()->pname, var);
301 if (j == -1) {
302 printf("Unknown variable: %s\n", argsp);
303 return(-1);
304 }
305 value = getval(j, typetodesc(sl_type, 0)[0], DSP);
306 do {
307 p++;
308 } while (varchar(*p) || number(*p));
309 }
310 return(value);
311 }
312
prhex(v)313 prhex(v)
314 long v; {
315 if (v < 0) {
316 v = -v;
317 printf("-");
318 }
319 if (v <= 9)
320 printf("%d", v);
321 else
322 printf("0x%x", v);
323 }
324
325 /* print hex number in field of length 12 */
prhex12(v)326 prhex12(v)
327 long v; {
328 if (v >= -9 && v <= 9)
329 printf("%-12d", v);
330 else
331 printf("0x%-12x", v);
332 }
333
334 /* print line number followed by offset */
335 prlnoff(procp, v)
336 struct proct *procp; ADDR v; {
337 int lineno, diff;
338 char *name;
339 name = procp->pname;
340 if (name[0] == '_') {
341 #ifndef FLEXNAMES
342 printf("%.7s", name+1);
343 #else
344 printf("%s", name+1);
345 #endif
346 lineno = -1;
347 } else {
348 #ifndef FLEXNAMES
349 printf("%8s", name);
350 #else
351 printf("%s", name);
352 #endif
353 lineno = adrtolineno((ADDR) v);
354 }
355 if (lineno == -1)
356 diff = v - procp->paddr;
357 else {
358 printf(":%d", lineno);
359 diff = v - lnfaddr; /* set by adrtolineno() */
360 }
361 if (diff) {
362 printf("+");
363 prhex(diff);
364 }
365 }
366