date and time created 83/03/09 16:22:19 by ralph
[unix-history] / usr / src / old / sdb / sub.c
CommitLineData
28c97a66 1static char sccsid[] = "@(#)sub.c 4.2 %G%";
1c71ee4a
BJ
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)
28c97a66 207u_char class;
1c71ee4a
BJ
208ADDR 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
215long
216readint(p)
217char **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
237long
238rint(p, base, digit, conv)
239char **p;
240int (*digit)(), (*conv)(); {
241 long value;
242
243 value = 0;
244 while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++);
245 return(value);
246}
247
248octdigit(c)
249char c; {
250 return(c >= '0' && c <= '7');
251}
252
253octconv(c)
254char c; {
255 return(c - '0');
256}
257
258decdigit(c)
259char c; {
260 return(c >= '0' && c <= '9');
261}
262
263decconv(c)
264char c; {
265 return(c - '0');
266}
267
268hexdigit(c)
269char c; {
270 return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
271 (c >= 'A' && c <= 'F'));
272}
273
274hexconv(c)
275char 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 */
284long
285argvalue(p)
286char *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
313prhex(v)
314long 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 */
326prhex12(v)
327long 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 */
335prlnoff(procp, v)
336struct 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}