|
|
1.1 ! root 1: static char sccsid[] = "@(#)files.c 2.7"; ! 2: ! 3: #include <stdio.h> ! 4: #include "cdb.h" ! 5: #include "macdefs.h" ! 6: ! 7: ! 8: FILE *vfpSrc; /* source file of current interest */ ! 9: export int vfnDecl; /* declarations file of current interest */ ! 10: ! 11: export FLAGT vfPascal; /* if true, vifd is a pascal source file */ ! 12: export int vcbTot; /* used for debugging - # bytes allocated at present */ ! 13: ! 14: #define idirMax 16 /* maximum number of alternate directories */ ! 15: local char *vrgSbDir[idirMax]; /* a list of directory names */ ! 16: ! 17: local short vidirMac; ! 18: ! 19: ! 20: ! 21: /* A D D D I R */ ! 22: ! 23: export void AddDir(sbDir) ! 24: char *sbDir; ! 25: { ! 26: if (vidirMac >= idirMax) ! 27: UError("No more room for directories"); ! 28: vrgSbDir[vidirMac] = malloc(strlen(sbDir)+1); ! 29: strcpy(vrgSbDir[vidirMac], sbDir); ! 30: vidirMac++; ! 31: } /* AddDir */ ! 32: ! 33: ! 34: /* L I S T D I R */ ! 35: ! 36: export void ListDir() ! 37: { ! 38: short i; ! 39: for (i=0; i < vidirMac; i++) ! 40: printf("%s\n", vrgSbDir[i]); ! 41: } /* ListDir */ ! 42: ! 43: ! 44: /* F P F S B */ ! 45: ! 46: local FILE *FpFSb(sbFile, sbFlags) ! 47: char *sbFile, *sbFlags; ! 48: { ! 49: short i; ! 50: char sbTemp[80]; ! 51: FILE *fp; ! 52: ! 53: fp = NULL; ! 54: sbTemp[0] = 0; ! 55: if ((sbFile[0] != '/') AND (vidirMac > 0)) { ! 56: for (i=0; i < vidirMac; i++) { ! 57: strcpy(sbTemp, vrgSbDir[i]); ! 58: strcat(sbTemp, "/"); ! 59: strcat(sbTemp, sbFile); ! 60: /* try to open it */ ! 61: fp = fopen(sbTemp, sbFlags); ! 62: if (fp != NULL) ! 63: break; ! 64: } /* for */ ! 65: } /* if */ ! 66: ! 67: if (fp == NULL) { ! 68: /* failed elsewhere, exist locally? */ ! 69: strcpy(sbTemp, sbFile); ! 70: fp = fopen(sbTemp, sbFlags); ! 71: } ! 72: if (fp != NULL) ! 73: strcpy(sbFile, sbTemp); ! 74: return(fp); ! 75: } /* FpFSb */ ! 76: ! 77: ! 78: /* S E T R G L N */ ! 79: ! 80: local void SetRgLn(ifdIn, fp) ! 81: int ifdIn; ! 82: FILE *fp; ! 83: { ! 84: int cbNew; ! 85: uint *rgLn; ! 86: char buf[200]; ! 87: int ifd, iln, ilnMac; ! 88: ! 89: iln = 0; ! 90: rewind(fp); ! 91: while (fgets(buf, 200, fp) != NULL) ! 92: iln++; ! 93: iln++; /* this array is 1 based, not zero */ ! 94: cbNew = iln * CBINT; ! 95: rgLn = (uint *) malloc(cbNew); /* get enough space for line array */ ! 96: if (rgLn == 0) { ! 97: for (ifd=0; ifd<vifdMac; ifd++) { ! 98: if (vrgFd[ifd].ilnMac != ilnNil) { ! 99: free(vrgFd[ifd].rgLn); ! 100: vcbTot -= vrgFd[ifd].ilnMac * 2; ! 101: vrgFd[ifd].ilnMac = ilnNil; ! 102: rgLn = (uint *) malloc(cbNew); /* try again */ ! 103: if (rgLn != 0) ! 104: break; ! 105: } /* if */ ! 106: } /* for */ ! 107: if (ifd >= vifdMac) ! 108: Panic("Memory problems in SetRgLn"); ! 109: } /* if */ ! 110: vcbTot += cbNew; ! 111: vrgFd[ifdIn].ilnMac = iln; ! 112: vrgFd[ifdIn].rgLn = rgLn; ! 113: rewind(fp); /* once more, from the top */ ! 114: ilnMac = iln; ! 115: for (iln=1; iln < ilnMac; iln++) { ! 116: rgLn[iln] = ftell(fp); ! 117: if (fgets(buf, 200, fp) == NULL) ! 118: break; ! 119: } /* for */ ! 120: } /* SetRgLn */ ! 121: ! 122: ! 123: /* I P D F A D R */ ! 124: ! 125: export int IpdFAdr(adr) ! 126: ADRT adr; ! 127: { ! 128: int ipd; ! 129: ! 130: if (vrgPd[vipd].adrStart <= adr ! 131: AND vrgPd[vipd+1].adrStart > adr) ! 132: return(vipd); ! 133: ! 134: for (ipd=0; ipd < vipdMac; ipd++) { ! 135: if (vrgPd[ipd].adrStart >= adr) { ! 136: if (vrgPd[ipd].adrStart > adr) ! 137: ipd--; ! 138: return(ipd); ! 139: } /* if */ ! 140: } /* for */ ! 141: return(ipdNil); ! 142: } /* IpdFAdr */ ! 143: ! 144: ! 145: /* I P D F N A M E */ ! 146: ! 147: export int IpdFName(sbProc) ! 148: char *sbProc; ! 149: { ! 150: int ipd; ! 151: ! 152: if ((vipd != ipdNil) ! 153: AND (FSbCmp(vrgPd[vipd].sbProc, sbProc)) ) ! 154: return(vipd); ! 155: ! 156: for (ipd=0; ipd < vipdMac; ipd++) /* try for an EXACT match first */ ! 157: if (FSbCmp(vrgPd[ipd].sbProc, sbProc)) ! 158: return(ipd); ! 159: ! 160: for (ipd=0; ipd < vipdMac; ipd++) /* no good, go for approximate */ ! 161: if (FProcCmp(vrgPd[ipd].sbProc, sbProc)) ! 162: return(ipd); ! 163: ! 164: return(ipdNil); ! 165: } /* IpdFName */ ! 166: ! 167: ! 168: /* O P E N I P D */ ! 169: ! 170: export void OpenIpd(ipd, fForce) ! 171: int ipd; ! 172: FLAGT fForce; ! 173: { ! 174: if (ipd == ipdNil) { ! 175: vipd = ipdNil; ! 176: return; ! 177: } /* if */ ! 178: ! 179: if (!fForce & (ipd == vipd)) ! 180: return; ! 181: ! 182: IfdFOpen(IfdFAdr(vrgPd[ipd].adrStart)); /* open parent file */ ! 183: viln = IlnFIsym(vrgPd[ipd].isym+1); /* find line #, start with next sym */ ! 184: if (viln == ilnNil) { ! 185: printf("WARNING: %s does not appear to have line symbols\n", ! 186: vrgFd[vifd].sbFile); ! 187: #ifdef BSD41 ! 188: } ! 189: else { ! 190: if (!vfPascal) { ! 191: visym++; /* we actually want the NEXT one for berkeley C */ ! 192: viln = IlnFIsym(visym); ! 193: } ! 194: #endif ! 195: } /* if */ ! 196: vipd = ipd; ! 197: vslop = 0; ! 198: } /* OpenIpd */ ! 199: ! 200: ! 201: /* I F D F O P E N */ ! 202: ! 203: export int IfdFOpen(ifd) ! 204: int ifd; ! 205: { ! 206: char sbTemp[80], *sbT; ! 207: long mtimeSrc; ! 208: pFDR fd; ! 209: FILE *fp; ! 210: ! 211: /* we use vifdTemp for `un-related' files */ ! 212: if ( (ifd == vifdTemp) AND (vrgFd[vifdTemp].ilnMac != ilnNil) ) { ! 213: /* ie. there was already a file connected with vifdTemp */ ! 214: free(vrgFd[vifdTemp].rgLn); ! 215: vcbTot -= vrgFd[vifdTemp].ilnMac * 2; ! 216: vrgFd[vifdTemp].ilnMac = ilnNil; ! 217: vifd = vifdNil; ! 218: } /* if */ ! 219: ! 220: if (ifd < 0 OR ifd >= vifdMac) { ! 221: vifd = vifdNil; ! 222: return(vifdNil); ! 223: } /* if */ ! 224: ! 225: if (ifd == vifd) ! 226: return(ifd); ! 227: ! 228: /* let's get rid of currently open stuff */ ! 229: if (vfpSrc != NULL) { ! 230: fclose(vfpSrc); /* there is a currently open file */ ! 231: vfpSrc = NULL; ! 232: } /* if */ ! 233: vifd = vifdNil; ! 234: #ifdef SYSIII ! 235: if (vfnDecl != fnNil) { ! 236: close(vfnDecl); ! 237: vfnDecl = fnNil; ! 238: vityMac = 0; ! 239: } /* if */ ! 240: #endif ! 241: ! 242: fd = vrgFd + ifd; ! 243: strcpy(sbTemp, (ifd==vifdTemp) ? vsbFileTemp : fd->sbFile); ! 244: fp = FpFSb(sbTemp, "r"); ! 245: if (fp == NULL) { ! 246: if (ifd != vifdTemp) ! 247: UError("Cannot open `%s'\n", sbTemp); ! 248: else ! 249: return(vifdNil); ! 250: } /* if */ ! 251: vfpSrc = fp; ! 252: vipd = vrgFd[ifd].ipd; ! 253: viln = 1; ! 254: vslop = 0; ! 255: vifd = ifd; ! 256: ! 257: if (fd->ilnMac == ilnNil) { ! 258: /* we need to see its age and build line array */ ! 259: mtimeSrc = AgeFFn(fileno(vfpSrc)); ! 260: if (!fd->fWarned AND mtimeSrc > vmtimeSym) ! 261: printf("WARNING: %s is younger than %s\n", sbTemp, vsbSymfile); ! 262: SetRgLn(ifd, vfpSrc); /* figure out line {nings */ ! 263: } /* if */ ! 264: ! 265: #ifdef BSD41 ! 266: sbT = strrchr(sbTemp, '.') + 1; ! 267: if (*sbT == 'p') { ! 268: /* it would appear to be a pascal source file */ ! 269: vfPascal = true; ! 270: } ! 271: else { ! 272: vfPascal = false; ! 273: } ! 274: #endif ! 275: #ifdef SYSIII ! 276: if (fd->fHasDecl) { /* see if we can find a symbols file */ ! 277: sbT = strrchr(sbTemp, 'c'); ! 278: *sbT = 'd'; ! 279: if ((vfnDecl = open(sbTemp, O_RDONLY)) < 0) { ! 280: vfnDecl = fnNil; ! 281: fd->fHasDecl = false; ! 282: } ! 283: else { ! 284: if (!fd->fWarned AND mtimeSrc > AgeFFn(vfnDecl)) { ! 285: *sbT = chNull; ! 286: printf("WARNING: %sc is younger than %sd\n", sbTemp, sbTemp); ! 287: } /* if */ ! 288: vityMac = CblFFn(vfnDecl) / cbTYR; ! 289: InitTyCache(); ! 290: } /* if */ ! 291: } /* if */ ! 292: #endif ! 293: fd->fWarned = true; ! 294: return(ifd); ! 295: } /* IfdFOpen */ ! 296: ! 297: ! 298: /* I F D F A D R */ ! 299: ! 300: export int IfdFAdr(adr) ! 301: ADRT adr; ! 302: { ! 303: int ifd; ! 304: ! 305: if ((vifd != vifdNil) ! 306: AND (vrgFd[vifd].adrStart <= adr) ! 307: AND (vrgFd[vifd+1].adrStart > adr)) ! 308: return(vifd); ! 309: ! 310: for (ifd=0; ifd < vifdMac; ifd++) { ! 311: if (vrgFd[ifd].adrStart >= adr) { ! 312: if (vrgFd[ifd].adrStart > adr) ! 313: ifd--; ! 314: return(ifd); ! 315: } /* if */ ! 316: } /* for */ ! 317: return(vifdNil); ! 318: } /* IfdFAdr */ ! 319: ! 320: ! 321: /* I F D F N A M E */ ! 322: ! 323: export int IfdFName(sbFile) ! 324: char *sbFile; ! 325: { ! 326: int ifd; ! 327: ! 328: if ((vifd != vifdNil) ! 329: AND FSbCmp(vrgFd[vifd].sbFile, sbFile)) ! 330: return(vifd); ! 331: ! 332: for (ifd=0; ifd < vifdMac; ifd++) { ! 333: if (FSbCmp(vrgFd[ifd].sbFile, sbFile)) { ! 334: return(ifd); ! 335: } /* if */ ! 336: } /* for */ ! 337: return(vifdNil); ! 338: } /* IfdFName */ ! 339: ! 340: ! 341: /* I F D F I P D */ ! 342: ! 343: export int IfdFIpd(ipd) ! 344: int ipd; ! 345: { ! 346: int ifd; ! 347: pFDR fd; ! 348: ! 349: for (fd=vrgFd, ifd=0; ifd <= vifdMac; fd++, ifd++) ! 350: if (fd->ipd < ipd) ! 351: return(ifd); ! 352: return(vifdNil); ! 353: } /* IfdFIpd */ ! 354: ! 355: ! 356: /* P R I N T L I N E */ ! 357: ! 358: export void PrintLine(iln, count, fPrintLn) ! 359: int iln, count; ! 360: FLAGT fPrintLn; ! 361: { ! 362: long offset; ! 363: char linebuf[200]; ! 364: ! 365: if (vifd == vifdNil) ! 366: UError("I have no source file for this address"); ! 367: if (iln == ilnNil) ! 368: iln = 1; ! 369: iln = Min(iln, vrgFd[vifd].ilnMac); ! 370: count = Min(vrgFd[vifd].ilnMac-iln, count); ! 371: offset = vrgFd[vifd].rgLn[iln]; ! 372: if (fseek(vfpSrc, offset, 0)) { ! 373: Panic("Bad seek in PrintLine"); ! 374: } /* if */ ! 375: while (count--) { ! 376: if (fgets(linebuf, 200, vfpSrc) == NULL) ! 377: Panic("Bad read in PrintLine"); ! 378: if (fPrintLn) ! 379: printf("%3d:", iln); ! 380: printf(" %.72s", linebuf); ! 381: iln++; ! 382: } /* while */ ! 383: viln = iln - 1; /* set to last line printed */ ! 384: } /* PrintLine */ ! 385: ! 386: ! 387: /* I F S B S B */ ! 388: ! 389: export int IFSbSb(sbLine, sbTarget) ! 390: char *sbLine, *sbTarget; ! 391: { ! 392: int cbLine, cbTarget, i; ! 393: ! 394: i = 0; /* the index of sbTarget in sbLine */ ! 395: cbLine = strlen(sbLine); ! 396: cbTarget = strlen(sbTarget); ! 397: while (cbLine >= cbTarget) { ! 398: if (FHdrCmp(sbTarget, sbLine)) ! 399: return(i); ! 400: i++; ! 401: sbLine++; ! 402: cbLine--; ! 403: } /* while */ ! 404: return(-1); ! 405: } /* IFSbSb */ ! 406: ! 407: ! 408: /* F I N D */ ! 409: ! 410: export void Find(target, fBack) ! 411: char *target; ! 412: FLAGT fBack; ! 413: { ! 414: int lineinc, count, iln, ilnStart, ilnMac; ! 415: uint *rgLn; ! 416: char linebuf[200]; ! 417: ! 418: iln = viln; ! 419: ilnMac = vrgFd[vifd].ilnMac; ! 420: rgLn = vrgFd[vifd].rgLn; ! 421: if (fBack) { ! 422: lineinc = -1; ! 423: iln--; /* for backup */ ! 424: count = iln; ! 425: } ! 426: else { ! 427: lineinc = 1; ! 428: iln++; /* start at next line */ ! 429: count = ilnMac - iln; ! 430: } /* if */ ! 431: ilnStart = iln; ! 432: ! 433: if (fseek(vfpSrc, lengthen(rgLn[iln]), 0)) ! 434: Panic("Bad seek in Find - offset %d",rgLn[iln]); ! 435: while (count--) { ! 436: if (fBack) ! 437: if (fseek(vfpSrc, lengthen(rgLn[iln]), 0)) ! 438: Panic("Bad seek in Find - offset %d",rgLn[iln]); ! 439: if (fgets(linebuf, 200, vfpSrc) == NULL) ! 440: Panic("Bad read in Find"); ! 441: if (IFSbSb(linebuf, target) >= 0) ! 442: goto winner; ! 443: iln += lineinc; ! 444: } /* while */ ! 445: ! 446: /* that didn't work, try it from the top of file */ ! 447: if (fBack) { ! 448: iln = ilnMac - 1; ! 449: count = ilnMac - ilnStart - 1; ! 450: } ! 451: else { ! 452: iln = 1; ! 453: count = ilnStart; ! 454: } /* if */ ! 455: if (fseek(vfpSrc, lengthen(rgLn[iln]), 0)) ! 456: Panic("Bad seek in Find"); ! 457: while (count--) { ! 458: if (fBack) ! 459: if (fseek(vfpSrc, lengthen(rgLn[iln]), 0)) ! 460: Panic("Bad seek in Find"); ! 461: if (fgets(linebuf, 200, vfpSrc) == NULL) ! 462: Panic("Bad read in Find"); ! 463: if (IFSbSb(linebuf, target) >= 0) ! 464: goto winner; ! 465: iln += lineinc; ! 466: } /* while */ ! 467: UError("No Match - %s", target); ! 468: ! 469: winner: ! 470: PrintLine(iln, 1, true); ! 471: } /* Find */ ! 472: ! 473: ! 474: /* P R I N T P O S */ ! 475: ! 476: export void PrintPos(adr, fmt) ! 477: ADRT adr; ! 478: int fmt; ! 479: { ! 480: int ifd, iln, slop, ifdSave, ipdSave, ilnSave, slopSave; ! 481: ! 482: if (fmt & fmtSave) { ! 483: ifdSave = vifd; ! 484: ipdSave = vipd; ! 485: ilnSave = viln; ! 486: slopSave = vslop; ! 487: } /* if */ ! 488: ! 489: if (adr != adrNil) { ! 490: IfdLnFAdr(adr, isym0, &ifd, &iln, &slop); ! 491: if (ifd != vifdNil) { ! 492: IfdFOpen(ifd); ! 493: OpenIpd(IpdFAdr(adr), false); ! 494: vslop = slop; ! 495: viln = iln; ! 496: } ! 497: else { ! 498: vifd = vifdNil; ! 499: } /* if */ ! 500: if (fmt == fmtNil) ! 501: return; ! 502: } /* if */ ! 503: ! 504: if (vifd == vifdNil) { ! 505: LabelFAdr(adr); /* sets vsymCur to nearest label */ ! 506: if (fmt & fmtFile) ! 507: printf("file unknown:"); ! 508: printf("**%s",SbInCore(vsymCur->sbSym)); ! 509: if (vsymCur->value != adr) ! 510: printf("+%s",SbFAdr(lengthen(adr-vsymCur->value), true)); ! 511: putchar('\n'); ! 512: goto cleanup; ! 513: } /* if */ ! 514: ! 515: if (fmt & fmtFile) { ! 516: printf("%s:", vrgFd[vifd].sbFile); ! 517: } /* if */ ! 518: ! 519: if (fmt & fmtProc) { ! 520: if (vipd != ipdNil) { ! 521: printf("%s:",vrgPd[vipd].sbProc); ! 522: } ! 523: else { ! 524: printf("proc??:"); ! 525: } /* if */ ! 526: } /* if */ ! 527: ! 528: if (fmt & fmtLn) { ! 529: printf("%d", viln); ! 530: if (vslop != 0) ! 531: printf("+%s",SbFAdr(lengthen(vslop), true)); ! 532: putchar(':'); ! 533: } /* if */ ! 534: ! 535: if (fmt & fmtPrint) ! 536: PrintLine(viln, 1, false); ! 537: else { ! 538: printf(" "); /* takes out last `:' */ ! 539: if (fmt & fmtEol) ! 540: putchar('\n'); ! 541: } /* if */ ! 542: ! 543: cleanup: ! 544: if (fmt & fmtSave) { ! 545: vifd = vifdNil; ! 546: IfdFOpen(ifdSave); ! 547: vipd = ipdSave; ! 548: viln = ilnSave; ! 549: vslop = slopSave; ! 550: } /* if */ ! 551: } /* PrintPos */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.