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