File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / usr / src / bin / cdb / files.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:24:19 2019 UTC (7 years ago) by root
Branches: bsd, MAIN
CVS tags: v12b, v121, HEAD
Power 6/32 Unix version 1.2b

static char sccsid[] = "@(#)files.c	2.7";

#include <stdio.h>
#include "cdb.h"
#include "macdefs.h"


FILE	*vfpSrc;	/* source file of current interest */
export int	vfnDecl;	/* declarations file of current interest */

export FLAGT	vfPascal;	/* if true, vifd is a pascal source file */
export int	vcbTot;	/* used for debugging - # bytes allocated at present */

#define idirMax	16	/* maximum number of alternate directories */
local char	*vrgSbDir[idirMax];	/* a list of directory names */

local short	vidirMac;



/* A D D   D I R */

export void AddDir(sbDir)
char	*sbDir;
{
	if (vidirMac >= idirMax)
		UError("No more room for directories");
	vrgSbDir[vidirMac] = malloc(strlen(sbDir)+1);
	strcpy(vrgSbDir[vidirMac], sbDir);
	vidirMac++;
} /* AddDir */


/* L I S T   D I R */

export void ListDir()
{
	short	i;
	for (i=0; i < vidirMac; i++)
		printf("%s\n", vrgSbDir[i]);
} /* ListDir */


/* F P   F   S B */

local FILE *FpFSb(sbFile, sbFlags)
char	*sbFile, *sbFlags;
{
	short	i;
	char	sbTemp[80];
	FILE	*fp;

	fp = NULL;
	sbTemp[0] = 0;
	if ((sbFile[0] != '/') AND (vidirMac > 0)) {
		for (i=0; i < vidirMac; i++) {
			strcpy(sbTemp, vrgSbDir[i]);
			strcat(sbTemp, "/");
			strcat(sbTemp, sbFile);
			/* try to open it */
			fp = fopen(sbTemp, sbFlags);
			if (fp != NULL)
				break;
		} /* for */
	} /* if */

	if (fp == NULL) {
		/* failed elsewhere, exist locally? */
		strcpy(sbTemp, sbFile);
		fp = fopen(sbTemp, sbFlags);
	}
	if (fp != NULL)
		strcpy(sbFile, sbTemp);
	return(fp);
} /* FpFSb */


/* S E T   R G   L N */

local void SetRgLn(ifdIn, fp)
int	ifdIn;
FILE	*fp;
{
	int		cbNew;
	uint	*rgLn;
	char	buf[200];
	int		ifd, iln, ilnMac;

	iln = 0;
	rewind(fp);
	while (fgets(buf, 200, fp) != NULL)
		iln++;
	iln++;	/* this array is 1 based, not zero */
	cbNew = iln * CBINT;
	rgLn = (uint *) malloc(cbNew);  /* get enough space for line array */
	if (rgLn == 0) {
		for (ifd=0; ifd<vifdMac; ifd++) {
			if (vrgFd[ifd].ilnMac != ilnNil) {
				free(vrgFd[ifd].rgLn);
				vcbTot -= vrgFd[ifd].ilnMac * 2;
				vrgFd[ifd].ilnMac = ilnNil;
				rgLn = (uint *) malloc(cbNew);  /* try again */
				if (rgLn != 0)
					break;
			} /* if */
		} /* for */
		if (ifd >= vifdMac)
			Panic("Memory problems in SetRgLn");
	} /* if */
	vcbTot += cbNew;
	vrgFd[ifdIn].ilnMac = iln;
	vrgFd[ifdIn].rgLn = rgLn;
	rewind(fp);	/* once more, from the top */
	ilnMac = iln;
	for (iln=1; iln < ilnMac; iln++) {
		rgLn[iln] = ftell(fp);
		if (fgets(buf, 200, fp) == NULL)
			break;
	} /* for */
} /* SetRgLn */


/* I P D   F   A D R */

