home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / gnu / groff-1.09-src.lha / src / amiga / groff-1.09 / addftinfo / guess.cc < prev    next >
C/C++ Source or Header  |  1992-08-03  |  11KB  |  491 lines

  1. // -*- C++ -*-
  2. /* Copyright (C) 1989, 1990, 1991, 1992 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 2, or (at your option) any later
  10. 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 along
  18. with groff; see the file COPYING.  If not, write to the Free Software
  19. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
  20.  
  21. #include "guess.h"
  22.  
  23. void guess(const char *s, const font_params ¶m, 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.