BSD 4 development
[unix-history] / .ref-5cb41021d721f4e0ac572d592613f963e495d1ff / usr / src / old / sdb / sub.c
CommitLineData
1c71ee4a
BJ
1static char sccsid[] = "@(#)sub.c 4.1 %G%";
2#include "head.h"
3#include <a.out.h>
4#include <stab.h>
5#include "cdefs.h"
6#include <stdio.h>
7struct user u;
8
9char *
10readline(f)
11FILE *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
29char *
30cpname(p, q)
31char *p, *q; {
32 while(varchar(*q) || number(*q))
33 *p++ = *q++;
34 *p = '\0';
35 return(q);
36}
37
38char *
39cpall(p, q)
40char *p, *q; {
41 while (*q != '\n')
42 *p++ = *q++;
43 *p = '\0';
44 return(q);
45}
46
47eqany(c, s)
48char c, *s; {
49 while(*s != '\0')
50 if (c == *s++) return(1);
51 return(0);
52}
53
54error(s)
55char *s; {
56 printf("%s\n", s);
57}
58
59char *
60cpstr(p,q)
61char *p, *q; {
62 do {
63 *p++ = *q++;
64 } while (*q != '\0');
65 *p = '\0';
66}
67L_INT
68round(a,b)
69REG 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
79chkerr()
80{
81 IF errflg ORF mkfault
82 THEN error(errflg);
83 longjmp(env, 0);
84 FI
85}
86
87eqstr(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
109longseek(f, a)
110L_INT a;
111{
112 return(lseek(f,(long) a,0) != -1);
113}
114
115
116/* descriptor format to length */
117dtol(d)
118char 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 */
148eqpat(pat, str)
149char *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
158eqpatr(pat, str, cnt)
159#else
160eqpatr(pat, str)
161#endif
162char *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 */
206getindir(class, addr, type)
207ADDR 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
214long
215readint(p)
216char **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
236long
237rint(p, base, digit, conv)
238char **p;
239int (*digit)(), (*conv)(); {
240 long value;
241
242 value = 0;
243 while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++);
244 return(value);
245}
246
247octdigit(c)
248char c; {
249 return(c >= '0' && c <= '7');
250}
251
252octconv(c)
253char c; {
254 return(c - '0');
255}
256
257decdigit(c)
258char c; {
259 return(c >= '0' && c <= '9');
260}
261
262decconv(c)
263char c; {
264 return(c - '0');
265}
266
267hexdigit(c)
268char c; {
269 return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
270 (c >= 'A' && c <= 'F'));
271}
272
273hexconv(c)
274char 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 */
283long
284argvalue(p)
285char *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
312prhex(v)
313long 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 */
325prhex12(v)
326long 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 */
334prlnoff(procp, v)
335struct 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}