xref: /original-bsd/old/sdb/sub.c (revision ba72ef4c)
1 static	char sccsid[] = "@(#)sub.c 4.1 10/09/80";
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 *
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 *
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 *
39 cpall(p, q)
40 char *p, *q; {
41 	while (*q != '\n')
42 		*p++ = *q++;
43 	*p = '\0';
44 	return(q);
45 }
46 
47 eqany(c, s)
48 char c, *s; {
49 	while(*s != '\0')
50 		if (c == *s++) return(1);
51 	return(0);
52 }
53 
54 error(s)
55 char *s; {
56 	printf("%s\n", s);
57 }
58 
59 char *
60 cpstr(p,q)
61 char *p, *q; {
62 	do {
63 		*p++ = *q++;
64 	} while (*q != '\0');
65 	*p = '\0';
66 }
67 L_INT
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 
79 chkerr()
80 {
81 	IF errflg ORF mkfault
82 	THEN	error(errflg);
83 		longjmp(env, 0);
84 	FI
85 }
86 
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 
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 */
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  */
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
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 */
206 getindir(class, addr, type)
207 ADDR addr; {
208 	if (ISARY(type)) return(addr);
209 	if (class == N_RSYM)
210 		return(*(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr));
211 	return(getval(addr, 'd', DSP));
212 }
213 
214 long
215 readint(p)
216 char **p; {
217 	int sign;
218 
219 	if (**p == '-') {
220 		sign = -1;
221 		(*p)++;
222 	} else {
223 		sign = 1;
224 	}
225 	if (**p == '0') {
226 		(*p)++;
227 		if (**p == 'x' || **p == 'X') {
228 			(*p)++;
229 			return(sign * rint(p, 16, hexdigit, hexconv));
230 		}
231 		else return(sign * rint(p, 8, octdigit, octconv));
232 	}
233 	else return(sign * rint(p, 10, decdigit, decconv));
234 }
235 
236 long
237 rint(p, base, digit, conv)
238 char **p;
239 int (*digit)(), (*conv)(); {
240 	long value;
241 
242 	value = 0;
243 	while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++);
244 	return(value);
245 }
246 
247 octdigit(c)
248 char c; {
249 	return(c >= '0' && c <= '7');
250 }
251 
252 octconv(c)
253 char c; {
254 	return(c - '0');
255 }
256 
257 decdigit(c)
258 char c; {
259 	return(c >= '0' && c <= '9');
260 }
261 
262 decconv(c)
263 char c; {
264 	return(c - '0');
265 }
266 
267 hexdigit(c)
268 char c; {
269 	return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
270 		(c >= 'A' && c <= 'F'));
271 }
272 
273 hexconv(c)
274 char c; {
275 	if (c >= '0' && c <= '9') return(c - '0');
276 	if (c >= 'a' && c <= 'f') return(c - 'a' + 10);
277 	if (c >= 'A' && c <= 'F') return(c - 'A' + 10);
278 	error("hex conversion error");
279 	return(0);
280 }
281 
282 /* decodes number, character or variable */
283 long
284 argvalue(p)
285 char *p; {
286 	register char ch;
287 	register long value;
288 	register ADDR j;
289 	char var[30];
290 
291 	ch = *p;
292 	if (ch == '\'') {
293 		value = *(p+1);
294 	} else if ((ch >= '0' && ch <= '9') || ch == '-') {
295 		value = readint(&p);
296 	} else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
297 		ch == '_') {
298 		cpname(var, p);
299 		j = varaddr(curproc()->pname, var);
300 		if (j == -1) {
301 			printf("Unknown variable: %s\n", argsp);
302 			return(-1);
303 		}
304 		value = getval(j, typetodesc(sl_type, 0)[0], DSP);
305 		do {
306 			p++;
307 		} while (varchar(*p) || number(*p));
308 	}
309 	return(value);
310 }
311 
312 prhex(v)
313 long v; {
314 	if (v < 0)  {
315 		v = -v;
316 		printf("-");
317 	}
318 	if (v <= 9)
319 		printf("%d", v);
320 	else
321 		printf("0x%x", v);
322 }
323 
324 /* print hex number in field of length 12 */
325 prhex12(v)
326 long v; {
327 	if (v >= -9 && v <= 9)
328 		printf("%-12d", v);
329 	else
330 		printf("0x%-12x", v);
331 }
332 
333 /* print line number followed by offset */
334 prlnoff(procp, v)
335 struct proct *procp; ADDR v; {
336 	int lineno, diff;
337 	char *name;
338 	name = procp->pname;
339 	if (name[0] == '_') {
340 #ifndef FLEXNAMES
341 		printf("%.7s", name+1);
342 #else
343 		printf("%s", name+1);
344 #endif
345 		lineno = -1;
346 	} else {
347 #ifndef FLEXNAMES
348 		printf("%8s", name);
349 #else
350 		printf("%s", name);
351 #endif
352 		lineno = adrtolineno((ADDR) v);
353 	}
354 	if (lineno == -1)
355 		diff = v - procp->paddr;
356 	else {
357 		printf(":%d", lineno);
358 		diff = v - lnfaddr;  /* set by adrtolineno() */
359 	}
360 	if (diff) {
361 		printf("+");
362 		prhex(diff);
363 	}
364 }
365