export int IpdFAdr(adr)
ADRT	adr;
{
	int 	ipd;

	if (vrgPd[vipd].adrStart <= adr
	    AND vrgPd[vipd+1].adrStart > adr)
		return(vipd);

	for (ipd=0; ipd < vipdMac; ipd++) {
		if (vrgPd[ipd].adrStart >= adr) {
			if (vrgPd[ipd].adrStart > adr)
				ipd--;
			return(ipd);
		} /* if */
	} /* for */
	return(ipdNil);
} /* IpdFAdr */


/* I P D   F   N A M E */

export int IpdFName(sbProc)
char	*sbProc;
{
	int		ipd;

	if ((vipd != ipdNil)
	    AND (FSbCmp(vrgPd[vipd].sbProc, sbProc)) )
		return(vipd);

	for (ipd=0; ipd < vipdMac; ipd++)	/* try for an EXACT match first */
		if (FSbCmp(vrgPd[ipd].sbProc, sbProc))
			return(ipd);

	for (ipd=0; ipd < vipdMac; ipd++)	/* no good, go for approximate */
		if (FProcCmp(vrgPd[ipd].sbProc, sbProc))
			return(ipd);

	return(ipdNil);
} /* IpdFName */


/* O P E N   I P D */

export void OpenIpd(ipd, fForce)
int	ipd;
FLAGT	fForce;
{
	if (ipd == ipdNil) {
		vipd = ipdNil;
		return;
	} /* if */

	if (!fForce & (ipd == vipd))
		return;

	IfdFOpen(IfdFAdr(vrgPd[ipd].adrStart));	/* open parent file */
	viln = IlnFIsym(vrgPd[ipd].isym+1);	/* find line #, start with next sym */
	if (viln == ilnNil) {
		printf("WARNING: %s does not appear to have line symbols\n",
		vrgFd[vifd].sbFile);
#ifdef BSD41
	} 
	else {
		if (!vfPascal) {
			visym++;	/* we actually want the NEXT one for berkeley C */
			viln = IlnFIsym(visym);
		}
#endif
	} /* if */
	vipd = ipd;
	vslop = 0;
} /* OpenIpd */


/* I F D   F   O P E N */

export int IfdFOpen(ifd)
int	ifd;
{
	char	sbTemp[80], *sbT;
	long	mtimeSrc;
	pFDR	fd;
	FILE	*fp;

	/* we use vifdTemp for `un-related' files */
	if ( (ifd == vifdTemp) AND (vrgFd[vifdTemp].ilnMac != ilnNil) ) {
		/* ie. there was already a file connected with vifdTemp */
		free(vrgFd[vifdTemp].rgLn);
		vcbTot -= vrgFd[vifdTemp].ilnMac * 2;
		vrgFd[vifdTemp].ilnMac = ilnNil;
		vifd = vifdNil;
	} /* if */

	if (ifd < 0 OR ifd >= vifdMac) {
		vifd = vifdNil;
		return(vifdNil);
	} /* if */

	if (ifd == vifd)
		return(ifd);

	/* let's get rid of currently open stuff */
	if (vfpSrc != NULL) {
		fclose(vfpSrc);	/* there is a currently open file */
		vfpSrc = NULL;
	} /* if */
	vifd = vifdNil;
#ifdef SYSIII
	if (vfnDecl != fnNil) {
		close(vfnDecl);
		vfnDecl = fnNil;
		vityMac = 0;
	} /* if */
#endif

	fd = vrgFd + ifd;
	strcpy(sbTemp, (ifd==vifdTemp) ? vsbFileTemp : fd->sbFile);
	fp = FpFSb(sbTemp, "r");
	if (fp == NULL) {
		if (ifd != vifdTemp)
			UError("Cannot open `%s'\n", sbTemp);
		else
			return(vifdNil);
	} /* if */
	vfpSrc = fp;
	vipd = vrgFd[ifd].ipd;
	viln = 1;
	vslop = 0;
	vifd = ifd;

	if (fd->ilnMac == ilnNil) {
		/* we need to see its age and build line array */
		mtimeSrc = AgeFFn(fileno(vfpSrc));
		if (!fd->fWarned AND mtimeSrc > vmtimeSym)
			printf("WARNING: %s is younger than %s\n", sbTemp, vsbSymfile);
		SetRgLn(ifd, vfpSrc);	/* figure out line {nings */
	} /* if */

#ifdef BSD41
	sbT = strrchr(sbTemp, '.') + 1;
	if (*sbT == 'p') {
		/* it would appear to be a pascal source file */
		vfPascal = true;
	} 
	else {
		vfPascal = false;
	}
#endif
#ifdef SYSIII
	if (fd->fHasDecl) {	/* see if we can find a symbols file */
		sbT = strrchr(sbTemp, 'c');
		*sbT = 'd';
		if ((vfnDecl = open(sbTemp, O_RDONLY)) < 0) {
			vfnDecl = fnNil;
			fd->fHasDecl = false;
		} 
		else {
			if (!fd->fWarned AND mtimeSrc > AgeFFn(vfnDecl)) {
				*sbT = chNull;
				printf("WARNING: %sc is younger than %sd\n", sbTemp, sbTemp);
			} /* if */
			vityMac = CblFFn(vfnDecl) / cbTYR;
			InitTyCache();
		} /* if */
	} /* if */
#endif
	fd->fWarned = true;
	return(ifd);
} /* IfdFOpen */


