1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)rotate.c 5.1 (Berkeley) 05/15/85"; 9 #endif not lint 10 11 /* 12 * Rotate a Varian/Versatec font. 13 */ 14 15 #include <stdio.h> 16 #include <vfont.h> 17 #include <sys/types.h> 18 #include <sys/stat.h> 19 20 char *chp; 21 char *sbrk(); 22 23 main(argc,argv) 24 char **argv; 25 { 26 struct header h; 27 struct dispatch d[256], nd; 28 struct stat stb; 29 off_t tell(); 30 int i,size; 31 int beg; 32 char scr[2048]; 33 34 argc--, argv++; 35 if (argc > 0) { 36 close(0); 37 if (open(argv[0], 0) < 0) 38 perror(argv[0]), exit(1); 39 } 40 if (read(0, &h, sizeof(h)) != sizeof(h)) { 41 fprintf(stderr, "header read error\n"); 42 exit(1); 43 } 44 if (h.magic != 0436) { 45 fprintf(stderr, "bad magic number\n"); 46 exit(1); 47 } 48 if (read(0, d, sizeof(d)) != sizeof(d)) { 49 fprintf(stderr, "dispatch read error\n"); 50 exit(1); 51 } 52 fstat(0, &stb); 53 size = stb.st_size - tell(0); 54 fprintf(stderr, "%d bytes of characters\n", size); 55 chp = sbrk(size + 1024); 56 read(0, chp, size); 57 write(1, &h, sizeof (h)); 58 write(1, d, sizeof (d)); 59 beg = tell(1); 60 for (i = 0; i < 256; i++) 61 if (d[i].nbytes) { 62 if (d[i].addr + d[i].nbytes > size) { 63 fprintf(stderr, "char %d out of range\n", i); 64 continue; 65 } 66 cvt(&d[i], chp+d[i].addr, &nd, scr); 67 d[i] = nd; 68 d[i].addr = tell(1) - beg; 69 write(1, scr, d[i].nbytes); 70 } 71 fprintf(stderr, "done, new size %d\n", tell(1) - beg); 72 h.size = tell(1) - beg; 73 lseek(1, 0, 0); 74 write(1, &h, sizeof (h)); 75 write(1, d, sizeof (d)); 76 } 77 78 cvt(odp, ocp, dp, cp) 79 struct dispatch *odp, *dp; 80 register char *ocp, *cp; 81 { 82 int max; 83 int bpl; 84 int row,byte,bit; 85 register char *ep; 86 register int bitoff; 87 register int bits; 88 int extra; 89 90 max = (odp->up+odp->down+7)/8; 91 extra = max*8 - (odp->down+odp->up); 92 dp->down = odp->down; 93 dp->up = odp->up; 94 dp->left = odp->left; 95 dp->right = odp->right; 96 dp->nbytes = max*(dp->right+dp->left); 97 ep = cp; 98 for (byte = 0; byte < dp->nbytes; byte++) 99 *ep++ = 0; 100 bpl = (dp->right+dp->left+7)/8; 101 for (row = 0; row < odp->up+odp->down; row++) { 102 for (byte = 0; byte < bpl; byte++) { 103 bits = *ocp++; 104 for (bit = 0; bit < 8; bit++) { 105 if (bits & 0x80) { 106 ep = cp + max*(byte*8+bit); 107 bitoff = max*8 - row - 1 - extra; 108 ep += (bitoff/8); 109 *ep |= 0x80 >> (bitoff%8); 110 } 111 bits <<= 1; 112 } 113 } 114 } 115 } 116