Commit | Line | Data |
---|---|---|
012f1c1f DF |
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 | ||
c936af6c | 7 | #ifndef lint |
012f1c1f DF |
8 | static char sccsid[] = "@(#)vwidth.c 5.1 (Berkeley) %G%"; |
9 | #endif not lint | |
c936af6c | 10 | |
b1dda97e RC |
11 | /* |
12 | * Creates a width table for troff from a versatec font for a | |
13 | * normal font. | |
14 | * Usage: width font [ point_size ] | |
15 | * where font is the file name of the versatec font and | |
16 | * point_size is it point size. | |
17 | * If the point size is omitted it is taken from the suffix of | |
18 | * the font name, as bocklin.14 => 14 point. | |
19 | * It is better to use as large a point size font as possible | |
20 | * to avoid round off. | |
21 | */ | |
22 | ||
23 | #include <stdio.h> | |
24 | ||
25 | struct wtable { | |
26 | char charloc; | |
27 | char *name; | |
28 | } wtable[] = { | |
29 | '\214', "space", | |
30 | '!', "!", | |
31 | '"', "\"", | |
32 | '#', "#", | |
33 | '$', "$", | |
34 | '%', "%", | |
35 | '&', "&", | |
36 | '\'', "'", | |
37 | '(', "(", | |
38 | ')', ")", | |
39 | '*', "*", | |
40 | '+', "+", | |
41 | ',', ",", | |
42 | '-', "- hyphen", | |
43 | '.', ".", | |
44 | '/', "/", | |
45 | '0', "0", | |
46 | '1', "1", | |
47 | '2', "2", | |
48 | '3', "3", | |
49 | '4', "4", | |
50 | '5', "5", | |
51 | '6', "6", | |
52 | '7', "7", | |
53 | '8', "8", | |
54 | '9', "9", | |
55 | ':', ":", | |
56 | ';', ";", | |
57 | '<', "<", | |
58 | '=', "=", | |
59 | '>', ">", | |
60 | '?', "?", | |
61 | '@', "@", | |
62 | 'A', "A", | |
63 | 'B', "B", | |
64 | 'C', "C", | |
65 | 'D', "D", | |
66 | 'E', "E", | |
67 | 'F', "F", | |
68 | 'G', "G", | |
69 | 'H', "H", | |
70 | 'I', "I", | |
71 | 'J', "J", | |
72 | 'K', "K", | |
73 | 'L', "L", | |
74 | 'M', "M", | |
75 | 'N', "N", | |
76 | 'O', "O", | |
77 | 'P', "P", | |
78 | 'Q', "Q", | |
79 | 'R', "R", | |
80 | 'S', "S", | |
81 | 'T', "T", | |
82 | 'U', "U", | |
83 | 'V', "V", | |
84 | 'W', "W", | |
85 | 'X', "X", | |
86 | 'Y', "Y", | |
87 | 'Z', "Z", | |
88 | '[', "[", | |
89 | '\\', "\\", | |
90 | ']', "]", | |
91 | '^', "^", | |
92 | '_', "_", | |
93 | '\`', "\`", | |
94 | 'a', "a", | |
95 | 'b', "b", | |
96 | 'c', "c", | |
97 | 'd', "d", | |
98 | 'e', "e", | |
99 | 'f', "f", | |
100 | 'g', "g", | |
101 | 'h', "h", | |
102 | 'i', "i", | |
103 | 'j', "j", | |
104 | 'k', "k", | |
105 | 'l', "l", | |
106 | 'm', "m", | |
107 | 'n', "n", | |
108 | 'o', "o", | |
109 | 'p', "p", | |
110 | 'q', "q", | |
111 | 'r', "r", | |
112 | 's', "s", | |
113 | 't', "t", | |
114 | 'u', "u", | |
115 | 'v', "v", | |
116 | 'w', "w", | |
117 | 'x', "x", | |
118 | 'y', "y", | |
119 | 'z', "z", | |
120 | '{', "{", | |
121 | '|', "|", | |
122 | '}', "}", | |
123 | '~', "~", | |
124 | '\206', "narrow space\7f", | |
125 | '-', "hyphen", | |
126 | '\07', "bullet", | |
127 | '\010', "square", | |
128 | '\06', "3/4 em dash", | |
129 | '\05', "rule", | |
130 | '\021', "1/4", | |
131 | '\022', "1/2", | |
132 | '\023', "3/4", | |
133 | '\04', "minus", | |
134 | '\01', "fi", | |
135 | '\02', "fl", | |
136 | '\03', "ff", | |
137 | '\011', "ffi", | |
138 | '\012', "ffl", | |
139 | '\013', "degree", | |
140 | '\014', "dagger", | |
141 | '\200', "section (unimplem)", | |
142 | '\015', "foot mark", | |
143 | '\200', "acute acc (unimplem)", | |
144 | '\200', "grave acc (unimplem)", | |
145 | '\200', "underrule (unimplem)", | |
146 | '\200', "slash (unimplem)", | |
147 | '\203', "half narrow space", | |
148 | '\200', "null", | |
149 | '\200', "null", | |
150 | '\200', "null", | |
151 | '\200', "null", | |
152 | '\200', "null", | |
153 | '\200', "null", | |
154 | '\200', "null", | |
155 | '\200', "null", | |
156 | '\200', "null", | |
157 | '\200', "null", | |
158 | '\200', "null", | |
159 | '\200', "null", | |
160 | '\200', "null", | |
161 | '\200', "null", | |
162 | '\200', "null", | |
163 | '\200', "null", | |
164 | '\200', "null", | |
165 | '\200', "null", | |
166 | '\200', "null", | |
167 | '\200', "null", | |
168 | '\200', "null", | |
169 | '\200', "null", | |
170 | '\200', "null", | |
171 | '\200', "null", | |
172 | '\200', "null", | |
173 | '\200', "null", | |
174 | '\200', "null", | |
175 | '\200', "null", | |
176 | '\200', "null", | |
177 | '\200', "null", | |
178 | '\200', "null", | |
179 | '\200', "null", | |
180 | '\200', "null", | |
181 | '\200', "null", | |
182 | '\200', "null", | |
183 | '\200', "null", | |
184 | '\200', "null", | |
185 | '\200', "null", | |
186 | '\200', "null", | |
187 | '\200', "null", | |
188 | '\200', "null", | |
189 | '\200', "null", | |
190 | '\200', "null", | |
191 | '\200', "null", | |
192 | '\200', "null", | |
193 | '\200', "null", | |
194 | '\200', "null", | |
195 | '\200', "null", | |
196 | '\200', "null", | |
197 | '\200', "null", | |
198 | '\200', "null", | |
199 | '\200', "null", | |
200 | '\200', "null", | |
201 | '\200', "null", | |
202 | '\200', "null", | |
203 | '\200', "null", | |
204 | '\200', "null", | |
205 | '\200', "null", | |
206 | '\200', "null", | |
207 | '\200', "null", | |
208 | '\200', "null", | |
209 | '\200', "null", | |
210 | '\200', "null", | |
211 | '\200', "null", | |
212 | '\200', "null", | |
213 | '\200', "null", | |
214 | '\200', "null", | |
215 | '\200', "null", | |
216 | '\200', "null", | |
217 | '\200', "null", | |
218 | '\200', "null", | |
219 | '\017', "registered", | |
220 | '\016', "copyright", | |
221 | '\200', "null", | |
222 | '\020', "cent", | |
223 | 0, 0 | |
224 | }; | |
225 | ||
226 | struct desc { | |
227 | short addr; | |
228 | short nbytes; | |
229 | char up; | |
230 | char down; | |
231 | char left; | |
232 | char right; | |
233 | short width; | |
234 | } desc[256]; | |
235 | ||
236 | main(argc, argv) | |
237 | int argc; | |
238 | char *argv[]; | |
239 | { | |
240 | register int cl; | |
241 | register esc; | |
242 | register w; | |
243 | int i, psize; | |
244 | int fd, high; | |
245 | ||
246 | if (argc != 3 && argc != 2) { | |
247 | printf("Usage: vwidth font [pointsize] > font.c\n"); | |
248 | exit(1); | |
249 | } | |
250 | fd = open(argv[1], 0); | |
251 | if (argc == 3) | |
252 | psize = atoi(argv[2]); | |
253 | else { | |
254 | char *p; | |
255 | for (p = argv[1]; *p && *p != '.'; p++) | |
256 | ; | |
257 | if (*p == 0) { | |
258 | psize = 10; | |
259 | fprintf(stderr, "Assuming %d point\n", psize); | |
260 | } else | |
261 | psize = atoi(p+1); | |
262 | } | |
263 | lseek(fd, 10L, 0); | |
264 | read(fd, desc, sizeof desc); | |
265 | high = desc['a'].up+1; | |
266 | printf("char XXw[256-32] = {\n"); | |
267 | for (i = 0; wtable[i].charloc != 0; i++) { | |
268 | cl = wtable[i].charloc & 0377; | |
269 | if (cl & 0200) | |
270 | w = cl & 0177; | |
271 | else | |
272 | w = desc[cl].width*(54./25.)*(6./psize)+.5; | |
273 | esc = 0; | |
274 | if ((cl >= '0' && cl <= '9') || (cl >= 'A' && cl <= 'Z') || | |
275 | (cl >= 'a' && cl <= 'z')) { | |
276 | if (desc[cl].up > high) | |
277 | esc |= 0200; | |
278 | if (desc[cl].down > 0) | |
279 | esc |= 0100; | |
280 | } | |
281 | if (esc) | |
282 | printf("%d+0%o,\t/* %s */\n", w, esc, wtable[i].name); | |
283 | else | |
284 | printf("%d,\t\t/* %s */\n", w, wtable[i].name); | |
285 | } | |
286 | printf("};\n"); | |
287 | } |