/* I F D   F   A D R */

export int IfdFAdr(adr)
ADRT	adr;
{
	int		ifd;

	if ((vifd != vifdNil)
	    AND (vrgFd[vifd].adrStart <= adr)
	    AND (vrgFd[vifd+1].adrStart > adr))
		return(vifd);

	for (ifd=0; ifd < vifdMac; ifd++) {
		if (vrgFd[ifd].adrStart >= adr) {
			if (vrgFd[ifd].adrStart > adr)
				ifd--;
			return(ifd);
		} /* if */
	} /* for */
	return(vifdNil);
} /* IfdFAdr */


/* I F D   F   N A M E */

export int IfdFName(sbFile)
char	*sbFile;
{
	int 	ifd;

	if ((vifd != vifdNil)
	    AND FSbCmp(vrgFd[vifd].sbFile, sbFile))
		return(vifd);

	for (ifd=0; ifd < vifdMac; ifd++) {
		if (FSbCmp(vrgFd[ifd].sbFile, sbFile)) {
			return(ifd);
		} /* if */
	} /* for */
	return(vifdNil);
} /* IfdFName */


/* I F D   F   I P D */

export int IfdFIpd(ipd)
int	ipd;
{
	int		ifd;
	pFDR	fd;

	for (fd=vrgFd, ifd=0; ifd <= vifdMac; fd++, ifd++)
		if (fd->ipd < ipd)
			return(ifd);
	return(vifdNil);
} /* IfdFIpd */


/* P R I N T   L I N E */

export void PrintLine(iln, count, fPrintLn)
int	iln, count;
FLAGT	fPrintLn;
{
	long	offset;
	char	linebuf[200];

	if (vifd == vifdNil)
		UError("I have no source file for this address");
	if (iln == ilnNil)
		iln = 1;
	iln = Min(iln, vrgFd[vifd].ilnMac);
	count = Min(vrgFd[vifd].ilnMac-iln, count);
	offset = vrgFd[vifd].rgLn[iln];
	if (fseek(vfpSrc, offset, 0)) {
		Panic("Bad seek in PrintLine");
	} /* if */
	while (count--) {
		if (fgets(linebuf, 200, vfpSrc) == NULL)
			Panic("Bad read in PrintLine");
		if (fPrintLn)
			printf("%3d:", iln);
		printf("	%.72s", linebuf);
		iln++;
	} /* while */
	viln = iln - 1;	/* set to last line printed */
} /* PrintLine */


/* I   F   S B   S B */

export int IFSbSb(sbLine, sbTarget)
char	*sbLine, *sbTarget;
{
	int 	cbLine, cbTarget, i;

	i = 0;	/* the index of sbTarget in sbLine */
	cbLine = strlen(sbLine);
	cbTarget = strlen(sbTarget);
	while (cbLine >= cbTarget) {
		if (FHdrCmp(sbTarget, sbLine))
			return(i);
		i++;
		sbLine++;
		cbLine--;
	} /* while */
	return(-1);
} /* IFSbSb */


/* F I N D */

