BSD 4 release
[unix-history] / usr / src / cmd / vfontinfo.c
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);
}