glyphuni.cpp revision 302408
1103739Stjr// -*- C++ -*- 2103739Stjr/* Copyright (C) 2002, 2003, 2004 3103739Stjr Free Software Foundation, Inc. 4103739Stjr Written by Werner Lemberg <wl@gnu.org> 5103739Stjr 6103739StjrThis file is part of groff. 7103739Stjr 8103739Stjrgroff is free software; you can redistribute it and/or modify it under 9103739Stjrthe terms of the GNU General Public License as published by the Free 10103739StjrSoftware Foundation; either version 2, or (at your option) any later 11103739Stjrversion. 12103739Stjr 13103739Stjrgroff is distributed in the hope that it will be useful, but WITHOUT ANY 14103739StjrWARRANTY; without even the implied warranty of MERCHANTABILITY or 15103739StjrFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16103739Stjrfor more details. 17103739Stjr 18103739StjrYou should have received a copy of the GNU General Public License along 19103739Stjrwith groff; see the file COPYING. If not, write to the Free Software 20103739StjrFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 21103739Stjr 22103739Stjr#include "lib.h" 23103739Stjr#include "stringclass.h" 24103739Stjr#include "ptable.h" 25103739Stjr 26103739Stjr#include "unicode.h" 27103739Stjr 28103739Stjrstruct glyph_to_unicode { 29103739Stjr char *value; 30103739Stjr}; 31103739Stjr 32103739Stjrdeclare_ptable(glyph_to_unicode) 33103739Stjrimplement_ptable(glyph_to_unicode) 34103739Stjr 35103739StjrPTABLE(glyph_to_unicode) glyph_to_unicode_table; 36103739Stjr 37103739Stjrstruct S { 38128843Sobrien const char *key; 39103739Stjr const char *value; 40103739Stjr} glyph_to_unicode_list[] = { 41103739Stjr { "!", "0021" }, 42103739Stjr { "\"", "0022" }, 43103739Stjr { "dq", "0022" }, 44103739Stjr { "#", "0023" }, 45103739Stjr { "sh", "0023" }, 46103739Stjr { "$", "0024" }, 47103739Stjr { "Do", "0024" }, 48103739Stjr { "%", "0025" }, 49103739Stjr { "&", "0026" }, 50103739Stjr { "aq", "0027" }, 51103739Stjr { "(", "0028" }, 52103739Stjr { ")", "0029" }, 53103739Stjr { "*", "002A" }, 54103739Stjr { "+", "002B" }, 55103739Stjr { "pl", "002B" }, 56103739Stjr { ",", "002C" }, 57103739Stjr { ".", "002E" }, 58103739Stjr { "/", "002F" }, 59103739Stjr { "sl", "002F" }, 60103739Stjr { "0", "0030" }, 61103739Stjr { "1", "0031" }, 62103739Stjr { "2", "0032" }, 63103739Stjr { "3", "0033" }, 64103739Stjr { "4", "0034" }, 65103739Stjr { "5", "0035" }, 66103739Stjr { "6", "0036" }, 67180104Sdas { "7", "0037" }, 68103739Stjr { "8", "0038" }, 69103739Stjr { "9", "0039" }, 70122547Stjr { ":", "003A" }, 71124887Sdas { ";", "003B" }, 72113199Stjr { "<", "003C" }, 73124887Sdas { "=", "003D" }, 74113199Stjr { "eq", "003D" }, 75103739Stjr { ">", "003E" }, 76103739Stjr { "?", "003F" }, 77103739Stjr { "@", "0040" }, 78103739Stjr { "at", "0040" }, 79103739Stjr { "A", "0041" }, 80103739Stjr { "B", "0042" }, 81103739Stjr { "C", "0043" }, 82103739Stjr { "D", "0044" }, 83103739Stjr { "E", "0045" }, 84103739Stjr { "F", "0046" }, 85103739Stjr { "G", "0047" }, 86103739Stjr { "H", "0048" }, 87103739Stjr { "I", "0049" }, 88103739Stjr { "J", "004A" }, 89103739Stjr { "K", "004B" }, 90103739Stjr { "L", "004C" }, 91103739Stjr { "M", "004D" }, 92103739Stjr { "N", "004E" }, 93103739Stjr { "O", "004F" }, 94178287Sjhb { "P", "0050" }, 95178287Sjhb { "Q", "0051" }, 96103739Stjr { "R", "0052" }, 97103739Stjr { "S", "0053" }, 98103739Stjr { "T", "0054" }, 99103739Stjr { "U", "0055" }, 100103739Stjr { "V", "0056" }, 101103739Stjr { "W", "0057" }, 102103739Stjr { "X", "0058" }, 103103739Stjr { "Y", "0059" }, 104103739Stjr { "Z", "005A" }, 105103739Stjr//{ "[", "005B" }, 106103739Stjr { "lB", "005B" }, 107103739Stjr//{ "\\", "005C" }, 108103739Stjr { "rs", "005C" }, 109103739Stjr//{ "]", "005D" }, 110103739Stjr { "rB", "005D" }, 111103739Stjr { "a^", "005E" }, 112122547Stjr { "^", "005E" }, 113122547Stjr { "ha", "005E" }, 114122547Stjr { "_", "005F" }, 115122547Stjr { "ru", "005F" }, 116122547Stjr { "ul", "005F" }, 117122547Stjr//{ "\\`", "0060" }, 118128002Stjr { "ga", "0060" }, 119128002Stjr { "a", "0061" }, 120122547Stjr { "b", "0062" }, 121122547Stjr { "c", "0063" }, 122122547Stjr { "d", "0064" }, 123124174Snectar { "e", "0065" }, 124122547Stjr { "f", "0066" }, 125122547Stjr { "ff", "0066_0066" }, 126122547Stjr { "Fi", "0066_0066_0069" }, 127122547Stjr { "Fl", "0066_0066_006C" }, 128128002Stjr { "fi", "0066_0069" }, 129128002Stjr { "fl", "0066_006C" }, 130122547Stjr { "g", "0067" }, 131122547Stjr { "h", "0068" }, 132122547Stjr { "i", "0069" }, 133122547Stjr { "j", "006A" }, 134122547Stjr { "k", "006B" }, 135122547Stjr { "l", "006C" }, 136122547Stjr { "m", "006D" }, 137122547Stjr { "n", "006E" }, 138122547Stjr { "o", "006F" }, 139122547Stjr { "p", "0070" }, 140122547Stjr { "q", "0071" }, 141122547Stjr { "r", "0072" }, 142103739Stjr { "s", "0073" }, 143103739Stjr { "t", "0074" }, 144103739Stjr { "u", "0075" }, 145103739Stjr { "v", "0076" }, 146103739Stjr { "w", "0077" }, 147103739Stjr { "x", "0078" }, 148124887Sdas { "y", "0079" }, 149103739Stjr { "z", "007A" }, 150103739Stjr { "lC", "007B" }, 151103739Stjr { "{", "007B" }, 152103739Stjr { "ba", "007C" }, 153103739Stjr { "or", "007C" }, 154103739Stjr { "|", "007C" }, 155103739Stjr { "rC", "007D" }, 156103739Stjr { "}", "007D" }, 157103739Stjr { "a~", "007E" }, 158103739Stjr { "~", "007E" }, 159103739Stjr { "ti", "007E" }, 160103739Stjr { "r!", "00A1" }, 161103739Stjr { "ct", "00A2" }, 162103739Stjr { "Po", "00A3" }, 163103739Stjr { "Cs", "00A4" }, 164103739Stjr { "Ye", "00A5" }, 165103739Stjr { "bb", "00A6" }, 166103739Stjr { "sc", "00A7" }, 167103739Stjr { "ad", "00A8" }, 168103739Stjr { "co", "00A9" }, 169103739Stjr { "Of", "00AA" }, 170103739Stjr { "Fo", "00AB" }, 171103739Stjr { "no", "00AC" }, 172103739Stjr { "tno", "00AC" }, 173103739Stjr { "shc", "00AD" }, 174103739Stjr { "rg", "00AE" }, 175103739Stjr { "a-", "00AF" }, 176103739Stjr { "de", "00B0" }, 177103739Stjr { "+-", "00B1" }, 178103739Stjr { "t+-", "00B1" }, 179103739Stjr { "S2", "00B2" }, 180103739Stjr { "S3", "00B3" }, 181103739Stjr { "aa", "00B4" }, 182103739Stjr//{ "\\'", "00B4" }, 183103739Stjr { "mc", "00B5" }, 184103739Stjr { "ps", "00B6" }, 185103739Stjr { "pc", "00B7" }, 186103739Stjr { "ac", "00B8" }, 187103739Stjr { "S1", "00B9" }, 188103739Stjr { "Om", "00BA" }, 189103739Stjr { "Fc", "00BB" }, 190103739Stjr { "14", "00BC" }, 191103739Stjr { "12", "00BD" }, 192103739Stjr { "34", "00BE" }, 193103739Stjr { "r?", "00BF" }, 194103739Stjr { "`A", "00C0" }, 195103739Stjr { "'A", "00C1" }, 196103739Stjr { "^A", "00C2" }, 197103739Stjr { "~A", "00C3" }, 198103739Stjr { ":A", "00C4" }, 199103739Stjr { "oA", "00C5" }, 200103739Stjr { "AE", "00C6" }, 201103739Stjr { ",C", "00C7" }, 202103739Stjr { "`E", "00C8" }, 203103739Stjr { "'E", "00C9" }, 204103739Stjr { "^E", "00CA" }, 205103739Stjr { ":E", "00CB" }, 206103739Stjr { "`I", "00CC" }, 207103739Stjr { "'I", "00CD" }, 208103739Stjr { "^I", "00CE" }, 209103739Stjr { ":I", "00CF" }, 210103739Stjr { "-D", "00D0" }, 211103739Stjr { "~N", "00D1" }, 212103739Stjr { "`O", "00D2" }, 213103739Stjr { "'O", "00D3" }, 214103739Stjr { "^O", "00D4" }, 215103739Stjr { "~O", "00D5" }, 216103739Stjr { ":O", "00D6" }, 217103739Stjr { "mu", "00D7" }, 218103739Stjr { "tmu", "00D7" }, 219103739Stjr { "/O", "00D8" }, 220103739Stjr { "`U", "00D9" }, 221103739Stjr { "'U", "00DA" }, 222103739Stjr { "^U", "00DB" }, 223103739Stjr { ":U", "00DC" }, 224103739Stjr { "'Y", "00DD" }, 225113199Stjr { "TP", "00DE" }, 226124887Sdas { "ss", "00DF" }, 227103739Stjr { "`a", "00E0" }, 228103739Stjr { "'a", "00E1" }, 229103739Stjr { "^a", "00E2" }, 230103739Stjr { "~a", "00E3" }, 231103739Stjr { ":a", "00E4" }, 232103739Stjr { "oa", "00E5" }, 233103739Stjr { "ae", "00E6" }, 234103739Stjr { ",c", "00E7" }, 235103739Stjr { "`e", "00E8" }, 236103739Stjr { "'e", "00E9" }, 237103739Stjr { "^e", "00EA" }, 238103739Stjr { ":e", "00EB" }, 239103739Stjr { "`i", "00EC" }, 240103739Stjr { "'i", "00ED" }, 241103739Stjr { "^i", "00EE" }, 242103739Stjr { ":i", "00EF" }, 243103739Stjr { "Sd", "00F0" }, 244103739Stjr { "~n", "00F1" }, 245103739Stjr { "`o", "00F2" }, 246103739Stjr { "'o", "00F3" }, 247103739Stjr { "^o", "00F4" }, 248103739Stjr { "~o", "00F5" }, 249103739Stjr { ":o", "00F6" }, 250103739Stjr { "di", "00F7" }, 251103739Stjr { "tdi", "00F7" }, 252103739Stjr { "/o", "00F8" }, 253103739Stjr { "`u", "00F9" }, 254103739Stjr { "'u", "00FA" }, 255103739Stjr { "^u", "00FB" }, 256103739Stjr { ":u", "00FC" }, 257103739Stjr { "'y", "00FD" }, 258103739Stjr { "Tp", "00FE" }, 259103739Stjr { ":y", "00FF" }, 260103739Stjr { "'C", "0106" }, 261103739Stjr { "'c", "0107" }, 262103739Stjr { ".i", "0131" }, 263103739Stjr { "IJ", "0132" }, 264103739Stjr { "ij", "0133" }, 265103739Stjr { "/L", "0141" }, 266103739Stjr { "/l", "0142" }, 267103739Stjr { "OE", "0152" }, 268103739Stjr { "oe", "0153" }, 269103739Stjr { "vS", "0160" }, 270103739Stjr { "vs", "0161" }, 271103739Stjr { ":Y", "0178" }, 272103739Stjr { "vZ", "017D" }, 273103739Stjr { "vz", "017E" }, 274103739Stjr { "Fn", "0192" }, 275103739Stjr { "ah", "02C7" }, 276103739Stjr { "ab", "02D8" }, 277103739Stjr { "a.", "02D9" }, 278103739Stjr { "ao", "02DA" }, 279103739Stjr { "ho", "02DB" }, 280103739Stjr { "a\"", "02DD" }, 281103739Stjr { "*A", "0391" }, 282103739Stjr { "*B", "0392" }, 283103739Stjr { "*G", "0393" }, 284103739Stjr { "*D", "0394" }, 285103739Stjr { "*E", "0395" }, 286103739Stjr { "*Z", "0396" }, 287103739Stjr { "*Y", "0397" }, 288103739Stjr { "*H", "0398" }, 289103739Stjr { "*I", "0399" }, 290103739Stjr { "*K", "039A" }, 291103739Stjr { "*L", "039B" }, 292103739Stjr { "*M", "039C" }, 293103739Stjr { "*N", "039D" }, 294103739Stjr { "*C", "039E" }, 295103739Stjr { "*O", "039F" }, 296103739Stjr { "*P", "03A0" }, 297103739Stjr { "*R", "03A1" }, 298103739Stjr { "*S", "03A3" }, 299103739Stjr { "*T", "03A4" }, 300103739Stjr { "*U", "03A5" }, 301103739Stjr { "*F", "03A6" }, 302103739Stjr { "*X", "03A7" }, 303103739Stjr { "*Q", "03A8" }, 304128002Stjr { "*W", "03A9" }, 305128002Stjr { "*a", "03B1" }, 306103739Stjr { "*b", "03B2" }, 307103739Stjr { "*g", "03B3" }, 308103739Stjr { "*d", "03B4" }, 309103739Stjr { "*e", "03B5" }, 310113199Stjr { "*z", "03B6" }, 311113199Stjr { "*y", "03B7" }, 312113199Stjr { "*h", "03B8" }, 313103739Stjr { "*i", "03B9" }, 314103739Stjr { "*k", "03BA" }, 315103739Stjr { "*l", "03BB" }, 316103739Stjr { "*m", "03BC" }, 317103739Stjr { "*n", "03BD" }, 318103739Stjr { "*c", "03BE" }, 319103739Stjr { "*o", "03BF" }, 320103739Stjr { "*p", "03C0" }, 321103739Stjr { "*r", "03C1" }, 322103739Stjr { "ts", "03C2" }, 323103739Stjr { "*s", "03C3" }, 324128002Stjr { "*t", "03C4" }, 325103739Stjr { "*u", "03C5" }, 326128002Stjr { "*f", "03C6" }, 327103739Stjr { "*x", "03C7" }, 328103739Stjr { "*q", "03C8" }, 329103739Stjr { "*w", "03C9" }, 330103739Stjr { "+h", "03D1" }, 331103739Stjr { "+f", "03D5" }, 332103739Stjr { "+p", "03D6" }, 333103739Stjr { "+e", "03F5" }, 334103739Stjr { "-", "2010" }, 335103739Stjr { "hy", "2010" }, 336103739Stjr { "en", "2013" }, 337103739Stjr { "em", "2014" }, 338103739Stjr { "`", "2018" }, 339103739Stjr { "oq", "2018" }, 340103739Stjr { "'", "2019" }, 341103739Stjr { "cq", "2019" }, 342103739Stjr { "bq", "201A" }, 343103739Stjr { "lq", "201C" }, 344103739Stjr { "rq", "201D" }, 345103739Stjr { "Bq", "201E" }, 346103739Stjr { "dg", "2020" }, 347103739Stjr { "dd", "2021" }, 348103739Stjr { "bu", "2022" }, 349128002Stjr { "%0", "2030" }, 350103739Stjr { "fm", "2032" }, 351128002Stjr { "sd", "2033" }, 352103739Stjr { "fo", "2039" }, 353103739Stjr { "fc", "203A" }, 354103739Stjr { "rn", "203E" }, 355103739Stjr { "f/", "2044" }, 356103739Stjr { "eu", "20AC" }, 357103739Stjr { "Eu", "20AC" }, 358103739Stjr { "-h", "210F" }, 359103739Stjr { "hbar", "210F" }, 360103739Stjr { "Im", "2111" }, 361103739Stjr { "wp", "2118" }, 362103739Stjr { "Re", "211C" }, 363103739Stjr { "tm", "2122" }, 364103739Stjr { "Ah", "2135" }, 365103739Stjr { "18", "215B" }, 366103739Stjr { "38", "215C" }, 367103739Stjr { "58", "215D" }, 368103739Stjr { "78", "215E" }, 369103739Stjr { "<-", "2190" }, 370103739Stjr { "ua", "2191" }, 371103739Stjr { "->", "2192" }, 372103739Stjr { "da", "2193" }, 373103739Stjr { "<>", "2194" }, 374103739Stjr { "va", "2195" }, 375103739Stjr { "CR", "21B5" }, 376103739Stjr { "lA", "21D0" }, 377103739Stjr { "uA", "21D1" }, 378103739Stjr { "rA", "21D2" }, 379103739Stjr { "dA", "21D3" }, 380103739Stjr { "hA", "21D4" }, 381103739Stjr { "vA", "21D5" }, 382128821Sdas { "fa", "2200" }, 383113199Stjr { "pd", "2202" }, 384113199Stjr { "te", "2203" }, 385113199Stjr { "es", "2205" }, 386113199Stjr { "gr", "2207" }, 387113143Sdas { "mo", "2208" }, 388103739Stjr { "nm", "2209" }, 389103739Stjr { "st", "220B" }, 390113199Stjr { "product", "220F" }, 391103739Stjr { "coproduct", "2210" }, 392103739Stjr { "sum", "2211" }, 393103739Stjr//{ "\\-", "2212" }, 394103739Stjr { "mi", "2212" }, 395103739Stjr { "-+", "2213" }, 396128821Sdas { "**", "2217" }, 397103739Stjr { "sr", "221A" }, 398113142Sdas { "pt", "221D" }, 399113142Sdas { "if", "221E" }, 400113142Sdas { "/_", "2220" }, 401113142Sdas { "AN", "2227" }, 402113142Sdas { "OR", "2228" }, 403113142Sdas { "ca", "2229" }, 404113142Sdas { "cu", "222A" }, 405113142Sdas { "is", "222B" }, 406103739Stjr { "integral", "222B" }, 407103739Stjr { "tf", "2234" }, 408103739Stjr { "3d", "2234" }, 409103739Stjr { "ap", "223C" }, 410103739Stjr { "|=", "2243" }, 411103739Stjr { "=~", "2245" }, 412103739Stjr { "~~", "2248" }, 413103739Stjr { "~=", "2248" }, 414103739Stjr { "!=", "2260" }, 415113199Stjr { "==", "2261" }, 416103739Stjr { "ne", "2262" }, 417103739Stjr { "<=", "2264" }, 418103739Stjr { ">=", "2265" }, 419103739Stjr { ">>", "226A" }, 420113199Stjr { "<<", "226B" }, 421103739Stjr { "sb", "2282" }, 422103739Stjr { "sp", "2283" }, 423103739Stjr { "nb", "2284" }, 424128821Sdas { "nc", "2285" }, 425113199Stjr { "ib", "2286" }, 426113199Stjr { "ip", "2287" }, 427113199Stjr { "c+", "2295" }, 428113199Stjr { "c*", "2297" }, 429113199Stjr { "pp", "22A5" }, 430113199Stjr { "md", "22C5" }, 431113199Stjr { "lc", "2308" }, 432113199Stjr { "rc", "2309" }, 433113199Stjr { "lf", "230A" }, 434113199Stjr { "rf", "230B" }, 435113199Stjr { "parenlefttp", "239B" }, 436113199Stjr { "parenleftex", "239C" }, 437113199Stjr { "parenleftbt", "239D" }, 438113199Stjr { "parenrighttp", "239E" }, 439103739Stjr { "parenrightex", "239F" }, 440113199Stjr { "parenrightbt", "23A0" }, 441113199Stjr { "bracketlefttp", "23A1" }, 442113199Stjr { "bracketleftex", "23A2" }, 443113199Stjr { "bracketleftbt", "23A3" }, 444113199Stjr { "bracketrighttp", "23A4" }, 445103739Stjr { "bracketrightex", "23A5" }, 446113199Stjr { "bracketrightbt", "23A6" }, 447113199Stjr { "lt", "23A7" }, 448103739Stjr { "bracelefttp", "23A7" }, 449113199Stjr { "lk", "23A8" }, 450113199Stjr { "braceleftmid", "23A8" }, 451113199Stjr { "lb", "23A9" }, 452113199Stjr { "braceleftbt", "23A9" }, 453113199Stjr { "bv", "23AA" }, 454113199Stjr { "braceex", "23AA" }, 455103739Stjr { "braceleftex", "23AA" }, 456103739Stjr { "bracerightex", "23AA" }, 457103739Stjr { "rt", "23AB" }, 458103739Stjr { "bracerighttp", "23AB" }, 459103739Stjr { "rk", "23AC" }, 460103739Stjr { "bracerightmid", "23AC" }, 461103739Stjr { "rb", "23AD" }, 462103739Stjr { "bracerightbt", "23AD" }, 463124887Sdas { "an", "23AF" }, 464113142Sdas { "br", "2502" }, 465103739Stjr { "rk", "251D" }, 466103739Stjr { "lk", "2525" }, 467103739Stjr { "lt", "256D" }, 468103739Stjr { "rt", "256E" }, 469103739Stjr { "rb", "256F" }, 470103739Stjr { "lb", "2570" }, 471103739Stjr { "sq", "25A1" }, 472103739Stjr { "lz", "25CA" }, 473103739Stjr { "ci", "25CB" }, 474103739Stjr { "lh", "261C" }, 475103739Stjr { "rh", "261E" }, 476103739Stjr { "SP", "2660" }, 477103739Stjr { "CL", "2663" }, 478103739Stjr { "HE", "2665" }, 479103739Stjr { "DI", "2666" }, 480103739Stjr { "OK", "2713" }, 481103739Stjr { "la", "27E8" }, 482103739Stjr { "ra", "27E9" }, 483124887Sdas}; 484124887Sdas 485113199Stjr// global constructor 486103739Stjrstatic struct glyph_to_unicode_init { 487103739Stjr glyph_to_unicode_init(); 488103739Stjr} _glyph_to_unicode_init; 489103739Stjr 490103739Stjrglyph_to_unicode_init::glyph_to_unicode_init() { 491113199Stjr for (unsigned int i = 0; 492122547Stjr i < sizeof(glyph_to_unicode_list)/sizeof(glyph_to_unicode_list[0]); 493103739Stjr i++) { 494103739Stjr glyph_to_unicode *gtu = new glyph_to_unicode[1]; 495103739Stjr gtu->value = (char *)glyph_to_unicode_list[i].value; 496103739Stjr glyph_to_unicode_table.define(glyph_to_unicode_list[i].key, gtu); 497103739Stjr } 498103739Stjr} 499103739Stjr 500103739Stjrconst char *glyph_name_to_unicode(const char *s) 501103739Stjr{ 502103739Stjr glyph_to_unicode *result = glyph_to_unicode_table.lookup(s); 503113199Stjr return result ? result->value : 0; 504113199Stjr} 505113199Stjr