|
|
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: clearerr(f);
23: }
24: else *p = i;
25: } while (*p++ != '\n');
26:
27: return(buff);
28: }
29:
30: char *
31: cpname(p, q)
32: char *p, *q; {
33: while(varchar(*q) || number(*q))
34: *p++ = *q++;
35: *p = '\0';
36: return(q);
37: }
38:
39: char *
40: cpall(p, q)
41: char *p, *q; {
42: while (*q != '\n')
43: *p++ = *q++;
44: *p = '\0';
45: return(q);
46: }
47:
48: eqany(c, s)
49: char c, *s; {
50: while(*s != '\0')
51: if (c == *s++) return(1);
52: return(0);
53: }
54:
55: error(s)
56: char *s; {
57: printf("%s\n", s);
58: }
59:
60: char *
61: cpstr(p,q)
62: char *p, *q; {
63: do {
64: *p++ = *q++;
65: } while (*q != '\0');
66: *p = '\0';
67: }
68: L_INT
69: round(a,b)
70: REG L_INT a, b;
71: {
72: REG L_INT w;
73: w = (a/b)*b;
74: IF a!=w THEN w += b; FI
75: return(w);
76: }
77:
78: /* error handling */
79:
80: chkerr()
81: {
82: IF errflg ORF mkfault
83: THEN error(errflg);
84: longjmp(env, 0);
85: FI
86: }
87:
88: eqstr(s1, s2)
89: REG STRING s1, s2;
90: {
91: #ifndef FLEXNAMES
92: REG STRING es1;
93: #endif
94: if (s2 == (STRING) -1) return(0);
95: #ifndef FLEXNAMES
96: es1 = s1+8;
97: #endif
98: WHILE *s1++ == *s2
99: #ifndef FLEXNAMES
100: DO IF *s2++ == 0 ORF s1>=es1
101: #else
102: DO IF *s2++ == 0
103: #endif
104: THEN return(1);
105: FI
106: OD
107: return(0);
108: }
109:
110: longseek(f, a)
111: L_INT a;
112: {
113: return(lseek(f,(long) a,0) != -1);
114: }
115:
116:
117: /* descriptor format to length */
118: dtol(d)
119: char d; {
120: switch(d) {
121:
122: case 'a':
123: case 's':
124: return(0);
125:
126: case 'b':
127: case 'c':
128: return(1);
129:
130: case 'h':
131: return(2);
132:
133: case 'l':
134: case 'f':
135: return(4);
136:
137: case 'g':
138: return(8);
139:
140: default:
141: return(WORDSIZE);
142: }
143: }
144:
145: /*
146: * checks equality of pattern pat with str,
147: * assuming str is tructaed at length 8
148: */
149: eqpat(pat, str)
150: char *pat, *str; {
151: #ifndef FLEXNAMES
152: return(eqpatr(pat, str, 0));
153: #else
154: return(eqpatr(pat, str));
155: #endif
156: }
157:
158: #ifndef FLEXNAMES
159: eqpatr(pat, str, cnt)
160: #else
161: eqpatr(pat, str)
162: #endif
163: char *pat, *str; {
164: register int i;
165: register char p, s;
166:
167: p = pat[0];
168: s = str[0];
169: #ifndef FLEXNAMES
170: if (cnt == 8) return(1);
171: #endif
172: if (p == '?') {
173: if (s == '\0') return(0);
174: #ifndef FLEXNAMES
175: return(eqpatr(pat+1, str+1, cnt+1));
176: #else
177: return(eqpatr(pat+1, str+1));
178: #endif
179: }
180: if (p == '*') {
181: if (pat[1] == '\0') return(1);
182: #ifndef FLEXNAMES
183: for(i=1; i<8-cnt; i++) {
184: if (eqpatr(pat+1, str+i, cnt+i)) return(1);
185: #else
186: for(i=1; ; i++) {
187: if (eqpatr(pat+1, str+i)) return(1);
188: #endif
189: if (str[i] == '\0') return(0);
190: }
191: #ifndef FLEXNAMES
192: return(0);
193: #else
194: /*NOTREACHED*/
195: #endif
196: }
197: if ((eqany(p, ".[->") || p == '\0') && s == '\0') return(1);
198: if (p != s) return(0);
199: #ifndef FLEXNAMES
200: return(eqpatr(pat+1, str+1, cnt+1));
201: #else
202: return(eqpatr(pat+1, str+1));
203: #endif
204: }
205:
206: /* gets indirect address for pointers and subscripts */
207: getindir(class, addr, type)
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.