|
|
1.1 root 1: #include <stdio.h>
2: #include <vfont.h>
3: #include <sys/types.h>
4: #include <sys/stat.h>
5:
6: char *chp;
7: char *sbrk();
8:
9: main(argc,argv)
10: char **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:
58: cvt(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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.