1// -*- C++ -*-
2/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3     Written by James Clark (jjc@jclark.com)
4
5This file is part of groff.
6
7groff is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
11
12groff is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License along
18with groff; see the file COPYING.  If not, write to the Free Software
19Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
20
21#include "guess.h"
22
23void guess(const char *s, const font_params &param, char_metric *metric)
24{
25  int &height = metric->height;
26  int &depth = metric->depth;
27
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
489  }
490}
491