xref: /original-bsd/old/vpr/vtools/vfontinfo.c (revision 55330032)
1 static char *sccsid = "@(#)vfontinfo.c	4.1 (Berkeley) 10/01/80";
2 /* Font Information for VCat-style fonts
3  *      AJH  4/79
4  *
5  *	Modified to print Ascii chars 1/80 by Mark Horton
6  */
7 #include <stdio.h>
8 #include <ctype.h>
9 #include <vfont.h>
10 
11 struct header FontHeader;
12 struct dispatch disptable[256] ;
13 
14 char	IName[100];
15 char *	rdchar();
16 long	fbase;
17 
18 char	defascii[256];
19 char	*charswanted = defascii;
20 int	verbose;
21 char	charbits[4000];
22 int	H, W, WB;
23 
24 main(argc,argv)
25 int argc;
26 char **argv;
27 
28 {
29 	int FID,i,j;
30 
31 	if (argc > 1 && argv[1][0] == '-') {
32 		switch(argv[1][1]) {
33 		case 'v':
34 			verbose++;
35 			break;
36 		default:
37 			printf("Bad flag: %s\n", argv[1]);
38 		}
39 		argc--; argv++;
40 	}
41 	if (argc < 2) {
42 		fprintf(stderr,"Usage: %s filename", argv[0]);
43 		exit(2);
44 	}
45 
46 	for (i=0; i<128; i++)
47 		defascii[i] = i;
48 	if (argc >= 3)
49 		charswanted = argv[2];
50 
51 	sprintf(IName,"/usr/lib/vfont/%s",argv[1]);
52 	if ((FID = open(argv[1],0)) < 0)
53 		if ((FID = open(IName,0)) < 0) {
54 			printf("Can't find %s\n",argv[1]);
55 			exit(8);
56 		};
57 
58 	if (read(FID,&FontHeader,sizeof FontHeader) != sizeof FontHeader)
59 		error("Bad header in Font file.");
60 
61 	if (read(FID,&disptable[0],sizeof disptable) != sizeof disptable)
62 		error("Bad dispatch table in Font file");
63 
64 	fbase = sizeof FontHeader + sizeof disptable;
65 
66 	if (FontHeader.magic != 0436)
67 	printf("Magic number %o wrong\n", FontHeader.magic);
68 	printf("Font %s, ",argv[1]);
69 	printf("raster size %d, ",FontHeader.size);
70 	printf("max width %d, max height %d, xtend %d\n",
71 		FontHeader.maxx, FontHeader.maxy,FontHeader.xtend);
72 	printf("\n ASCII     offset    size  left    right   up     down    width \n");
73 
74 	for (i=0; i<256; i++) {
75 		j = charswanted[i];
76 		if (i>0 && j==0)
77 			break;
78 		if (disptable[j].nbytes != 0) {
79 			printf("  %3o %2s     %4d   %4d   %4d   %4d   %4d   %4d   %5d\n",
80 				j, rdchar(j),
81 				disptable[j].addr,
82 				disptable[j].nbytes,
83 				disptable[j].left,
84 				disptable[j].right,
85 				disptable[j].up,
86 				disptable[j].down,
87 				disptable[j].width);
88 			if (verbose) {
89 				int len = disptable[j].nbytes;
90 				int k, l, last;
91 
92 				lseek(FID, fbase+disptable[j].addr, 0);
93 				read(FID, charbits, len);
94 				H = (disptable[j].up) + (disptable[j].down);
95 				W = (disptable[j].left) + (disptable[j].right);
96 				WB = (W+7)/8;
97 				for (k=0; k<H; k++) {
98 					for (last=W-1; last >= 0; last--)
99 						if (fbit(k, last))
100 							break;
101 					for (l=0; l<=last; l++) {
102 						printf("%c", fbit(k,l)?'M':' ');
103 					}
104 					printf("\n");
105 				}
106 				printf("\n");
107 			}
108 		}
109 	};
110 }
111 
112 error(string)
113 char *string;
114 
115 {
116 	printf("\nvfontinfo: %s\n",string);
117 	exit(8);
118 };
119 
120 char *rdchar(c)
121 char c;
122 {
123 	static char ret[3];
124 	ret[0] = isprint(c) ? ' ' : '^';
125 	ret[1] = isprint(c) ?  c  : c^0100;
126 	ret[2] = 0;
127 	return (ret);
128 }
129 
130 int
131 fbit(row, col)
132 int row, col;
133 {
134 	int thisbyte, thisbit, ret;
135 
136 	thisbyte = charbits[row*WB + (col>>3)] & 0xff;
137 	thisbit = 0x80 >> (col&7);
138 	ret = thisbyte & thisbit;
139 	return (ret != 0);
140 }
141