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 ¶m, 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