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