4BSD/usr/src/cmd/vfontinfo.c

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

static char *sccsid = "@(#)vfontinfo.c	4.1 (Berkeley) 10/1/80";
/* Font Information for VCat-style fonts
 *      AJH  4/79
 *
 *	Modified to print Ascii chars 1/80 by Mark Horton
 */
#include <stdio.h>
#include <ctype.h>
#include <vfont.h>

struct header FontHeader;
struct dispatch disptable[256] ;

char	IName[100];
char *	rdchar();
long	fbase;

char	defascii[256];
char	*charswanted = defascii;
int	verbose;
char	charbits[4000];
int	H, W, WB;

main(argc,argv)
int argc;
char **argv;

{
	int FID,i,j;

	if (argc > 1 && argv[1][0] == '-') {
		switch(argv[1][1]) {
		case 'v':
			verbose++;
			break;
		default:
			printf("Bad flag: %s\n", argv[1]);
		}
		argc--; argv++;
	}
	if (argc < 2) {
		fprintf(stderr,"Usage: %s filename", argv[0]);
		exit(2);
	}

	for (i=0; i<128; i++)
		defascii[i] = i;
	if (argc >= 3)
		charswanted = argv[2];

	sprintf(IName,"/usr/lib/vfont/%s",argv[1]);
	if ((FID = open(argv[1],0)) < 0)
		if ((FID = open(IName,0)) < 0) { 
			printf("Can't find %s\n",argv[1]);
			exit(8); 
		};

	if (read(FID,&FontHeader,sizeof FontHeader) != sizeof FontHeader)
		error("Bad header in Font file.");

	if (read(FID,&disptable[0],sizeof disptable) != sizeof disptable)
		error("Bad dispatch table in Font file");

	fbase = sizeof FontHeader + sizeof disptable;

	if (FontHeader.magic != 0436)
	printf("Magic number %o wrong\n", FontHeader.magic);
	printf("Font %s, ",argv[1]);
	printf("raster size %d, ",FontHeader.size);
	printf("max width %d, max height %d, xtend %d\n",
		FontHeader.maxx, FontHeader.maxy,FontHeader.xtend);
	printf("\n ASCII     offset    size  left    right   up     down    width \n");

	for (i=0; i<256; i++) {
		j = charswanted[i];
		if (i>0 && j==0)
			break;
		if (disptable[j].nbytes != 0) {
			printf("  %3o %2s     %4d   %4d   %4d   %4d   %4d   %4d   %5d\n",
				j, rdchar(j),
				disptable[j].addr,
				disptable[j].nbytes,
				disptable[j].left,
				disptable[j].right,
				disptable[j].up,
				disptable[j].down,
				disptable[j].width);
			if (verbose) {
				int len = disptable[j].nbytes;
				int k, l, last;

				lseek(FID, fbase+disptable[j].addr, 0);
				read(FID, charbits, len);
				H = (disptable[j].up) + (disptable[j].down);
				W = (disptable[j].left) + (disptable[j].right);
				WB = (W+7)/8;
				for (k=0; k<H; k++) {
					for (last=W-1; last >= 0; last--)
						if (fbit(k, last))
							break;
					for (l=0; l<=last; l++) {
						printf("%c", fbit(k,l)?'M':' ');
					}
					printf("\n");
				}
				printf("\n");
			}
		}
	};
}

error(string)
char *string;

{ 
	printf("\nvfontinfo: %s\n",string);
	exit(8);
};

char *rdchar(c)
char c;
{
	static char ret[3];
	ret[0] = isprint(c) ? ' ' : '^';
	ret[1] = isprint(c) ?  c  : c^0100;
	ret[2] = 0;
	return (ret);
}

int
fbit(row, col)
int row, col;
{
	int thisbyte, thisbit, ret;

	thisbyte = charbits[row*WB + (col>>3)] & 0xff;
	thisbit = 0x80 >> (col&7);
	ret = thisbyte & thisbit;
	return (ret != 0);
}