V10/cmd/cbt/btreport.c

Compare this file to the similar file:
Show the results in this format:

#include "stdio.h"
#include "cbt.h"
#include "sys/types.h"
#include "sys/stat.h"
extern bfile *bopen();

long ndcnt[MXHT + 1];
long frcnt, reccnt, reclen;
bfile *bt;

main(argc, argv)
char **argv;
{	int i, j;
	for(i = 1; i < argc; i++) {
		doarg(argv[i]);
		for(j = 0; j <= MXHT; j++)
			ndcnt[j] = 0;
		frcnt = reccnt = reclen = 0;
		if(i+1 < argc)
			putchar('\n');
	}
	exit(0);
}

doarg(s)
char *s;
{	struct stat statbuf;
	long x;
	int i;
	bt = bopen(s, 0);
	if(bt == NULL) {
		i = strlen(s);
		if(s[i-2] == '.') {
			s[i-2] = 0;
			if(s[i-1] == 'F')
				return;
			if(s[i-1] == 'T')
				bt = bopen(s, 0);
		}
		if(bt == NULL) {
			perror(s);
			return;
		}
	}
	fstat(bt->tfd, &statbuf);
	printf("%s.T %ld bytes", s, statbuf.st_size);
	if(bt->dfd > 0 && fstat(bt->dfd, &statbuf) == 0)
		printf(", %s.F %ld bytes", s, statbuf.st_size);
	putchar('\n');
	donode((ndaddr)0);
	for(x = i = 0; i <= MXHT; i++)
		x += ndcnt[i] * NDSZ;
	printf("%ld bytes used in tree\n", x);
	for(i = 0; i <= bt->height; i++)
		printf(" %ld nodes at level %d", ndcnt[i], i);
	printf("\n%ld bytes free\n", frcnt);
	printf("%ld records totalling %ld bytes\n", reccnt, reclen);
	bclose(bt);
}

/* this routine believes the tree is well-formed */
donode(n)
ndaddr n;
{	char buf[NDSZ];
	hdr *b = (hdr *)buf;
	int i;
	(void) lseek(bt->tfd, (long)NDSZ * n, 0);
	i = read(bt->tfd, buf, NDSZ);
	if(i != NDSZ) {
		printf("btreport: attempt to read node %d failed\n", n);
		perror("breport");
		exit(1);
	}
	ndcnt[b->hlev]++;
	frcnt += nfree(b);
	if(b->hlev)
		for(i = 0; i <= b->kcnt; i++)
			donode(*ndadr(b, i));
	else
		for(i = 0; i < b->kcnt; i++) {
			reccnt++;
			if(!(b->htype & INDEX))
				reclen += lfadr(b, i)->llen;
		}
}