1114402Sru// -*- C++ -*-
2114402Sru/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3114402Sru     Written by James Clark (jjc@jclark.com)
4114402Sru
5114402SruThis file is part of groff.
6114402Sru
7114402Srugroff is free software; you can redistribute it and/or modify it under
8114402Sruthe terms of the GNU General Public License as published by the Free
9114402SruSoftware Foundation; either version 2, or (at your option) any later
10114402Sruversion.
11114402Sru
12114402Srugroff is distributed in the hope that it will be useful, but WITHOUT ANY
13114402SruWARRANTY; without even the implied warranty of MERCHANTABILITY or
14114402SruFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15114402Srufor more details.
16114402Sru
17114402SruYou should have received a copy of the GNU General Public License along
18114402Sruwith groff; see the file COPYING.  If not, write to the Free Software
19151497SruFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
20114402Sru
21114402Sru#include "guess.h"
22114402Sru
23114402Sruvoid guess(const char *s, const font_params &param, char_metric *metric)
24114402Sru{
25114402Sru  int &height = metric->height;
26114402Sru  int &depth = metric->depth;
27114402Sru
28114402Sru  metric->ic = 0;
29114402Sru  metric->left_ic = 0;
30114402Sru  metric->sk = 0;
31114402Sru  height = 0;
32114402Sru  depth = 0;
33114402Sru  if (s[0] == '\0' || (s[1] != '\0' && s[2] != '\0'))
34114402Sru    goto do_default;
35114402Sru#define HASH(c1, c2) (((unsigned char)(c1) << 8) | (unsigned char)(c2))
36114402Sru  switch (HASH(s[0], s[1])) {
37114402Sru  default:
38114402Sru  do_default:
39114402Sru    if (metric->type & 01)
40114402Sru      depth = param.desc_depth;
41114402Sru    if (metric->type & 02)
42114402Sru      height = param.asc_height;
43114402Sru    else
44114402Sru      height = param.x_height;
45114402Sru    break;
46114402Sru  case HASH('\\', '|'):
47114402Sru  case HASH('\\', '^'):
48114402Sru  case HASH('\\', '&'):
49114402Sru    // these have zero height and depth
50114402Sru    break;
51114402Sru  case HASH('f', 0):
52114402Sru    height = param.asc_height;
53114402Sru    if (param.italic)
54114402Sru      depth = param.desc_depth;
55114402Sru    break;
56114402Sru  case HASH('a', 0):
57114402Sru  case HASH('c', 0):
58114402Sru  case HASH('e', 0):
59114402Sru  case HASH('m', 0):
60114402Sru  case HASH('n', 0):
61114402Sru  case HASH('o', 0):
62114402Sru  case HASH('r', 0):
63114402Sru  case HASH('s', 0):
64114402Sru  case HASH('u', 0):
65114402Sru  case HASH('v', 0):
66114402Sru  case HASH('w', 0):
67114402Sru  case HASH('x', 0):
68114402Sru  case HASH('z', 0):
69114402Sru    height = param.x_height;
70114402Sru    break;
71114402Sru  case HASH('i', 0):
72114402Sru    height = param.x_height;
73114402Sru    break;
74114402Sru  case HASH('b', 0):
75114402Sru  case HASH('d', 0):
76114402Sru  case HASH('h', 0):
77114402Sru  case HASH('k', 0):
78114402Sru  case HASH('l', 0):
79114402Sru  case HASH('F', 'i'):
80114402Sru  case HASH('F', 'l'):
81114402Sru  case HASH('f', 'f'):
82114402Sru  case HASH('f', 'i'):
83114402Sru  case HASH('f', 'l'):
84114402Sru    height = param.asc_height;
85114402Sru    break;
86114402Sru  case HASH('t', 0):
87114402Sru    height = param.asc_height;
88114402Sru    break;
89114402Sru  case HASH('g', 0):
90114402Sru  case HASH('p', 0):
91114402Sru  case HASH('q', 0):
92114402Sru  case HASH('y', 0):
93114402Sru    height = param.x_height;
94114402Sru    depth = param.desc_depth;
95114402Sru    break;
96114402Sru  case HASH('j', 0):
97114402Sru    height = param.x_height;
98114402Sru    depth = param.desc_depth;
99114402Sru    break;
100114402Sru  case HASH('A', 0):
101114402Sru  case HASH('B', 0):
102114402Sru  case HASH('C', 0):
103114402Sru  case HASH('D', 0):
104114402Sru  case HASH('E', 0):
105114402Sru  case HASH('F', 0):
106114402Sru  case HASH('G', 0):
107114402Sru  case HASH('H', 0):
108114402Sru  case HASH('I', 0):
109114402Sru  case HASH('J', 0):
110114402Sru  case HASH('K', 0):
111114402Sru  case HASH('L', 0):
112114402Sru  case HASH('M', 0):
113114402Sru  case HASH('N', 0):
114114402Sru  case HASH('O', 0):
115114402Sru  case HASH('P', 0):
116114402Sru  case HASH('Q', 0):
117114402Sru  case HASH('R', 0):
118114402Sru  case HASH('S', 0):
119114402Sru  case HASH('T', 0):
120114402Sru  case HASH('U', 0):
121114402Sru  case HASH('V', 0):
122114402Sru  case HASH('W', 0):
123114402Sru  case HASH('X', 0):
124114402Sru  case HASH('Y', 0):
125114402Sru  case HASH('Z', 0):
126114402Sru    height = param.cap_height;
127114402Sru    break;
128114402Sru  case HASH('*', 'A'):
129114402Sru  case HASH('*', 'B'):
130114402Sru  case HASH('*', 'C'):
131114402Sru  case HASH('*', 'D'):
132114402Sru  case HASH('*', 'E'):
133114402Sru  case HASH('*', 'F'):
134114402Sru  case HASH('*', 'G'):
135114402Sru  case HASH('*', 'H'):
136114402Sru  case HASH('*', 'I'):
137114402Sru  case HASH('*', 'K'):
138114402Sru  case HASH('*', 'L'):
139114402Sru  case HASH('*', 'M'):
140114402Sru  case HASH('*', 'N'):
141114402Sru  case HASH('*', 'O'):
142114402Sru  case HASH('*', 'P'):
143114402Sru  case HASH('*', 'Q'):
144114402Sru  case HASH('*', 'R'):
145114402Sru  case HASH('*', 'S'):
146114402Sru  case HASH('*', 'T'):
147114402Sru  case HASH('*', 'U'):
148114402Sru  case HASH('*', 'W'):
149114402Sru  case HASH('*', 'X'):
150114402Sru  case HASH('*', 'Y'):
151114402Sru  case HASH('*', 'Z'):
152114402Sru    height = param.cap_height;
153114402Sru    break;
154114402Sru  case HASH('0', 0):
155114402Sru  case HASH('1', 0):
156114402Sru  case HASH('2', 0):
157114402Sru  case HASH('3', 0):
158114402Sru  case HASH('4', 0):
159114402Sru  case HASH('5', 0):
160114402Sru  case HASH('6', 0):
161114402Sru  case HASH('7', 0):
162114402Sru  case HASH('8', 0):
163114402Sru  case HASH('9', 0):
164114402Sru  case HASH('1', '2'):
165114402Sru  case HASH('1', '4'):
166114402Sru  case HASH('3', '4'):
167114402Sru    height = param.fig_height;
168114402Sru    break;
169114402Sru  case HASH('(', 0):
170114402Sru  case HASH(')', 0):
171114402Sru  case HASH('[', 0):
172114402Sru  case HASH(']', 0):
173114402Sru  case HASH('{', 0):
174114402Sru  case HASH('}', 0):
175114402Sru    height = param.body_height;
176114402Sru    depth = param.body_depth;
177114402Sru    break;
178114402Sru  case HASH('i', 's'):
179114402Sru    height = (param.em*3)/4;
180114402Sru    depth = param.em/4;
181114402Sru    break;
182114402Sru  case HASH('*', 'a'):
183114402Sru  case HASH('*', 'e'):
184114402Sru  case HASH('*', 'i'):
185114402Sru  case HASH('*', 'k'):
186114402Sru  case HASH('*', 'n'):
187114402Sru  case HASH('*', 'o'):
188114402Sru  case HASH('*', 'p'):
189114402Sru  case HASH('*', 's'):
190114402Sru  case HASH('*', 't'):
191114402Sru  case HASH('*', 'u'):
192114402Sru  case HASH('*', 'w'):
193114402Sru    height = param.x_height;
194114402Sru    break;
195114402Sru  case HASH('*', 'd'):
196114402Sru  case HASH('*', 'l'):
197114402Sru    height = param.asc_height;
198114402Sru    break;
199114402Sru  case HASH('*', 'g'):
200114402Sru  case HASH('*', 'h'):
201114402Sru  case HASH('*', 'm'):
202114402Sru  case HASH('*', 'r'):
203114402Sru  case HASH('*', 'x'):
204114402Sru  case HASH('*', 'y'):
205114402Sru    height = param.x_height;
206114402Sru    depth = param.desc_depth;
207114402Sru    break;
208114402Sru  case HASH('*', 'b'):
209114402Sru  case HASH('*', 'c'):
210114402Sru  case HASH('*', 'f'):
211114402Sru  case HASH('*', 'q'):
212114402Sru  case HASH('*', 'z'):
213114402Sru    height = param.asc_height;
214114402Sru    depth = param.desc_depth;
215114402Sru    break;
216114402Sru  case HASH('t', 's'):
217114402Sru    height = param.x_height;
218114402Sru    depth = param.desc_depth;
219114402Sru    break;
220114402Sru  case HASH('!', 0):
221114402Sru  case HASH('?', 0):
222114402Sru  case HASH('"', 0):
223114402Sru  case HASH('#', 0):
224114402Sru  case HASH('$', 0):
225114402Sru  case HASH('%', 0):
226114402Sru  case HASH('&', 0):
227114402Sru  case HASH('*', 0):
228114402Sru  case HASH('+', 0):
229114402Sru    height = param.asc_height;
230114402Sru    break;
231114402Sru  case HASH('`', 0):
232114402Sru  case HASH('\'', 0):
233114402Sru    height = param.asc_height;
234114402Sru    break;
235114402Sru  case HASH('~', 0):
236114402Sru  case HASH('^', 0):
237114402Sru  case HASH('a', 'a'):
238114402Sru  case HASH('g', 'a'):
239114402Sru    height = param.asc_height;
240114402Sru    break;
241114402Sru  case HASH('r', 'u'):
242114402Sru  case HASH('.', 0):
243114402Sru    break;
244114402Sru  case HASH(',', 0):
245114402Sru    depth = param.comma_depth;
246114402Sru    break;
247114402Sru  case HASH('m', 'i'):
248114402Sru  case HASH('-', 0):
249114402Sru  case HASH('h', 'y'):
250114402Sru  case HASH('e', 'm'):
251114402Sru    height = param.x_height;
252114402Sru    break;
253114402Sru  case HASH(':', 0):
254114402Sru    height = param.x_height;
255114402Sru    break;
256114402Sru  case HASH(';', 0):
257114402Sru    height = param.x_height;
258114402Sru    depth = param.comma_depth;
259114402Sru    break;
260114402Sru  case HASH('=', 0):
261114402Sru  case HASH('e', 'q'):
262114402Sru    height = param.x_height;
263114402Sru    break;
264114402Sru  case HASH('<', 0):
265114402Sru  case HASH('>', 0):
266114402Sru  case HASH('>', '='):
267114402Sru  case HASH('<', '='):
268114402Sru  case HASH('@', 0):
269114402Sru  case HASH('/', 0):
270114402Sru  case HASH('|', 0):
271114402Sru  case HASH('\\', 0):
272114402Sru    height = param.asc_height;
273114402Sru    break;
274114402Sru  case HASH('_', 0):
275114402Sru  case HASH('u', 'l'):
276114402Sru  case HASH('\\', '_'):
277114402Sru    depth = param.em/4;
278114402Sru    break;
279114402Sru  case HASH('r', 'n'):
280114402Sru    height = (param.em*3)/4;
281114402Sru    break;
282114402Sru  case HASH('s', 'r'):
283114402Sru    height = (param.em*3)/4;
284114402Sru    depth = param.em/4;
285114402Sru    break;
286114402Sru  case HASH('b', 'u'):
287114402Sru  case HASH('s', 'q'):
288114402Sru  case HASH('d', 'e'):
289114402Sru  case HASH('d', 'g'):
290114402Sru  case HASH('f', 'm'):
291114402Sru  case HASH('c', 't'):
292114402Sru  case HASH('r', 'g'):
293114402Sru  case HASH('c', 'o'):
294114402Sru  case HASH('p', 'l'):
295114402Sru  case HASH('*', '*'):
296114402Sru  case HASH('s', 'c'):
297114402Sru  case HASH('s', 'l'):
298114402Sru  case HASH('=', '='):
299114402Sru  case HASH('~', '='):
300114402Sru  case HASH('a', 'p'):
301114402Sru  case HASH('!', '='):
302114402Sru  case HASH('-', '>'):
303114402Sru  case HASH('<', '-'):
304114402Sru  case HASH('u', 'a'):
305114402Sru  case HASH('d', 'a'):
306114402Sru  case HASH('m', 'u'):
307114402Sru  case HASH('d', 'i'):
308114402Sru  case HASH('+', '-'):
309114402Sru  case HASH('c', 'u'):
310114402Sru  case HASH('c', 'a'):
311114402Sru  case HASH('s', 'b'):
312114402Sru  case HASH('s', 'p'):
313114402Sru  case HASH('i', 'b'):
314114402Sru  case HASH('i', 'p'):
315114402Sru  case HASH('i', 'f'):
316114402Sru  case HASH('p', 'd'):
317114402Sru  case HASH('g', 'r'):
318114402Sru  case HASH('n', 'o'):
319114402Sru  case HASH('p', 't'):
320114402Sru  case HASH('e', 's'):
321114402Sru  case HASH('m', 'o'):
322114402Sru  case HASH('b', 'r'):
323114402Sru  case HASH('d', 'd'):
324114402Sru  case HASH('r', 'h'):
325114402Sru  case HASH('l', 'h'):
326114402Sru  case HASH('o', 'r'):
327114402Sru  case HASH('c', 'i'):
328114402Sru    height = param.asc_height;
329114402Sru    break;
330114402Sru  case HASH('l', 't'):
331114402Sru  case HASH('l', 'b'):
332114402Sru  case HASH('r', 't'):
333114402Sru  case HASH('r', 'b'):
334114402Sru  case HASH('l', 'k'):
335114402Sru  case HASH('r', 'k'):
336114402Sru  case HASH('b', 'v'):
337114402Sru  case HASH('l', 'f'):
338114402Sru  case HASH('r', 'f'):
339114402Sru  case HASH('l', 'c'):
340114402Sru  case HASH('r', 'c'):
341114402Sru    height = (param.em*3)/4;
342114402Sru    depth = param.em/4;
343114402Sru    break;
344114402Sru#if 0
345114402Sru  case HASH('%', '0'):
346114402Sru  case HASH('-', '+'):
347114402Sru  case HASH('-', 'D'):
348114402Sru  case HASH('-', 'd'):
349114402Sru  case HASH('-', 'd'):
350114402Sru  case HASH('-', 'h'):
351114402Sru  case HASH('.', 'i'):
352114402Sru  case HASH('.', 'j'):
353114402Sru  case HASH('/', 'L'):
354114402Sru  case HASH('/', 'O'):
355114402Sru  case HASH('/', 'l'):
356114402Sru  case HASH('/', 'o'):
357114402Sru  case HASH('=', '~'):
358114402Sru  case HASH('A', 'E'):
359114402Sru  case HASH('A', 'h'):
360114402Sru  case HASH('A', 'N'):
361114402Sru  case HASH('C', 's'):
362114402Sru  case HASH('D', 'o'):
363114402Sru  case HASH('F', 'c'):
364114402Sru  case HASH('F', 'o'):
365114402Sru  case HASH('I', 'J'):
366114402Sru  case HASH('I', 'm'):
367114402Sru  case HASH('O', 'E'):
368114402Sru  case HASH('O', 'f'):
369114402Sru  case HASH('O', 'K'):
370114402Sru  case HASH('O', 'm'):
371114402Sru  case HASH('O', 'R'):
372114402Sru  case HASH('P', 'o'):
373114402Sru  case HASH('R', 'e'):
374114402Sru  case HASH('S', '1'):
375114402Sru  case HASH('S', '2'):
376114402Sru  case HASH('S', '3'):
377114402Sru  case HASH('T', 'P'):
378114402Sru  case HASH('T', 'p'):
379114402Sru  case HASH('Y', 'e'):
380114402Sru  case HASH('\\', '-'):
381114402Sru  case HASH('a', '"'):
382114402Sru  case HASH('a', '-'):
383114402Sru  case HASH('a', '.'):
384114402Sru  case HASH('a', '^'):
385114402Sru  case HASH('a', 'b'):
386114402Sru  case HASH('a', 'c'):
387114402Sru  case HASH('a', 'd'):
388114402Sru  case HASH('a', 'e'):
389114402Sru  case HASH('a', 'h'):
390114402Sru  case HASH('a', 'o'):
391114402Sru  case HASH('a', 't'):
392114402Sru  case HASH('a', '~'):
393114402Sru  case HASH('b', 'a'):
394114402Sru  case HASH('b', 'b'):
395114402Sru  case HASH('b', 's'):
396114402Sru  case HASH('c', '*'):
397114402Sru  case HASH('c', '+'):
398114402Sru  case HASH('f', '/'):
399114402Sru  case HASH('f', 'a'):
400114402Sru  case HASH('f', 'c'):
401114402Sru  case HASH('f', 'o'):
402114402Sru  case HASH('h', 'a'):
403114402Sru  case HASH('h', 'o'):
404114402Sru  case HASH('i', 'j'):
405114402Sru  case HASH('l', 'A'):
406114402Sru  case HASH('l', 'B'):
407114402Sru  case HASH('l', 'C'):
408114402Sru  case HASH('m', 'd'):
409114402Sru  case HASH('n', 'c'):
410114402Sru  case HASH('n', 'e'):
411114402Sru  case HASH('n', 'm'):
412114402Sru  case HASH('o', 'A'):
413114402Sru  case HASH('o', 'a'):
414114402Sru  case HASH('o', 'e'):
415114402Sru  case HASH('o', 'q'):
416114402Sru  case HASH('p', 'l'):
417114402Sru  case HASH('p', 'p'):
418114402Sru  case HASH('p', 's'):
419114402Sru  case HASH('r', '!'):
420114402Sru  case HASH('r', '?'):
421114402Sru  case HASH('r', 'A'):
422114402Sru  case HASH('r', 'B'):
423114402Sru  case HASH('r', 'C'):
424114402Sru  case HASH('r', 's'):
425114402Sru  case HASH('s', 'h'):
426114402Sru  case HASH('s', 's'):
427114402Sru  case HASH('t', 'e'):
428114402Sru  case HASH('t', 'f'):
429114402Sru  case HASH('t', 'i'):
430114402Sru  case HASH('t', 'm'):
431114402Sru  case HASH('~', '~'):
432114402Sru  case HASH('v', 'S'):
433114402Sru  case HASH('v', 'Z'):
434114402Sru  case HASH('v', 's'):
435114402Sru  case HASH('v', 'z'):
436114402Sru  case HASH('^', 'A'):
437114402Sru  case HASH('^', 'E'):
438114402Sru  case HASH('^', 'I'):
439114402Sru  case HASH('^', 'O'):
440114402Sru  case HASH('^', 'U'):
441114402Sru  case HASH('^', 'a'):
442114402Sru  case HASH('^', 'e'):
443114402Sru  case HASH('^', 'i'):
444114402Sru  case HASH('^', 'o'):
445114402Sru  case HASH('^', 'u'):
446114402Sru  case HASH('`', 'A'):
447114402Sru  case HASH('`', 'E'):
448114402Sru  case HASH('`', 'I'):
449114402Sru  case HASH('`', 'O'):
450114402Sru  case HASH('`', 'U'):
451114402Sru  case HASH('`', 'a'):
452114402Sru  case HASH('`', 'e'):
453114402Sru  case HASH('`', 'i'):
454114402Sru  case HASH('`', 'o'):
455114402Sru  case HASH('`', 'u'):
456114402Sru  case HASH('~', 'A'):
457114402Sru  case HASH('~', 'N'):
458114402Sru  case HASH('~', 'O'):
459114402Sru  case HASH('~', 'a'):
460114402Sru  case HASH('~', 'n'):
461114402Sru  case HASH('~', 'o'):
462114402Sru  case HASH('\'', 'A'):
463114402Sru  case HASH('\'', 'C'):
464114402Sru  case HASH('\'', 'E'):
465114402Sru  case HASH('\'', 'I'):
466114402Sru  case HASH('\'', 'O'):
467114402Sru  case HASH('\'', 'U'):
468114402Sru  case HASH('\'', 'a'):
469114402Sru  case HASH('\'', 'c'):
470114402Sru  case HASH('\'', 'e'):
471114402Sru  case HASH('\'', 'i'):
472114402Sru  case HASH('\'', 'o'):
473114402Sru  case HASH('\'', 'u')
474114402Sru  case HASH(':', 'A'):
475114402Sru  case HASH(':', 'E'):
476114402Sru  case HASH(':', 'I'):
477114402Sru  case HASH(':', 'O'):
478114402Sru  case HASH(':', 'U'):
479114402Sru  case HASH(':', 'Y'):
480114402Sru  case HASH(':', 'a'):
481114402Sru  case HASH(':', 'e'):
482114402Sru  case HASH(':', 'i'):
483114402Sru  case HASH(':', 'o'):
484114402Sru  case HASH(':', 'u'):
485114402Sru  case HASH(':', 'y'):
486114402Sru  case HASH(',', 'C'):
487114402Sru  case HASH(',', 'c'):
488114402Sru#endif
489114402Sru  }
490114402Sru}
491