|
|
1.1 root 1: static char sccsid[] = "@(#)sub.c 4.1 10/9/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.