1 static char sccsid[] = "@(#)sub.c 4.1 10/09/80"; 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 ADDR addr; { 208 if (ISARY(type)) return(addr); 209 if (class == N_RSYM) 210 return(*(ADDR *)(((ADDR) &u) + R0 + (WORDSIZE)*addr)); 211 return(getval(addr, 'd', DSP)); 212 } 213 214 long 215 readint(p) 216 char **p; { 217 int sign; 218 219 if (**p == '-') { 220 sign = -1; 221 (*p)++; 222 } else { 223 sign = 1; 224 } 225 if (**p == '0') { 226 (*p)++; 227 if (**p == 'x' || **p == 'X') { 228 (*p)++; 229 return(sign * rint(p, 16, hexdigit, hexconv)); 230 } 231 else return(sign * rint(p, 8, octdigit, octconv)); 232 } 233 else return(sign * rint(p, 10, decdigit, decconv)); 234 } 235 236 long 237 rint(p, base, digit, conv) 238 char **p; 239 int (*digit)(), (*conv)(); { 240 long value; 241 242 value = 0; 243 while ((*digit)(**p)) value = base*value + (*conv)(*(*p)++); 244 return(value); 245 } 246 247 octdigit(c) 248 char c; { 249 return(c >= '0' && c <= '7'); 250 } 251 252 octconv(c) 253 char c; { 254 return(c - '0'); 255 } 256 257 decdigit(c) 258 char c; { 259 return(c >= '0' && c <= '9'); 260 } 261 262 decconv(c) 263 char c; { 264 return(c - '0'); 265 } 266 267 hexdigit(c) 268 char c; { 269 return((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || 270 (c >= 'A' && c <= 'F')); 271 } 272 273 hexconv(c) 274 char c; { 275 if (c >= '0' && c <= '9') return(c - '0'); 276 if (c >= 'a' && c <= 'f') return(c - 'a' + 10); 277 if (c >= 'A' && c <= 'F') return(c - 'A' + 10); 278 error("hex conversion error"); 279 return(0); 280 } 281 282 /* decodes number, character or variable */ 283 long 284 argvalue(p) 285 char *p; { 286 register char ch; 287 register long value; 288 register ADDR j; 289 char var[30]; 290 291 ch = *p; 292 if (ch == '\'') { 293 value = *(p+1); 294 } else if ((ch >= '0' && ch <= '9') || ch == '-') { 295 value = readint(&p); 296 } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || 297 ch == '_') { 298 cpname(var, p); 299 j = varaddr(curproc()->pname, var); 300 if (j == -1) { 301 printf("Unknown variable: %s\n", argsp); 302 return(-1); 303 } 304 value = getval(j, typetodesc(sl_type, 0)[0], DSP); 305 do { 306 p++; 307 } while (varchar(*p) || number(*p)); 308 } 309 return(value); 310 } 311 312 prhex(v) 313 long v; { 314 if (v < 0) { 315 v = -v; 316 printf("-"); 317 } 318 if (v <= 9) 319 printf("%d", v); 320 else 321 printf("0x%x", v); 322 } 323 324 /* print hex number in field of length 12 */ 325 prhex12(v) 326 long v; { 327 if (v >= -9 && v <= 9) 328 printf("%-12d", v); 329 else 330 printf("0x%-12x", v); 331 } 332 333 /* print line number followed by offset */ 334 prlnoff(procp, v) 335 struct proct *procp; ADDR v; { 336 int lineno, diff; 337 char *name; 338 name = procp->pname; 339 if (name[0] == '_') { 340 #ifndef FLEXNAMES 341 printf("%.7s", name+1); 342 #else 343 printf("%s", name+1); 344 #endif 345 lineno = -1; 346 } else { 347 #ifndef FLEXNAMES 348 printf("%8s", name); 349 #else 350 printf("%s", name); 351 #endif 352 lineno = adrtolineno((ADDR) v); 353 } 354 if (lineno == -1) 355 diff = v - procp->paddr; 356 else { 357 printf(":%d", lineno); 358 diff = v - lnfaddr; /* set by adrtolineno() */ 359 } 360 if (diff) { 361 printf("+"); 362 prhex(diff); 363 } 364 } 365