Remove no longer needed catman periodic via 'make upgrade'.
[dragonfly.git] / contrib / groff / src / libs / libgroff / uniglyph.cpp
1 // -*- C++ -*-
2 /* Copyright (C) 2002, 2003, 2004, 2006, 2009
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
10 Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
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
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/>. */
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" },
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" },
232   // In groff, U+00AD is an input character only; it is not mapped to
233   // a glyph but to `\%'.
234   { "00AE", "rg" },
235   { "00AF", "a-" },
236   { "00B0", "de" },
237   { "00B1", "+-" },
238 //{ "00B1", "t+-" },
239   { "00B2", "S2" },
240   { "00B3", "S3" },
241   { "00B4", "aa" },
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
488 unicode_to_glyph_init::unicode_to_glyph_init()
489 {
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 }