1151497Sru// -*- C++ -*- 2151497Sru/* Copyright (C) 2002, 2003, 2004 3151497Sru Free Software Foundation, Inc. 4151497Sru Written by Werner Lemberg <wl@gnu.org> 5151497Sru 6151497SruThis file is part of groff. 7151497Sru 8151497Srugroff is free software; you can redistribute it and/or modify it under 9151497Sruthe terms of the GNU General Public License as published by the Free 10151497SruSoftware Foundation; either version 2, or (at your option) any later 11151497Sruversion. 12151497Sru 13151497Srugroff is distributed in the hope that it will be useful, but WITHOUT ANY 14151497SruWARRANTY; without even the implied warranty of MERCHANTABILITY or 15151497SruFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16151497Srufor more details. 17151497Sru 18151497SruYou should have received a copy of the GNU General Public License along 19151497Sruwith groff; see the file COPYING. If not, write to the Free Software 20151497SruFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 21151497Sru 22151497Sru#include "lib.h" 23151497Sru#include "stringclass.h" 24151497Sru#include "ptable.h" 25151497Sru 26151497Sru#include "unicode.h" 27151497Sru 28151497Srustruct unicode_to_glyph { 29151497Sru char *value; 30151497Sru}; 31151497Sru 32151497Srudeclare_ptable(unicode_to_glyph) 33151497Sruimplement_ptable(unicode_to_glyph) 34151497Sru 35151497SruPTABLE(unicode_to_glyph) unicode_to_glyph_table; 36151497Sru 37151497Srustruct S { 38151497Sru const char *key; 39151497Sru const char *value; 40151497Sru} unicode_to_glyph_list[] = { 41151497Sru { "0021", "!" }, 42151497Sru//{ "0022", "\"" }, 43151497Sru { "0022", "dq" }, 44151497Sru//{ "0023", "#" }, 45151497Sru { "0023", "sh" }, 46151497Sru//{ "0024", "$" }, 47151497Sru { "0024", "Do" }, 48151497Sru { "0025", "%" }, 49151497Sru { "0026", "&" }, 50151497Sru { "0027", "aq" }, 51151497Sru { "0028", "(" }, 52151497Sru { "0029", ")" }, 53151497Sru { "002A", "*" }, 54151497Sru//{ "002B", "+" }, 55151497Sru { "002B", "pl" }, 56151497Sru { "002C", "," }, 57151497Sru { "002E", "." }, 58151497Sru//{ "002F", "/" }, 59151497Sru { "002F", "sl" }, 60151497Sru { "0030", "0" }, 61151497Sru { "0031", "1" }, 62151497Sru { "0032", "2" }, 63151497Sru { "0033", "3" }, 64151497Sru { "0034", "4" }, 65151497Sru { "0035", "5" }, 66151497Sru { "0036", "6" }, 67151497Sru { "0037", "7" }, 68151497Sru { "0038", "8" }, 69151497Sru { "0039", "9" }, 70151497Sru { "003A", ":" }, 71151497Sru { "003B", ";" }, 72151497Sru { "003C", "<" }, 73151497Sru//{ "003D", "=" }, 74151497Sru { "003D", "eq" }, 75151497Sru { "003D_0338", "!=" }, 76151497Sru { "003E", ">" }, 77151497Sru { "003F", "?" }, 78151497Sru//{ "0040", "@" }, 79151497Sru { "0040", "at" }, 80151497Sru { "0041", "A" }, 81151497Sru { "0041_0300", "`A" }, 82151497Sru { "0041_0301", "'A" }, 83151497Sru { "0041_0302", "^A" }, 84151497Sru { "0041_0303", "~A" }, 85151497Sru { "0041_0308", ":A" }, 86151497Sru { "0041_030A", "oA" }, 87151497Sru { "0042", "B" }, 88151497Sru { "0043", "C" }, 89151497Sru { "0043_0301", "'C" }, 90151497Sru { "0043_0327", ",C" }, 91151497Sru { "0044", "D" }, 92151497Sru { "0045", "E" }, 93151497Sru { "0045_0300", "`E" }, 94151497Sru { "0045_0301", "'E" }, 95151497Sru { "0045_0302", "^E" }, 96151497Sru { "0045_0308", ":E" }, 97151497Sru { "0046", "F" }, 98151497Sru { "0047", "G" }, 99151497Sru { "0048", "H" }, 100151497Sru { "0049", "I" }, 101151497Sru { "0049_0300", "`I" }, 102151497Sru { "0049_0301", "'I" }, 103151497Sru { "0049_0302", "^I" }, 104151497Sru { "0049_0308", ":I" }, 105151497Sru { "004A", "J" }, 106151497Sru { "004B", "K" }, 107151497Sru { "004C", "L" }, 108151497Sru { "004D", "M" }, 109151497Sru { "004E", "N" }, 110151497Sru { "004E_0303", "~N" }, 111151497Sru { "004F", "O" }, 112151497Sru { "004F_0300", "`O" }, 113151497Sru { "004F_0301", "'O" }, 114151497Sru { "004F_0302", "^O" }, 115151497Sru { "004F_0303", "~O" }, 116151497Sru { "004F_0308", ":O" }, 117151497Sru { "0050", "P" }, 118151497Sru { "0051", "Q" }, 119151497Sru { "0052", "R" }, 120151497Sru { "0053", "S" }, 121151497Sru { "0053_030C", "vS" }, 122151497Sru { "0054", "T" }, 123151497Sru { "0055", "U" }, 124151497Sru { "0055_0300", "`U" }, 125151497Sru { "0055_0301", "'U" }, 126151497Sru { "0055_0302", "^U" }, 127151497Sru { "0055_0308", ":U" }, 128151497Sru { "0056", "V" }, 129151497Sru { "0057", "W" }, 130151497Sru { "0058", "X" }, 131151497Sru { "0059", "Y" }, 132151497Sru { "0059_0301", "'Y" }, 133151497Sru { "0059_0308", ":Y" }, 134151497Sru { "005A", "Z" }, 135151497Sru { "005A_030C", "vZ" }, 136151497Sru { "005B", "lB" }, 137151497Sru//{ "005B", "[" }, 138151497Sru { "005C", "rs" }, 139151497Sru//{ "005C", "\\" }, 140151497Sru { "005D", "rB" }, 141151497Sru//{ "005D", "]" }, 142151497Sru//{ "005E", "^" }, 143151497Sru//{ "005E", "a^" }, 144151497Sru { "005E", "ha" }, 145151497Sru//{ "005F", "_" }, 146151497Sru//{ "005F", "ru" }, 147151497Sru { "005F", "ul" }, 148151497Sru { "0060", "ga" }, 149151497Sru//{ "0060", "\\`" }, 150151497Sru { "0061", "a" }, 151151497Sru { "0061_0300", "`a" }, 152151497Sru { "0061_0301", "'a" }, 153151497Sru { "0061_0302", "^a" }, 154151497Sru { "0061_0303", "~a" }, 155151497Sru { "0061_0308", ":a" }, 156151497Sru { "0061_030A", "oa" }, 157151497Sru { "0062", "b" }, 158151497Sru { "0063", "c" }, 159151497Sru { "0063_0301", "'c" }, 160151497Sru { "0063_0327", ",c" }, 161151497Sru { "0064", "d" }, 162151497Sru { "0065", "e" }, 163151497Sru { "0065_0300", "`e" }, 164151497Sru { "0065_0301", "'e" }, 165151497Sru { "0065_0302", "^e" }, 166151497Sru { "0065_0308", ":e" }, 167151497Sru { "0066", "f" }, 168151497Sru { "0066_0066", "ff" }, 169151497Sru { "0066_0066_0069", "Fi" }, 170151497Sru { "0066_0066_006C", "Fl" }, 171151497Sru { "0066_0069", "fi" }, 172151497Sru { "0066_006C", "fl" }, 173151497Sru { "0067", "g" }, 174151497Sru { "0068", "h" }, 175151497Sru { "0069", "i" }, 176151497Sru { "0069_0300", "`i" }, 177151497Sru { "0069_0301", "'i" }, 178151497Sru { "0069_0302", "^i" }, 179151497Sru { "0069_0308", ":i" }, 180151497Sru { "006A", "j" }, 181151497Sru { "006B", "k" }, 182151497Sru { "006C", "l" }, 183151497Sru { "006D", "m" }, 184151497Sru { "006E", "n" }, 185151497Sru { "006E_0303", "~n" }, 186151497Sru { "006F", "o" }, 187151497Sru { "006F_0300", "`o" }, 188151497Sru { "006F_0301", "'o" }, 189151497Sru { "006F_0302", "^o" }, 190151497Sru { "006F_0303", "~o" }, 191151497Sru { "006F_0308", ":o" }, 192151497Sru { "0070", "p" }, 193151497Sru { "0071", "q" }, 194151497Sru { "0072", "r" }, 195151497Sru { "0073", "s" }, 196151497Sru { "0073_030C", "vs" }, 197151497Sru { "0074", "t" }, 198151497Sru { "0075", "u" }, 199151497Sru { "0075_0300", "`u" }, 200151497Sru { "0075_0301", "'u" }, 201151497Sru { "0075_0302", "^u" }, 202151497Sru { "0075_0308", ":u" }, 203151497Sru { "0076", "v" }, 204151497Sru { "0077", "w" }, 205151497Sru { "0078", "x" }, 206151497Sru { "0079", "y" }, 207151497Sru { "0079_0301", "'y" }, 208151497Sru { "0079_0308", ":y" }, 209151497Sru { "007A", "z" }, 210151497Sru { "007A_030C", "vz" }, 211151497Sru { "007B", "lC" }, 212151497Sru//{ "007B", "{" }, 213151497Sru { "007C", "ba" }, 214151497Sru//{ "007C", "or" }, 215151497Sru//{ "007C", "|" }, 216151497Sru { "007D", "rC" }, 217151497Sru//{ "007D", "}" }, 218151497Sru//{ "007E", "a~" }, 219151497Sru { "007E", "ti" }, 220151497Sru//{ "007E", "~" }, 221151497Sru { "00A1", "r!" }, 222151497Sru { "00A2", "ct" }, 223151497Sru { "00A3", "Po" }, 224151497Sru { "00A4", "Cs" }, 225151497Sru { "00A5", "Ye" }, 226151497Sru { "00A6", "bb" }, 227151497Sru { "00A7", "sc" }, 228151497Sru { "00A8", "ad" }, 229151497Sru { "00A9", "co" }, 230151497Sru { "00AA", "Of" }, 231151497Sru { "00AB", "Fo" }, 232151497Sru { "00AC", "no" }, 233151497Sru//{ "00AC", "tno" }, 234151497Sru { "00AD", "shc" }, 235151497Sru { "00AE", "rg" }, 236151497Sru { "00AF", "a-" }, 237151497Sru { "00B0", "de" }, 238151497Sru { "00B1", "+-" }, 239151497Sru//{ "00B1", "t+-" }, 240151497Sru { "00B2", "S2" }, 241151497Sru { "00B3", "S3" }, 242151497Sru { "00B4", "aa" }, 243151497Sru//{ "00B4", "\\'" }, 244151497Sru { "00B5", "mc" }, 245151497Sru { "00B6", "ps" }, 246151497Sru { "00B7", "pc" }, 247151497Sru { "00B8", "ac" }, 248151497Sru { "00B9", "S1" }, 249151497Sru { "00BA", "Om" }, 250151497Sru { "00BB", "Fc" }, 251151497Sru { "00BC", "14" }, 252151497Sru { "00BD", "12" }, 253151497Sru { "00BE", "34" }, 254151497Sru { "00BF", "r?" }, 255151497Sru { "00C6", "AE" }, 256151497Sru { "00D0", "-D" }, 257151497Sru { "00D7", "mu" }, 258151497Sru//{ "00D7", "tmu" }, 259151497Sru { "00D8", "/O" }, 260151497Sru { "00DE", "TP" }, 261151497Sru { "00DF", "ss" }, 262151497Sru { "00E6", "ae" }, 263151497Sru { "00F0", "Sd" }, 264151497Sru { "00F7", "di" }, 265151497Sru//{ "00F7", "tdi" }, 266151497Sru { "00F8", "/o" }, 267151497Sru { "00FE", "Tp" }, 268151497Sru { "0131", ".i" }, 269151497Sru { "0132", "IJ" }, 270151497Sru { "0133", "ij" }, 271151497Sru { "0141", "/L" }, 272151497Sru { "0142", "/l" }, 273151497Sru { "0152", "OE" }, 274151497Sru { "0153", "oe" }, 275151497Sru { "0192", "Fn" }, 276151497Sru { "02C7", "ah" }, 277151497Sru { "02D8", "ab" }, 278151497Sru { "02D9", "a." }, 279151497Sru { "02DA", "ao" }, 280151497Sru { "02DB", "ho" }, 281151497Sru { "02DD", "a\"" }, 282151497Sru { "0391", "*A" }, 283151497Sru { "0392", "*B" }, 284151497Sru { "0393", "*G" }, 285151497Sru { "0394", "*D" }, 286151497Sru { "0395", "*E" }, 287151497Sru { "0396", "*Z" }, 288151497Sru { "0397", "*Y" }, 289151497Sru { "0398", "*H" }, 290151497Sru { "0399", "*I" }, 291151497Sru { "039A", "*K" }, 292151497Sru { "039B", "*L" }, 293151497Sru { "039C", "*M" }, 294151497Sru { "039D", "*N" }, 295151497Sru { "039E", "*C" }, 296151497Sru { "039F", "*O" }, 297151497Sru { "03A0", "*P" }, 298151497Sru { "03A1", "*R" }, 299151497Sru { "03A3", "*S" }, 300151497Sru { "03A4", "*T" }, 301151497Sru { "03A5", "*U" }, 302151497Sru { "03A6", "*F" }, 303151497Sru { "03A7", "*X" }, 304151497Sru { "03A8", "*Q" }, 305151497Sru { "03A9", "*W" }, 306151497Sru { "03B1", "*a" }, 307151497Sru { "03B2", "*b" }, 308151497Sru { "03B3", "*g" }, 309151497Sru { "03B4", "*d" }, 310151497Sru { "03B5", "*e" }, 311151497Sru { "03B6", "*z" }, 312151497Sru { "03B7", "*y" }, 313151497Sru { "03B8", "*h" }, 314151497Sru { "03B9", "*i" }, 315151497Sru { "03BA", "*k" }, 316151497Sru { "03BB", "*l" }, 317151497Sru { "03BC", "*m" }, 318151497Sru { "03BD", "*n" }, 319151497Sru { "03BE", "*c" }, 320151497Sru { "03BF", "*o" }, 321151497Sru { "03C0", "*p" }, 322151497Sru { "03C1", "*r" }, 323151497Sru { "03C2", "ts" }, 324151497Sru { "03C3", "*s" }, 325151497Sru { "03C4", "*t" }, 326151497Sru { "03C5", "*u" }, 327151497Sru { "03C6", "*f" }, 328151497Sru { "03C7", "*x" }, 329151497Sru { "03C8", "*q" }, 330151497Sru { "03C9", "*w" }, 331151497Sru { "03D1", "+h" }, 332151497Sru { "03D5", "+f" }, 333151497Sru { "03D6", "+p" }, 334151497Sru { "03F5", "+e" }, 335151497Sru//{ "2010", "-" }, 336151497Sru { "2010", "hy" }, 337151497Sru { "2013", "en" }, 338151497Sru { "2014", "em" }, 339151497Sru//{ "2018", "`" }, 340151497Sru { "2018", "oq" }, 341151497Sru//{ "2019", "'" }, 342151497Sru { "2019", "cq" }, 343151497Sru { "201A", "bq" }, 344151497Sru { "201C", "lq" }, 345151497Sru { "201D", "rq" }, 346151497Sru { "201E", "Bq" }, 347151497Sru { "2020", "dg" }, 348151497Sru { "2021", "dd" }, 349151497Sru { "2022", "bu" }, 350151497Sru { "2030", "%0" }, 351151497Sru { "2032", "fm" }, 352151497Sru { "2033", "sd" }, 353151497Sru { "2039", "fo" }, 354151497Sru { "203A", "fc" }, 355151497Sru { "203E", "rn" }, 356151497Sru { "2044", "f/" }, 357151497Sru { "20AC", "Eu" }, 358151497Sru//{ "20AC", "eu" }, 359151497Sru { "210F", "-h" }, 360151497Sru//{ "210F", "hbar" }, 361151497Sru { "2111", "Im" }, 362151497Sru { "2118", "wp" }, 363151497Sru { "211C", "Re" }, 364151497Sru { "2122", "tm" }, 365151497Sru { "2135", "Ah" }, 366151497Sru { "215B", "18" }, 367151497Sru { "215C", "38" }, 368151497Sru { "215D", "58" }, 369151497Sru { "215E", "78" }, 370151497Sru { "2190", "<-" }, 371151497Sru { "2191", "ua" }, 372151497Sru { "2192", "->" }, 373151497Sru { "2193", "da" }, 374151497Sru { "2194", "<>" }, 375151497Sru { "2195", "va" }, 376151497Sru { "21B5", "CR" }, 377151497Sru { "21D0", "lA" }, 378151497Sru { "21D1", "uA" }, 379151497Sru { "21D2", "rA" }, 380151497Sru { "21D3", "dA" }, 381151497Sru { "21D4", "hA" }, 382151497Sru { "21D5", "vA" }, 383151497Sru { "2200", "fa" }, 384151497Sru { "2202", "pd" }, 385151497Sru { "2203", "te" }, 386151497Sru { "2205", "es" }, 387151497Sru { "2207", "gr" }, 388151497Sru { "2208", "mo" }, 389151497Sru { "2208_0338", "nm" }, 390151497Sru { "220B", "st" }, 391151497Sru { "220F", "product" }, 392151497Sru { "2210", "coproduct" }, 393151497Sru { "2211", "sum" }, 394151497Sru { "2212", "mi" }, 395151497Sru//{ "2212", "\\-" }, 396151497Sru { "2213", "-+" }, 397151497Sru { "2217", "**" }, 398151497Sru { "221A", "sr" }, 399151497Sru { "221D", "pt" }, 400151497Sru { "221E", "if" }, 401151497Sru { "2220", "/_" }, 402151497Sru { "2227", "AN" }, 403151497Sru { "2228", "OR" }, 404151497Sru { "2229", "ca" }, 405151497Sru { "222A", "cu" }, 406151497Sru { "222B", "is" }, 407151497Sru//{ "222B", "integral" }, 408151497Sru//{ "2234", "3d" }, 409151497Sru { "2234", "tf" }, 410151497Sru { "223C", "ap" }, 411151497Sru { "2243", "|=" }, 412151497Sru { "2245", "=~" }, 413151497Sru//{ "2248", "~=" }, 414151497Sru { "2248", "~~" }, 415151497Sru { "2261", "==" }, 416151497Sru { "2261_0338", "ne" }, 417151497Sru { "2264", "<=" }, 418151497Sru { "2265", ">=" }, 419151497Sru { "226A", ">>" }, 420151497Sru { "226B", "<<" }, 421151497Sru { "2282", "sb" }, 422151497Sru { "2282_0338", "nb" }, 423151497Sru { "2283", "sp" }, 424151497Sru { "2283_0338", "nc" }, 425151497Sru { "2286", "ib" }, 426151497Sru { "2287", "ip" }, 427151497Sru { "2295", "c+" }, 428151497Sru { "2297", "c*" }, 429151497Sru { "22A5", "pp" }, 430151497Sru { "22C5", "md" }, 431151497Sru { "2308", "lc" }, 432151497Sru { "2309", "rc" }, 433151497Sru { "230A", "lf" }, 434151497Sru { "230B", "rf" }, 435151497Sru { "239B", "parenlefttp" }, 436151497Sru { "239C", "parenleftex" }, 437151497Sru { "239D", "parenleftbt" }, 438151497Sru { "239E", "parenrighttp" }, 439151497Sru { "239F", "parenrightex" }, 440151497Sru { "23A0", "parenrightbt" }, 441151497Sru//{ "23A1", "bracketlefttp" }, 442151497Sru { "23A2", "bracketleftex" }, 443151497Sru//{ "23A3", "bracketleftbt" }, 444151497Sru//{ "23A4", "bracketrighttp" }, 445151497Sru { "23A5", "bracketrightex" }, 446151497Sru//{ "23A6", "bracketrightbt" }, 447151497Sru { "23A7", "lt" }, 448151497Sru//{ "23A7", "bracelefttp" }, 449151497Sru { "23A8", "lk" }, 450151497Sru//{ "23A8", "braceleftmid" }, 451151497Sru { "23A9", "lb" }, 452151497Sru//{ "23A9", "braceleftbt" }, 453151497Sru { "23AA", "bv" }, 454151497Sru//{ "23AA", "braceex" }, 455151497Sru//{ "23AA", "braceleftex" }, 456151497Sru//{ "23AA", "bracerightex" }, 457151497Sru { "23AB", "rt" }, 458151497Sru//{ "23AB", "bracerighttp" }, 459151497Sru { "23AC", "rk" }, 460151497Sru//{ "23AC", "bracerightmid" }, 461151497Sru { "23AD", "rb" }, 462151497Sru//{ "23AD", "bracerightbt" }, 463151497Sru { "23AF", "an" }, 464151497Sru { "2502", "br" }, 465151497Sru { "251D", "rk" }, 466151497Sru { "2525", "lk" }, 467151497Sru { "256D", "lt" }, 468151497Sru { "256E", "rt" }, 469151497Sru { "256F", "rb" }, 470151497Sru { "2570", "lb" }, 471151497Sru { "25A1", "sq" }, 472151497Sru { "25CA", "lz" }, 473151497Sru { "25CB", "ci" }, 474151497Sru { "261C", "lh" }, 475151497Sru { "261E", "rh" }, 476151497Sru { "2660", "SP" }, 477151497Sru { "2663", "CL" }, 478151497Sru { "2665", "HE" }, 479151497Sru { "2666", "DI" }, 480151497Sru { "2713", "OK" }, 481151497Sru { "27E8", "la" }, 482151497Sru { "27E9", "ra" }, 483151497Sru}; 484151497Sru 485151497Sru// global constructor 486151497Srustatic struct unicode_to_glyph_init { 487151497Sru unicode_to_glyph_init(); 488151497Sru} _unicode_to_glyph_init; 489151497Sru 490151497Sruunicode_to_glyph_init::unicode_to_glyph_init() { 491151497Sru for (unsigned int i = 0; 492151497Sru i < sizeof(unicode_to_glyph_list)/sizeof(unicode_to_glyph_list[0]); 493151497Sru i++) { 494151497Sru unicode_to_glyph *utg = new unicode_to_glyph[1]; 495151497Sru utg->value = (char *)unicode_to_glyph_list[i].value; 496151497Sru unicode_to_glyph_table.define(unicode_to_glyph_list[i].key, utg); 497151497Sru } 498151497Sru} 499151497Sru 500151497Sruconst char *unicode_to_glyph_name(const char *s) 501151497Sru{ 502151497Sru unicode_to_glyph *result = unicode_to_glyph_table.lookup(s); 503151497Sru return result ? result->value : 0; 504151497Sru} 505