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