1 static char sccsid[] = "@(#)sub.c 4.2 08/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 } 366