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