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