BSD 3 development
[unix-history] / usr / src / cmd / sdb / sub.c
CommitLineData
b7523e3d
HK
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
57char *
58cpstr(p,q)
59char *p, *q; {
60 do {
61 *p++ = *q++;
62 } while (*q != '\0');
63 *p = '\0';
64}
65L_INT
66round(a,b)
67REG 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
77chkerr()
78{
79 IF errflg ORF mkfault
80 THEN error(errflg);
81 longjmp(env, 0);
82 FI
83}
84
85eqstr(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
99longseek(f, a)
100L_INT a;
101{
102 return(lseek(f,(long) a,0) != -1);
103}
104
105
106/* descriptor format to length */
107dtol(d)
108char 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 */
138eqpat(pat, str)
139char *pat, *str; {
140 return(eqpatr(pat, str, 0));
141}
142
143eqpatr(pat, str, cnt)
144char *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 */
169getindir(class, addr, type)
170ADDR 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
177long
178readint(p)
179char **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
199long
200rint(p, base, digit, conv)
201char **p;
202int (*digit)(), (*conv)(); {
203 long value;
204
205 value = 0;
206 while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++);
207 return(value);
208}
209
210octdigit(c)
211char c; {
212 return(c >= '0' && c <= '7');
213}
214
215octconv(c)
216char c; {
217 return(c - '0');
218}
219
220decdigit(c)
221char c; {
222 return(c >= '0' && c <= '9');
223}
224
225decconv(c)
226char c; {
227 return(c - '0');
228}
229
230hexdigit(c)
231char c; {
232 return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||
233 (c >= 'A' && c <= 'F'));
234}
235
236hexconv(c)
237char 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 */
246long
247argvalue(p)
248char *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}