* All affected files: Update postal address of FSF.
[s-roff.git] / src / utils / addftinfo / guess.cpp
blob7ae36dcdecf7e9fb7dbc1ece960cc4ced6bdabf0
1 // -*- C++ -*-
2 /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3 Written by James Clark (jjc@jclark.com)
5 This file is part of groff.
7 groff is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 groff is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License along
18 with groff; see the file COPYING. If not, write to the Free Software
19 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
21 #include "guess.h"
23 void guess(const char *s, const font_params &param, char_metric *metric)
25 int &height = metric->height;
26 int &depth = metric->depth;
28 metric->ic = 0;
29 metric->left_ic = 0;
30 metric->sk = 0;
31 height = 0;
32 depth = 0;
33 if (s[0] == '\0' || (s[1] != '\0' && s[2] != '\0'))
34 goto do_default;
35 #define HASH(c1, c2) (((unsigned char)(c1) << 8) | (unsigned char)(c2))
36 switch (HASH(s[0], s[1])) {
37 default:
38 do_default:
39 if (metric->type & 01)
40 depth = param.desc_depth;
41 if (metric->type & 02)
42 height = param.asc_height;
43 else
44 height = param.x_height;
45 break;
46 case HASH('\\', '|'):
47 case HASH('\\', '^'):
48 case HASH('\\', '&'):
49 // these have zero height and depth
50 break;
51 case HASH('f', 0):
52 height = param.asc_height;
53 if (param.italic)
54 depth = param.desc_depth;
55 break;
56 case HASH('a', 0):
57 case HASH('c', 0):
58 case HASH('e', 0):
59 case HASH('m', 0):
60 case HASH('n', 0):
61 case HASH('o', 0):
62 case HASH('r', 0):
63 case HASH('s', 0):
64 case HASH('u', 0):
65 case HASH('v', 0):
66 case HASH('w', 0):
67 case HASH('x', 0):
68 case HASH('z', 0):
69 height = param.x_height;
70 break;
71 case HASH('i', 0):
72 height = param.x_height;
73 break;
74 case HASH('b', 0):
75 case HASH('d', 0):
76 case HASH('h', 0):
77 case HASH('k', 0):
78 case HASH('l', 0):
79 case HASH('F', 'i'):
80 case HASH('F', 'l'):
81 case HASH('f', 'f'):
82 case HASH('f', 'i'):
83 case HASH('f', 'l'):
84 height = param.asc_height;
85 break;
86 case HASH('t', 0):
87 height = param.asc_height;
88 break;
89 case HASH('g', 0):
90 case HASH('p', 0):
91 case HASH('q', 0):
92 case HASH('y', 0):
93 height = param.x_height;
94 depth = param.desc_depth;
95 break;
96 case HASH('j', 0):
97 height = param.x_height;
98 depth = param.desc_depth;
99 break;
100 case HASH('A', 0):
101 case HASH('B', 0):
102 case HASH('C', 0):
103 case HASH('D', 0):
104 case HASH('E', 0):
105 case HASH('F', 0):
106 case HASH('G', 0):
107 case HASH('H', 0):
108 case HASH('I', 0):
109 case HASH('J', 0):
110 case HASH('K', 0):
111 case HASH('L', 0):
112 case HASH('M', 0):
113 case HASH('N', 0):
114 case HASH('O', 0):
115 case HASH('P', 0):
116 case HASH('Q', 0):
117 case HASH('R', 0):
118 case HASH('S', 0):
119 case HASH('T', 0):
120 case HASH('U', 0):
121 case HASH('V', 0):
122 case HASH('W', 0):
123 case HASH('X', 0):
124 case HASH('Y', 0):
125 case HASH('Z', 0):
126 height = param.cap_height;
127 break;
128 case HASH('*', 'A'):
129 case HASH('*', 'B'):
130 case HASH('*', 'C'):
131 case HASH('*', 'D'):
132 case HASH('*', 'E'):
133 case HASH('*', 'F'):
134 case HASH('*', 'G'):
135 case HASH('*', 'H'):
136 case HASH('*', 'I'):
137 case HASH('*', 'K'):
138 case HASH('*', 'L'):
139 case HASH('*', 'M'):
140 case HASH('*', 'N'):
141 case HASH('*', 'O'):
142 case HASH('*', 'P'):
143 case HASH('*', 'Q'):
144 case HASH('*', 'R'):
145 case HASH('*', 'S'):
146 case HASH('*', 'T'):
147 case HASH('*', 'U'):
148 case HASH('*', 'W'):
149 case HASH('*', 'X'):
150 case HASH('*', 'Y'):
151 case HASH('*', 'Z'):
152 height = param.cap_height;
153 break;
154 case HASH('0', 0):
155 case HASH('1', 0):
156 case HASH('2', 0):
157 case HASH('3', 0):
158 case HASH('4', 0):
159 case HASH('5', 0):
160 case HASH('6', 0):
161 case HASH('7', 0):
162 case HASH('8', 0):
163 case HASH('9', 0):
164 case HASH('1', '2'):
165 case HASH('1', '4'):
166 case HASH('3', '4'):
167 height = param.fig_height;
168 break;
169 case HASH('(', 0):
170 case HASH(')', 0):
171 case HASH('[', 0):
172 case HASH(']', 0):
173 case HASH('{', 0):
174 case HASH('}', 0):
175 height = param.body_height;
176 depth = param.body_depth;
177 break;
178 case HASH('i', 's'):
179 height = (param.em*3)/4;
180 depth = param.em/4;
181 break;
182 case HASH('*', 'a'):
183 case HASH('*', 'e'):
184 case HASH('*', 'i'):
185 case HASH('*', 'k'):
186 case HASH('*', 'n'):
187 case HASH('*', 'o'):
188 case HASH('*', 'p'):
189 case HASH('*', 's'):
190 case HASH('*', 't'):
191 case HASH('*', 'u'):
192 case HASH('*', 'w'):
193 height = param.x_height;
194 break;
195 case HASH('*', 'd'):
196 case HASH('*', 'l'):
197 height = param.asc_height;
198 break;
199 case HASH('*', 'g'):
200 case HASH('*', 'h'):
201 case HASH('*', 'm'):
202 case HASH('*', 'r'):
203 case HASH('*', 'x'):
204 case HASH('*', 'y'):
205 height = param.x_height;
206 depth = param.desc_depth;
207 break;
208 case HASH('*', 'b'):
209 case HASH('*', 'c'):
210 case HASH('*', 'f'):
211 case HASH('*', 'q'):
212 case HASH('*', 'z'):
213 height = param.asc_height;
214 depth = param.desc_depth;
215 break;
216 case HASH('t', 's'):
217 height = param.x_height;
218 depth = param.desc_depth;
219 break;
220 case HASH('!', 0):
221 case HASH('?', 0):
222 case HASH('"', 0):
223 case HASH('#', 0):
224 case HASH('$', 0):
225 case HASH('%', 0):
226 case HASH('&', 0):
227 case HASH('*', 0):
228 case HASH('+', 0):
229 height = param.asc_height;
230 break;
231 case HASH('`', 0):
232 case HASH('\'', 0):
233 height = param.asc_height;
234 break;
235 case HASH('~', 0):
236 case HASH('^', 0):
237 case HASH('a', 'a'):
238 case HASH('g', 'a'):
239 height = param.asc_height;
240 break;
241 case HASH('r', 'u'):
242 case HASH('.', 0):
243 break;
244 case HASH(',', 0):
245 depth = param.comma_depth;
246 break;
247 case HASH('m', 'i'):
248 case HASH('-', 0):
249 case HASH('h', 'y'):
250 case HASH('e', 'm'):
251 height = param.x_height;
252 break;
253 case HASH(':', 0):
254 height = param.x_height;
255 break;
256 case HASH(';', 0):
257 height = param.x_height;
258 depth = param.comma_depth;
259 break;
260 case HASH('=', 0):
261 case HASH('e', 'q'):
262 height = param.x_height;
263 break;
264 case HASH('<', 0):
265 case HASH('>', 0):
266 case HASH('>', '='):
267 case HASH('<', '='):
268 case HASH('@', 0):
269 case HASH('/', 0):
270 case HASH('|', 0):
271 case HASH('\\', 0):
272 height = param.asc_height;
273 break;
274 case HASH('_', 0):
275 case HASH('u', 'l'):
276 case HASH('\\', '_'):
277 depth = param.em/4;
278 break;
279 case HASH('r', 'n'):
280 height = (param.em*3)/4;
281 break;
282 case HASH('s', 'r'):
283 height = (param.em*3)/4;
284 depth = param.em/4;
285 break;
286 case HASH('b', 'u'):
287 case HASH('s', 'q'):
288 case HASH('d', 'e'):
289 case HASH('d', 'g'):
290 case HASH('f', 'm'):
291 case HASH('c', 't'):
292 case HASH('r', 'g'):
293 case HASH('c', 'o'):
294 case HASH('p', 'l'):
295 case HASH('*', '*'):
296 case HASH('s', 'c'):
297 case HASH('s', 'l'):
298 case HASH('=', '='):
299 case HASH('~', '='):
300 case HASH('a', 'p'):
301 case HASH('!', '='):
302 case HASH('-', '>'):
303 case HASH('<', '-'):
304 case HASH('u', 'a'):
305 case HASH('d', 'a'):
306 case HASH('m', 'u'):
307 case HASH('d', 'i'):
308 case HASH('+', '-'):
309 case HASH('c', 'u'):
310 case HASH('c', 'a'):
311 case HASH('s', 'b'):
312 case HASH('s', 'p'):
313 case HASH('i', 'b'):
314 case HASH('i', 'p'):
315 case HASH('i', 'f'):
316 case HASH('p', 'd'):
317 case HASH('g', 'r'):
318 case HASH('n', 'o'):
319 case HASH('p', 't'):
320 case HASH('e', 's'):
321 case HASH('m', 'o'):
322 case HASH('b', 'r'):
323 case HASH('d', 'd'):
324 case HASH('r', 'h'):
325 case HASH('l', 'h'):
326 case HASH('o', 'r'):
327 case HASH('c', 'i'):
328 height = param.asc_height;
329 break;
330 case HASH('l', 't'):
331 case HASH('l', 'b'):
332 case HASH('r', 't'):
333 case HASH('r', 'b'):
334 case HASH('l', 'k'):
335 case HASH('r', 'k'):
336 case HASH('b', 'v'):
337 case HASH('l', 'f'):
338 case HASH('r', 'f'):
339 case HASH('l', 'c'):
340 case HASH('r', 'c'):
341 height = (param.em*3)/4;
342 depth = param.em/4;
343 break;
344 #if 0
345 case HASH('%', '0'):
346 case HASH('-', '+'):
347 case HASH('-', 'D'):
348 case HASH('-', 'd'):
349 case HASH('-', 'd'):
350 case HASH('-', 'h'):
351 case HASH('.', 'i'):
352 case HASH('.', 'j'):
353 case HASH('/', 'L'):
354 case HASH('/', 'O'):
355 case HASH('/', 'l'):
356 case HASH('/', 'o'):
357 case HASH('=', '~'):
358 case HASH('A', 'E'):
359 case HASH('A', 'h'):
360 case HASH('A', 'N'):
361 case HASH('C', 's'):
362 case HASH('D', 'o'):
363 case HASH('F', 'c'):
364 case HASH('F', 'o'):
365 case HASH('I', 'J'):
366 case HASH('I', 'm'):
367 case HASH('O', 'E'):
368 case HASH('O', 'f'):
369 case HASH('O', 'K'):
370 case HASH('O', 'm'):
371 case HASH('O', 'R'):
372 case HASH('P', 'o'):
373 case HASH('R', 'e'):
374 case HASH('S', '1'):
375 case HASH('S', '2'):
376 case HASH('S', '3'):
377 case HASH('T', 'P'):
378 case HASH('T', 'p'):
379 case HASH('Y', 'e'):
380 case HASH('\\', '-'):
381 case HASH('a', '"'):
382 case HASH('a', '-'):
383 case HASH('a', '.'):
384 case HASH('a', '^'):
385 case HASH('a', 'b'):
386 case HASH('a', 'c'):
387 case HASH('a', 'd'):
388 case HASH('a', 'e'):
389 case HASH('a', 'h'):
390 case HASH('a', 'o'):
391 case HASH('a', 't'):
392 case HASH('a', '~'):
393 case HASH('b', 'a'):
394 case HASH('b', 'b'):
395 case HASH('b', 's'):
396 case HASH('c', '*'):
397 case HASH('c', '+'):
398 case HASH('f', '/'):
399 case HASH('f', 'a'):
400 case HASH('f', 'c'):
401 case HASH('f', 'o'):
402 case HASH('h', 'a'):
403 case HASH('h', 'o'):
404 case HASH('i', 'j'):
405 case HASH('l', 'A'):
406 case HASH('l', 'B'):
407 case HASH('l', 'C'):
408 case HASH('m', 'd'):
409 case HASH('n', 'c'):
410 case HASH('n', 'e'):
411 case HASH('n', 'm'):
412 case HASH('o', 'A'):
413 case HASH('o', 'a'):
414 case HASH('o', 'e'):
415 case HASH('o', 'q'):
416 case HASH('p', 'l'):
417 case HASH('p', 'p'):
418 case HASH('p', 's'):
419 case HASH('r', '!'):
420 case HASH('r', '?'):
421 case HASH('r', 'A'):
422 case HASH('r', 'B'):
423 case HASH('r', 'C'):
424 case HASH('r', 's'):
425 case HASH('s', 'h'):
426 case HASH('s', 's'):
427 case HASH('t', 'e'):
428 case HASH('t', 'f'):
429 case HASH('t', 'i'):
430 case HASH('t', 'm'):
431 case HASH('~', '~'):
432 case HASH('v', 'S'):
433 case HASH('v', 'Z'):
434 case HASH('v', 's'):
435 case HASH('v', 'z'):
436 case HASH('^', 'A'):
437 case HASH('^', 'E'):
438 case HASH('^', 'I'):
439 case HASH('^', 'O'):
440 case HASH('^', 'U'):
441 case HASH('^', 'a'):
442 case HASH('^', 'e'):
443 case HASH('^', 'i'):
444 case HASH('^', 'o'):
445 case HASH('^', 'u'):
446 case HASH('`', 'A'):
447 case HASH('`', 'E'):
448 case HASH('`', 'I'):
449 case HASH('`', 'O'):
450 case HASH('`', 'U'):
451 case HASH('`', 'a'):
452 case HASH('`', 'e'):
453 case HASH('`', 'i'):
454 case HASH('`', 'o'):
455 case HASH('`', 'u'):
456 case HASH('~', 'A'):
457 case HASH('~', 'N'):
458 case HASH('~', 'O'):
459 case HASH('~', 'a'):
460 case HASH('~', 'n'):
461 case HASH('~', 'o'):
462 case HASH('\'', 'A'):
463 case HASH('\'', 'C'):
464 case HASH('\'', 'E'):
465 case HASH('\'', 'I'):
466 case HASH('\'', 'O'):
467 case HASH('\'', 'U'):
468 case HASH('\'', 'a'):
469 case HASH('\'', 'c'):
470 case HASH('\'', 'e'):
471 case HASH('\'', 'i'):
472 case HASH('\'', 'o'):
473 case HASH('\'', 'u')
474 case HASH(':', 'A'):
475 case HASH(':', 'E'):
476 case HASH(':', 'I'):
477 case HASH(':', 'O'):
478 case HASH(':', 'U'):
479 case HASH(':', 'Y'):
480 case HASH(':', 'a'):
481 case HASH(':', 'e'):
482 case HASH(':', 'i'):
483 case HASH(':', 'o'):
484 case HASH(':', 'u'):
485 case HASH(':', 'y'):
486 case HASH(',', 'C'):
487 case HASH(',', 'c'):
488 #endif