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