LCOV - code coverage report
Current view: top level - libs/libgroff - uniglyph.cpp (source / functions) Hit Total Coverage
Test: GNU roff Lines: 10 10 100.0 %
Date: 2026-01-16 17:51:41 Functions: 7 10 70.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* Copyright 2002-2024 Free Software Foundation, Inc.
       2             :      Written by Werner Lemberg <wl@gnu.org>
       3             : 
       4             : This file is part of groff, the GNU roff typesetting system.
       5             : 
       6             : groff is free software; you can redistribute it and/or modify it under
       7             : the terms of the GNU General Public License as published by the Free
       8             : Software Foundation, either version 3 of the License, or
       9             : (at your option) any later version.
      10             : 
      11             : groff is distributed in the hope that it will be useful, but WITHOUT ANY
      12             : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13             : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14             : for more details.
      15             : 
      16             : You should have received a copy of the GNU General Public License
      17             : along with this program.  If not, see <http://www.gnu.org/licenses/>. */
      18             : 
      19             : #ifdef HAVE_CONFIG_H
      20             : #include <config.h>
      21             : #endif
      22             : 
      23             : #include <stdcountof.h>
      24             : 
      25             : #include "lib.h"
      26             : 
      27             : #include "stringclass.h"
      28             : #include "ptable.h"
      29             : #include "unicode.h"
      30             : 
      31             : struct unicode_to_glyph {
      32             :   char *value;
      33             : };
      34             : 
      35             : declare_ptable(unicode_to_glyph)
      36    17696747 : implement_ptable(unicode_to_glyph)
      37             : 
      38             : PTABLE(unicode_to_glyph) unicode_to_glyph_table;
      39             : 
      40             : struct S {
      41             :   const char *key;
      42             :   const char *value;
      43             : } unicode_to_glyph_list[] = {
      44             :   { "0021", "!" },
      45             : //{ "0022", "\"" },
      46             :   { "0022", "dq" },
      47             : //{ "0023", "#" },
      48             :   { "0023", "sh" },
      49             : //{ "0024", "$" },
      50             :   { "0024", "Do" },
      51             :   { "0025", "%" },
      52             :   { "0026", "&" },
      53             :   { "0027", "aq" },
      54             :   { "0028", "(" },
      55             :   { "0029", ")" },
      56             :   { "002A", "*" },
      57             : //{ "002B", "+" },
      58             :   { "002B", "pl" },
      59             :   { "002C", "," },
      60             :   { "002E", "." },
      61             : //{ "002F", "/" },
      62             :   { "002F", "sl" },
      63             :   { "0030", "0" },
      64             :   { "0031", "1" },
      65             :   { "0032", "2" },
      66             :   { "0033", "3" },
      67             :   { "0034", "4" },
      68             :   { "0035", "5" },
      69             :   { "0036", "6" },
      70             :   { "0037", "7" },
      71             :   { "0038", "8" },
      72             :   { "0039", "9" },
      73             :   { "003A", ":" },
      74             :   { "003B", ";" },
      75             :   { "003C", "<" },
      76             : //{ "003D", "=" },
      77             :   { "003D", "eq" },
      78             :   { "003D_0338", "!=" },
      79             :   { "003E", ">" },
      80             :   { "003F", "?" },
      81             : //{ "0040", "@" },
      82             :   { "0040", "at" },
      83             :   { "0041", "A" },
      84             :   { "0041_0300", "`A" },
      85             :   { "0041_0301", "'A" },
      86             :   { "0041_0302", "^A" },
      87             :   { "0041_0303", "~A" },
      88             :   { "0041_0308", ":A" },
      89             :   { "0041_030A", "oA" },
      90             :   { "0042", "B" },
      91             :   { "0043", "C" },
      92             :   { "0043_0301", "'C" },
      93             :   { "0043_0327", ",C" },
      94             :   { "0044", "D" },
      95             :   { "0045", "E" },
      96             :   { "0045_0300", "`E" },
      97             :   { "0045_0301", "'E" },
      98             :   { "0045_0302", "^E" },
      99             :   { "0045_0308", ":E" },
     100             :   { "0046", "F" },
     101             :   { "0047", "G" },
     102             :   { "0048", "H" },
     103             :   { "0049", "I" },
     104             :   { "0049_0300", "`I" },
     105             :   { "0049_0301", "'I" },
     106             :   { "0049_0302", "^I" },
     107             :   { "0049_0308", ":I" },
     108             :   { "004A", "J" },
     109             :   { "004B", "K" },
     110             :   { "004C", "L" },
     111             :   { "004D", "M" },
     112             :   { "004E", "N" },
     113             :   { "004E_0303", "~N" },
     114             :   { "004F", "O" },
     115             :   { "004F_0300", "`O" },
     116             :   { "004F_0301", "'O" },
     117             :   { "004F_0302", "^O" },
     118             :   { "004F_0303", "~O" },
     119             :   { "004F_0308", ":O" },
     120             :   { "0050", "P" },
     121             :   { "0051", "Q" },
     122             :   { "0052", "R" },
     123             :   { "0053", "S" },
     124             :   { "0053_030C", "vS" },
     125             :   { "0054", "T" },
     126             :   { "0055", "U" },
     127             :   { "0055_0300", "`U" },
     128             :   { "0055_0301", "'U" },
     129             :   { "0055_0302", "^U" },
     130             :   { "0055_0308", ":U" },
     131             :   { "0056", "V" },
     132             :   { "0057", "W" },
     133             :   { "0058", "X" },
     134             :   { "0059", "Y" },
     135             :   { "0059_0301", "'Y" },
     136             :   { "0059_0308", ":Y" },
     137             :   { "005A", "Z" },
     138             :   { "005A_030C", "vZ" },
     139             :   { "005B", "lB" },
     140             : //{ "005B", "[" },
     141             :   { "005C", "rs" },
     142             : //{ "005C", "\\" },
     143             :   { "005D", "rB" },
     144             : //{ "005D", "]" },
     145             : //{ "005E", "^" },
     146             : //{ "005E", "a^" },
     147             :   { "005E", "ha" },
     148             : //{ "005F", "_" },
     149             : //{ "005F", "ru" },
     150             :   { "005F", "ul" },
     151             :   { "0060", "ga" },
     152             :   { "0061", "a" },
     153             :   { "0061_0300", "`a" },
     154             :   { "0061_0301", "'a" },
     155             :   { "0061_0302", "^a" },
     156             :   { "0061_0303", "~a" },
     157             :   { "0061_0308", ":a" },
     158             :   { "0061_030A", "oa" },
     159             :   { "0062", "b" },
     160             :   { "0063", "c" },
     161             :   { "0063_0301", "'c" },
     162             :   { "0063_0327", ",c" },
     163             :   { "0064", "d" },
     164             :   { "0065", "e" },
     165             :   { "0065_0300", "`e" },
     166             :   { "0065_0301", "'e" },
     167             :   { "0065_0302", "^e" },
     168             :   { "0065_0308", ":e" },
     169             :   { "0066", "f" },
     170             :   { "0066_0066", "ff" },
     171             :   { "0066_0066_0069", "Fi" },
     172             :   { "0066_0066_006C", "Fl" },
     173             :   { "0066_0069", "fi" },
     174             :   { "0066_006C", "fl" },
     175             :   { "0067", "g" },
     176             :   { "0068", "h" },
     177             :   { "0069", "i" },
     178             :   { "0069_0300", "`i" },
     179             :   { "0069_0301", "'i" },
     180             :   { "0069_0302", "^i" },
     181             :   { "0069_0308", ":i" },
     182             :   { "006A", "j" },
     183             :   { "006B", "k" },
     184             :   { "006C", "l" },
     185             :   { "006D", "m" },
     186             :   { "006E", "n" },
     187             :   { "006E_0303", "~n" },
     188             :   { "006F", "o" },
     189             :   { "006F_0300", "`o" },
     190             :   { "006F_0301", "'o" },
     191             :   { "006F_0302", "^o" },
     192             :   { "006F_0303", "~o" },
     193             :   { "006F_0308", ":o" },
     194             :   { "0070", "p" },
     195             :   { "0071", "q" },
     196             :   { "0072", "r" },
     197             :   { "0073", "s" },
     198             :   { "0073_030C", "vs" },
     199             :   { "0074", "t" },
     200             :   { "0075", "u" },
     201             :   { "0075_0300", "`u" },
     202             :   { "0075_0301", "'u" },
     203             :   { "0075_0302", "^u" },
     204             :   { "0075_0308", ":u" },
     205             :   { "0076", "v" },
     206             :   { "0077", "w" },
     207             :   { "0078", "x" },
     208             :   { "0079", "y" },
     209             :   { "0079_0301", "'y" },
     210             :   { "0079_0308", ":y" },
     211             :   { "007A", "z" },
     212             :   { "007A_030C", "vz" },
     213             :   { "007B", "lC" },
     214             : //{ "007B", "{" },
     215             :   { "007C", "ba" },
     216             : //{ "007C", "or" },
     217             : //{ "007C", "|" },
     218             :   { "007D", "rC" },
     219             : //{ "007D", "}" },
     220             : //{ "007E", "a~" },
     221             :   { "007E", "ti" },
     222             : //{ "007E", "~" },
     223             :   { "00A1", "r!" },
     224             :   { "00A2", "ct" },
     225             :   { "00A3", "Po" },
     226             :   { "00A4", "Cs" },
     227             :   { "00A5", "Ye" },
     228             :   { "00A6", "bb" },
     229             :   { "00A7", "sc" },
     230             :   { "00A8", "ad" },
     231             :   { "00A9", "co" },
     232             :   { "00AA", "Of" },
     233             :   { "00AB", "Fo" },
     234             :   { "00AC", "no" },
     235             : //{ "00AC", "tno" },
     236             :   // In groff, U+00AD is an input character only; it is not mapped to
     237             :   // a glyph but to '\%'.
     238             :   { "00AE", "rg" },
     239             :   { "00AF", "a-" },
     240             :   { "00B0", "de" },
     241             :   { "00B1", "+-" },
     242             : //{ "00B1", "t+-" },
     243             :   { "00B2", "S2" },
     244             :   { "00B3", "S3" },
     245             :   { "00B4", "aa" },
     246             :   { "00B5", "mc" },
     247             :   { "00B6", "ps" },
     248             :   { "00B7", "pc" },
     249             :   { "00B8", "ac" },
     250             :   { "00B9", "S1" },
     251             :   { "00BA", "Om" },
     252             :   { "00BB", "Fc" },
     253             :   { "00BC", "14" },
     254             :   { "00BD", "12" },
     255             :   { "00BE", "34" },
     256             :   { "00BF", "r?" },
     257             :   { "00C6", "AE" },
     258             :   { "00D0", "-D" },
     259             :   { "00D7", "mu" },
     260             : //{ "00D7", "tmu" },
     261             :   { "00D8", "/O" },
     262             :   { "00DE", "TP" },
     263             :   { "00DF", "ss" },
     264             :   { "00E6", "ae" },
     265             :   { "00F0", "Sd" },
     266             :   { "00F7", "di" },
     267             : //{ "00F7", "tdi" },
     268             :   { "00F8", "/o" },
     269             :   { "00FE", "Tp" },
     270             :   { "0131", ".i" },
     271             :   { "0132", "IJ" },
     272             :   { "0133", "ij" },
     273             :   { "0141", "/L" },
     274             :   { "0142", "/l" },
     275             :   { "0152", "OE" },
     276             :   { "0153", "oe" },
     277             :   { "0192", "Fn" },
     278             :   { "0237", ".j" },
     279             :   { "02C7", "ah" },
     280             :   { "02D8", "ab" },
     281             :   { "02D9", "a." },
     282             :   { "02DA", "ao" },
     283             :   { "02DB", "ho" },
     284             :   { "02DD", "a\"" },
     285             : //{ "2010", "-" },
     286             :   { "2010", "hy" },
     287             :   { "2013", "en" },
     288             :   { "2014", "em" },
     289             : //{ "2018", "`" },
     290             :   { "2018", "oq" },
     291             : //{ "2019", "'" },
     292             :   { "2019", "cq" },
     293             :   { "201A", "bq" },
     294             :   { "201C", "lq" },
     295             :   { "201D", "rq" },
     296             :   { "201E", "Bq" },
     297             :   { "2020", "dg" },
     298             :   { "2021", "dd" },
     299             :   { "2022", "bu" },
     300             :   { "2030", "%0" },
     301             :   { "2032", "fm" },
     302             :   { "2033", "sd" },
     303             :   { "2039", "fo" },
     304             :   { "203A", "fc" },
     305             :   { "203E", "rn" },
     306             :   { "2044", "f/" },
     307             :   { "20AC", "Eu" },
     308             : //{ "20AC", "eu" },
     309             :   { "210F", "-h" },
     310             : //{ "210F", "hbar" },
     311             :   { "2111", "Im" },
     312             :   { "2118", "wp" },
     313             :   { "211C", "Re" },
     314             :   { "2122", "tm" },
     315             :   { "2135", "Ah" },
     316             :   { "215B", "18" },
     317             :   { "215C", "38" },
     318             :   { "215D", "58" },
     319             :   { "215E", "78" },
     320             :   { "2190", "<-" },
     321             :   { "2191", "ua" },
     322             :   { "2192", "->" },
     323             :   { "2193", "da" },
     324             :   { "2194", "<>" },
     325             :   { "2195", "va" },
     326             :   { "21B5", "CR" },
     327             :   { "21D0", "lA" },
     328             :   { "21D1", "uA" },
     329             :   { "21D2", "rA" },
     330             :   { "21D3", "dA" },
     331             :   { "21D4", "hA" },
     332             :   { "21D5", "vA" },
     333             :   { "2200", "fa" },
     334             :   { "2202", "pd" },
     335             :   { "2203", "te" },
     336             :   { "2205", "es" },
     337             :   { "2207", "gr" },
     338             :   { "2208", "mo" },
     339             :   { "2208_0338", "nm" },
     340             :   { "220B", "st" },
     341             :   { "220F", "product" },
     342             :   { "2210", "coproduct" },
     343             :   { "2211", "sum" },
     344             :   { "2212", "mi" },
     345             : //{ "2212", "\\-" },
     346             :   { "2213", "-+" },
     347             :   { "2217", "**" },
     348             :   { "221A", "sr" },
     349             :   { "221D", "pt" },
     350             :   { "221E", "if" },
     351             :   { "2220", "/_" },
     352             :   { "2227", "AN" },
     353             :   { "2228", "OR" },
     354             :   { "2229", "ca" },
     355             :   { "222A", "cu" },
     356             :   { "222B", "is" },
     357             : //{ "222B", "integral" },
     358             : //{ "2234", "3d" },
     359             :   { "2234", "tf" },
     360             :   { "223C", "ap" },
     361             :   { "2243", "|=" },
     362             :   { "2245", "=~" },
     363             : //{ "2248", "~=" },
     364             :   { "2248", "~~" },
     365             :   { "2261", "==" },
     366             :   { "2261_0338", "ne" },
     367             :   { "2264", "<=" },
     368             :   { "2265", ">=" },
     369             :   { "226A", ">>" },
     370             :   { "226B", "<<" },
     371             :   { "2282", "sb" },
     372             :   { "2282_0338", "nb" },
     373             :   { "2283", "sp" },
     374             :   { "2283_0338", "nc" },
     375             :   { "2286", "ib" },
     376             :   { "2287", "ip" },
     377             :   { "2295", "c+" },
     378             :   { "2297", "c*" },
     379             :   { "22A5", "pp" },
     380             :   { "22C5", "md" },
     381             :   { "2308", "lc" },
     382             :   { "2309", "rc" },
     383             :   { "230A", "lf" },
     384             :   { "230B", "rf" },
     385             :   { "239B", "parenlefttp" },
     386             :   { "239C", "parenleftex" },
     387             :   { "239D", "parenleftbt" },
     388             :   { "239E", "parenrighttp" },
     389             :   { "239F", "parenrightex" },
     390             :   { "23A0", "parenrightbt" },
     391             : //{ "23A1", "bracketlefttp" },
     392             :   { "23A2", "bracketleftex" },
     393             : //{ "23A3", "bracketleftbt" },
     394             : //{ "23A4", "bracketrighttp" },
     395             :   { "23A5", "bracketrightex" },
     396             : //{ "23A6", "bracketrightbt" },
     397             :   { "23A7", "lt" },
     398             : //{ "23A7", "bracelefttp" },
     399             :   { "23A8", "lk" },
     400             : //{ "23A8", "braceleftmid" },
     401             :   { "23A9", "lb" },
     402             : //{ "23A9", "braceleftbt" },
     403             :   { "23AA", "bv" },
     404             : //{ "23AA", "braceex" },
     405             : //{ "23AA", "braceleftex" },
     406             : //{ "23AA", "bracerightex" },
     407             :   { "23AB", "rt" },
     408             : //{ "23AB", "bracerighttp" },
     409             :   { "23AC", "rk" },
     410             : //{ "23AC", "bracerightmid" },
     411             :   { "23AD", "rb" },
     412             : //{ "23AD", "bracerightbt" },
     413             :   { "23AF", "an" },
     414             :   { "2502", "br" },
     415             :   { "25A1", "sq" },
     416             :   { "25CA", "lz" },
     417             :   { "25CB", "ci" },
     418             :   { "261C", "lh" },
     419             :   { "261E", "rh" },
     420             :   { "2660", "SP" },
     421             :   { "2663", "CL" },
     422             :   { "2665", "HE" },
     423             :   { "2666", "DI" },
     424             :   { "2713", "OK" },
     425             :   { "27E8", "la" },
     426             :   { "27E9", "ra" },
     427             : };
     428             : 
     429             : // global constructor
     430             : static struct unicode_to_glyph_init {
     431             :   unicode_to_glyph_init();
     432             : } _unicode_to_glyph_init;
     433             : 
     434        1420 : unicode_to_glyph_init::unicode_to_glyph_init()
     435             : {
     436      477120 :   for (unsigned int i = 0; i < countof(unicode_to_glyph_list); i++) {
     437      475700 :     unicode_to_glyph *utg = new unicode_to_glyph[1];
     438      475700 :     utg->value = (char *)unicode_to_glyph_list[i].value;
     439      475700 :     unicode_to_glyph_table.define(unicode_to_glyph_list[i].key, utg);
     440             :   }
     441        1420 : }
     442             : 
     443      167550 : const char *unicode_to_glyph_name(const char *s)
     444             : {
     445      167550 :   unicode_to_glyph *result = unicode_to_glyph_table.lookup(s);
     446      167550 :   return result ? result->value : 0;
     447             : }
     448             : 
     449             : // Local Variables:
     450             : // fill-column: 72
     451             : // mode: C++
     452             : // End:
     453             : // vim: set cindent noexpandtab shiftwidth=2 textwidth=72:

Generated by: LCOV version 1.14