xref: /original-bsd/old/sdb/sub.c (revision 3b6250d9)
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 *
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 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
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
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 
248 octdigit(c)
249 char c; {
250 	return(c >= '0' && c <= '7');
251 }
252 
253 octconv(c)
254 char c; {
255 	return(c - '0');
256 }
257 
258 decdigit(c)
259 char c; {
260 	return(c >= '0' && c <= '9');
261 }
262 
263 decconv(c)
264 char c; {
265 	return(c - '0');
266 }
267 
268 hexdigit(c)
269 char c; {
270 	return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
271 		(c >= 'A' && c <= 'F'));
272 }
273 
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
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 
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 */
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