|
|
1.1 root 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) 5/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.