BSD 4_1_snap development
[unix-history] / usr / src / cmd / vpr / rotate.c
CommitLineData
234a29f2
C
1#include <stdio.h>
2#include <vfont.h>
3#include <sys/types.h>
4#include <sys/stat.h>
5
6char *chp;
7char *sbrk();
8
9main(argc,argv)
10char **argv;
11{
12 struct header h;
13 struct dispatch d[256], nd;
14 struct stat stb;
15 off_t tell();
16 int i,size;
17 int beg;
18 char scr[2048];
19
20 argc--, argv++;
21 if (argc > 0) {
22 close(0);
23 if (open(argv[0], 0) < 0)
24 perror(argv[0]), exit(1);
25 }
26 if (read(0, &h, sizeof(h)) != sizeof(h))
27 fprintf(stderr, "header read error\n"), exit(1);
28 if (h.magic != 0436)
29 fprintf(stderr, "bad magic number\n"), exit(1);
30 if (read(0, d, sizeof(d)) != sizeof(d))
31 fprintf(stderr, "dispatch read error\n"), exit(1);
32 fstat(0, &stb);
33 size = stb.st_size - tell(0);
34 fprintf(stderr, "%d bytes of characters\n", size);
35 chp = sbrk(size + 1024);
36 read(0, chp, size);
37 write(1, &h, sizeof (h));
38 write(1, d, sizeof (d));
39 beg = tell(1);
40 for (i = 0; i < 256; i++)
41 if (d[i].nbytes) {
42 if (d[i].addr + d[i].nbytes > size) {
43 fprintf(stderr, "char %d out of range\n", i);
44 continue;
45 }
46 cvt(&d[i], chp+d[i].addr, &nd, scr);
47 d[i] = nd;
48 d[i].addr = tell(1) - beg;
49 write(1, scr, d[i].nbytes);
50 }
51 fprintf(stderr, "done, new size %d\n", tell(1) - beg);
52 h.size = tell(1) - beg;
53 lseek(1, 0, 0);
54 write(1, &h, sizeof (h));
55 write(1, d, sizeof (d));
56}
57
58cvt(odp, ocp, dp, cp)
59 struct dispatch *odp, *dp;
60 register char *ocp, *cp;
61{
62 int max;
63 int bpl;
64 int row,byte,bit;
65 register char *ep;
66 register int bitoff;
67 register int bits;
68 int extra;
69
70 max = (odp->up+odp->down+7)/8;
71 extra = max*8 - (odp->down+odp->up);
72 dp->down = odp->down;
73 dp->up = odp->up;
74 dp->left = odp->left;
75 dp->right = odp->right;
76 dp->nbytes = max*(dp->right+dp->left);
77 ep = cp;
78 for (byte = 0; byte < dp->nbytes; byte++)
79 *ep++ = 0;
80 bpl = (dp->right+dp->left+7)/8;
81 for (row = 0; row < odp->up+odp->down; row++) {
82 for (byte = 0; byte < bpl; byte++) {
83 bits = *ocp++;
84 for (bit = 0; bit < 8; bit++) {
85 if (bits & 0x80) {
86 ep = cp + max*(byte*8+bit);
87 bitoff = max*8 - row - 1 - extra;
88 ep += (bitoff/8);
89 *ep |= 0x80 >> (bitoff%8);
90 }
91 bits <<= 1;
92 }
93 }
94 }
95}