|
|
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.