export void Find(target, fBack)
char	*target;
FLAGT	fBack;
{
	int		lineinc, count, iln, ilnStart, ilnMac;
	uint	*rgLn;
	char	linebuf[200];

	iln = viln;
	ilnMac = vrgFd[vifd].ilnMac;
	rgLn = vrgFd[vifd].rgLn;
	if (fBack) {
		lineinc = -1;
		iln--;  /* for backup */
		count = iln;
	} 
	else {
		lineinc = 1;
		iln++;  /* start at next line */
		count = ilnMac - iln;
	} /* if */
	ilnStart = iln;

	if (fseek(vfpSrc, lengthen(rgLn[iln]), 0))
		Panic("Bad seek in Find - offset %d",rgLn[iln]);
	while (count--) {
		if (fBack)
			if (fseek(vfpSrc, lengthen(rgLn[iln]), 0))
				Panic("Bad seek in Find - offset %d",rgLn[iln]);
		if (fgets(linebuf, 200, vfpSrc) == NULL)
			Panic("Bad read in Find");
		if (IFSbSb(linebuf, target) >= 0)
			goto winner;
		iln += lineinc;
	} /* while */

	/* that didn't work, try it from the top of file */
	if (fBack) {
		iln = ilnMac - 1;
		count = ilnMac - ilnStart - 1;
	} 
	else {
		iln = 1;
		count = ilnStart;
	} /* if */
	if (fseek(vfpSrc, lengthen(rgLn[iln]), 0))
		Panic("Bad seek in Find");
	while (count--) {
		if (fBack)
			if (fseek(vfpSrc, lengthen(rgLn[iln]), 0))
				Panic("Bad seek in Find");
		if (fgets(linebuf, 200, vfpSrc) == NULL)
			Panic("Bad read in Find");
		if (IFSbSb(linebuf, target) >= 0)
			goto winner;
		iln += lineinc;
	} /* while */
	UError("No Match - %s", target);

winner:
	PrintLine(iln, 1, true);
} /* Find */


/* P R I N T   P O S */

export void PrintPos(adr, fmt)
ADRT	adr;
int	fmt;
{
	int 	ifd, iln, slop, ifdSave, ipdSave, ilnSave, slopSave;

	if (fmt & fmtSave) {
		ifdSave = vifd;
		ipdSave = vipd;
		ilnSave = viln;
		slopSave = vslop;
	} /* if */

	if (adr != adrNil) {
		IfdLnFAdr(adr, isym0, &ifd, &iln, &slop);
		if (ifd != vifdNil) {
			IfdFOpen(ifd);
			OpenIpd(IpdFAdr(adr), false);
			vslop = slop;
			viln = iln;
		} 
		else {
			vifd = vifdNil;
		} /* if */
		if (fmt == fmtNil)
			return;
	} /* if */

	if (vifd == vifdNil) {
		LabelFAdr(adr);	/* sets vsymCur to nearest label */
		if (fmt & fmtFile)
			printf("file unknown:");
		printf("**%s",SbInCore(vsymCur->sbSym));
		if (vsymCur->value != adr)
			printf("+%s",SbFAdr(lengthen(adr-vsymCur->value), true));
		putchar('\n');	
		goto cleanup;
	} /* if */

	if (fmt & fmtFile) {
		printf("%s:", vrgFd[vifd].sbFile);
	} /* if */

	if (fmt & fmtProc) {
		if (vipd != ipdNil) {
			printf("%s:",vrgPd[vipd].sbProc);
		} 
		else {
			printf("proc??:");
		} /* if */
	} /* if */

	if (fmt & fmtLn) {
		printf("%d", viln);
		if (vslop != 0)
			printf("+%s",SbFAdr(lengthen(vslop), true));
		putchar(':');
	} /* if */

	if (fmt & fmtPrint)
		PrintLine(viln, 1, false);
	else {
		printf(" ");	/* takes out last `:' */
		if (fmt & fmtEol)
			putchar('\n');
	} /* if */

cleanup:
	if (fmt & fmtSave) {
		vifd = vifdNil;
		IfdFOpen(ifdSave);
		vipd = ipdSave;
		viln = ilnSave;
		vslop = slopSave;
	} /* if */
} /* PrintPos */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.