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