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