|
|
1.1 root 1: #include "head.h"
2: #include <a.out.h>
3: #include "cdefs.h"
4: #include <stdio.h>
5: struct user u;
6:
7: char *
8: readline(f)
9: FILE *f; {
10: static char buff[128];
11:
12: register char *p;
13: register int i;
14:
15: p = buff;
16: do {
17: if ((i = getc(f)) == EOF) {
18: *p++ = '\004';
19: *p = '\n';
20: }
21: else *p = i;
22: } while (*p++ != '\n');
23:
24: return(buff);
25: }
26:
27: char *
28: cpname(p, q)
29: char *p, *q; {
30: while(varchar(*q) || number(*q))
31: *p++ = *q++;
32: *p = '\0';
33: return(q);
34: }
35:
36: char *
37: cpall(p, q)
38: char *p, *q; {
39: while (*q != '\n')
40: *p++ = *q++;
41: *p = '\0';
42: return(q);
43: }
44:
45: eqany(c, s)
46: char c, *s; {
47: while(*s != '\0')
48: if (c == *s++) return(1);
49: return(0);
50: }
51:
52: error(s)
53: char *s; {
54: printf("%s\n", s);
55: }
56:
57: char *
58: cpstr(p,q)
59: char *p, *q; {
60: do {
61: *p++ = *q++;
62: } while (*q != '\0');
63: *p = '\0';
64: }
65: L_INT
66: round(a,b)
67: REG L_INT a, b;
68: {
69: REG L_INT w;
70: w = (a/b)*b;
71: IF a!=w THEN w += b; FI
72: return(w);
73: }
74:
75: /* error handling */
76:
77: chkerr()
78: {
79: IF errflg ORF mkfault
80: THEN error(errflg);
81: longjmp(env, 0);
82: FI
83: }
84:
85: eqstr(s1, s2)
86: REG STRING s1, s2;
87: {
88: REG STRING es1;
89: if (s2 == (STRING) -1) return(0);
90: es1 = s1+8;
91: WHILE *s1++ == *s2
92: DO IF *s2++ == 0 ORF s1>=es1
93: THEN return(1);
94: FI
95: OD
96: return(0);
97: }
98:
99: longseek(f, a)
100: L_INT a;
101: {
102: return(lseek(f,(long) a,0) != -1);
103: }
104:
105:
106: /* descriptor format to length */
107: dtol(d)
108: char d; {
109: switch(d) {
110:
111: case 'a':
112: case 's':
113: return(0);
114:
115: case 'b':
116: case 'c':
117: return(1);
118:
119: case 'h':
120: return(2);
121:
122: case 'l':
123: case 'f':
124: return(4);
125:
126: case 'g':
127: return(8);
128:
129: default:
130: return(WORDSIZE);
131: }
132: }
133:
134: /*
135: * checks equality of pattern pat with str,
136: * assuming str is tructaed at length 8
137: */
138: eqpat(pat, str)
139: char *pat, *str; {
140: return(eqpatr(pat, str, 0));
141: }
142:
143: eqpatr(pat, str, cnt)
144: char *pat, *str; {
145: register int i;
146: register char p, s;
147:
148: p = pat[0];
149: s = str[0];
150: if (cnt == 8) return(1);
151: if (p == '?') {
152: if (s == '\0') return(0);
153: return(eqpatr(pat+1, str+1, cnt+1));
154: }
155: if (p == '*') {
156: if (pat[1] == '\0') return(1);
157: for(i=1; i<8-cnt; i++) {
158: if (eqpatr(pat+1, str+i, cnt+i)) return(1);
159: if (str[i] == '\0') return(0);
160: }
161: return(0);
162: }
163: if ((eqany(p, ".[->") || p == '\0') && s == '\0') return(1);
164: if (p != s) return(0);
165: return(eqpatr(pat+1, str+1, cnt+1));
166: }
167:
168: /* gets indirect address for pointers and subscripts */
169: getindir(class, addr, type)
170: ADDR addr; {
171: if (ISARY(type)) return(addr);
172: if (class == N_RSYM)
173: return(*(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr));
174: return(getval(addr, 'd'));
175: }
176:
177: long
178: readint(p)
179: char **p; {
180: int sign;
181:
182: if (**p == '-') {
183: sign = -1;
184: (*p)++;
185: } else {
186: sign = 1;
187: }
188: if (**p == '0') {
189: (*p)++;
190: if (**p == 'x' || **p == 'X') {
191: (*p)++;
192: return(sign * rint(p, 16, hexdigit, hexconv));
193: }
194: else return(sign * rint(p, 8, octdigit, octconv));
195: }
196: else return(sign * rint(p, 10, decdigit, decconv));
197: }
198:
199: long
200: rint(p, base, digit, conv)
201: char **p;
202: int (*digit)(), (*conv)(); {
203: long value;
204:
205: value = 0;
206: while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++);
207: return(value);
208: }
209:
210: octdigit(c)
211: char c; {
212: return(c >= '0' && c <= '7');
213: }
214:
215: octconv(c)
216: char c; {
217: return(c - '0');
218: }
219:
220: decdigit(c)
221: char c; {
222: return(c >= '0' && c <= '9');
223: }
224:
225: decconv(c)
226: char c; {
227: return(c - '0');
228: }
229:
230: hexdigit(c)
231: char c; {
232: return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
233: (c >= 'A' && c <= 'F'));
234: }
235:
236: hexconv(c)
237: char c; {
238: if (c >= '0' && c <= '9') return(c - '0');
239: if (c >= 'a' && c <= 'f') return(c - 'a' + 10);
240: if (c >= 'A' && c <= 'F') return(c - 'A' + 10);
241: error("hex conversion error");
242: return(0);
243: }
244:
245: /* decodes number, character or variable */
246: long
247: argvalue(p)
248: char *p; {
249: register char ch;
250: register long value;
251: register ADDR j;
252: char var[30];
253:
254: ch = *p;
255: if (ch == '\'') {
256: value = *(p+1);
257: } else if ((ch >= '0' && ch <= '9') || ch == '-') {
258: value = readint(&p);
259: } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
260: ch == '_') {
261: cpname(var, p);
262: j = varaddr(curproc()->pname, var);
263: if (j == -1) {
264: printf("Unknown variable: %s\n", argsp);
265: return(-1);
266: }
267: value = getval(j, typetodesc(sl_type, 0)[0]);
268: do {
269: p++;
270: } while (varchar(*p) || number(*p));
271: }
272: return(value);
273: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.