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