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