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