1151497Sru// -*- C++ -*-
2151497Sru/* Copyright (C) 2002, 2003, 2004
3151497Sru   Free Software Foundation, Inc.
4151497Sru     Written by Werner Lemberg <wl@gnu.org>
5151497Sru
6151497SruThis file is part of groff.
7151497Sru
8151497Srugroff is free software; you can redistribute it and/or modify it under
9151497Sruthe terms of the GNU General Public License as published by the Free
10151497SruSoftware Foundation; either version 2, or (at your option) any later
11151497Sruversion.
12151497Sru
13151497Srugroff is distributed in the hope that it will be useful, but WITHOUT ANY
14151497SruWARRANTY; without even the implied warranty of MERCHANTABILITY or
15151497SruFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16151497Srufor more details.
17151497Sru
18151497SruYou should have received a copy of the GNU General Public License along
19151497Sruwith groff; see the file COPYING.  If not, write to the Free Software
20151497SruFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
21151497Sru
22151497Sru#include "lib.h"
23151497Sru#include "stringclass.h"
24151497Sru#include "ptable.h"
25151497Sru
26151497Sru#include "unicode.h"
27151497Sru
28151497Srustruct unicode_to_glyph {
29151497Sru  char *value;
30151497Sru};
31151497Sru
32151497Srudeclare_ptable(unicode_to_glyph)
33151497Sruimplement_ptable(unicode_to_glyph)
34151497Sru
35151497SruPTABLE(unicode_to_glyph) unicode_to_glyph_table;
36151497Sru
37151497Srustruct S {
38151497Sru  const char *key;
39151497Sru  const char *value;
40151497Sru} unicode_to_glyph_list[] = {
41151497Sru  { "0021", "!" },
42151497Sru//{ "0022", "\"" },
43151497Sru  { "0022", "dq" },
44151497Sru//{ "0023", "#" },
45151497Sru  { "0023", "sh" },
46151497Sru//{ "0024", "$" },
47151497Sru  { "0024", "Do" },
48151497Sru  { "0025", "%" },
49151497Sru  { "0026", "&" },
50151497Sru  { "0027", "aq" },
51151497Sru  { "0028", "(" },
52151497Sru  { "0029", ")" },
53151497Sru  { "002A", "*" },
54151497Sru//{ "002B", "+" },
55151497Sru  { "002B", "pl" },
56151497Sru  { "002C", "," },
57151497Sru  { "002E", "." },
58151497Sru//{ "002F", "/" },
59151497Sru  { "002F", "sl" },
60151497Sru  { "0030", "0" },
61151497Sru  { "0031", "1" },
62151497Sru  { "0032", "2" },
63151497Sru  { "0033", "3" },
64151497Sru  { "0034", "4" },
65151497Sru  { "0035", "5" },
66151497Sru  { "0036", "6" },
67151497Sru  { "0037", "7" },
68151497Sru  { "0038", "8" },
69151497Sru  { "0039", "9" },
70151497Sru  { "003A", ":" },
71151497Sru  { "003B", ";" },
72151497Sru  { "003C", "<" },
73151497Sru//{ "003D", "=" },
74151497Sru  { "003D", "eq" },
75151497Sru  { "003D_0338", "!=" },
76151497Sru  { "003E", ">" },
77151497Sru  { "003F", "?" },
78151497Sru//{ "0040", "@" },
79151497Sru  { "0040", "at" },
80151497Sru  { "0041", "A" },
81151497Sru  { "0041_0300", "`A" },
82151497Sru  { "0041_0301", "'A" },
83151497Sru  { "0041_0302", "^A" },
84151497Sru  { "0041_0303", "~A" },
85151497Sru  { "0041_0308", ":A" },
86151497Sru  { "0041_030A", "oA" },
87151497Sru  { "0042", "B" },
88151497Sru  { "0043", "C" },
89151497Sru  { "0043_0301", "'C" },
90151497Sru  { "0043_0327", ",C" },
91151497Sru  { "0044", "D" },
92151497Sru  { "0045", "E" },
93151497Sru  { "0045_0300", "`E" },
94151497Sru  { "0045_0301", "'E" },
95151497Sru  { "0045_0302", "^E" },
96151497Sru  { "0045_0308", ":E" },
97151497Sru  { "0046", "F" },
98151497Sru  { "0047", "G" },
99151497Sru  { "0048", "H" },
100151497Sru  { "0049", "I" },
101151497Sru  { "0049_0300", "`I" },
102151497Sru  { "0049_0301", "'I" },
103151497Sru  { "0049_0302", "^I" },
104151497Sru  { "0049_0308", ":I" },
105151497Sru  { "004A", "J" },
106151497Sru  { "004B", "K" },
107151497Sru  { "004C", "L" },
108151497Sru  { "004D", "M" },
109151497Sru  { "004E", "N" },
110151497Sru  { "004E_0303", "~N" },
111151497Sru  { "004F", "O" },
112151497Sru  { "004F_0300", "`O" },
113151497Sru  { "004F_0301", "'O" },
114151497Sru  { "004F_0302", "^O" },
115151497Sru  { "004F_0303", "~O" },
116151497Sru  { "004F_0308", ":O" },
117151497Sru  { "0050", "P" },
118151497Sru  { "0051", "Q" },
119151497Sru  { "0052", "R" },
120151497Sru  { "0053", "S" },
121151497Sru  { "0053_030C", "vS" },
122151497Sru  { "0054", "T" },
123151497Sru  { "0055", "U" },
124151497Sru  { "0055_0300", "`U" },
125151497Sru  { "0055_0301", "'U" },
126151497Sru  { "0055_0302", "^U" },
127151497Sru  { "0055_0308", ":U" },
128151497Sru  { "0056", "V" },
129151497Sru  { "0057", "W" },
130151497Sru  { "0058", "X" },
131151497Sru  { "0059", "Y" },
132151497Sru  { "0059_0301", "'Y" },
133151497Sru  { "0059_0308", ":Y" },
134151497Sru  { "005A", "Z" },
135151497Sru  { "005A_030C", "vZ" },
136151497Sru  { "005B", "lB" },
137151497Sru//{ "005B", "[" },
138151497Sru  { "005C", "rs" },
139151497Sru//{ "005C", "\\" },
140151497Sru  { "005D", "rB" },
141151497Sru//{ "005D", "]" },
142151497Sru//{ "005E", "^" },
143151497Sru//{ "005E", "a^" },
144151497Sru  { "005E", "ha" },
145151497Sru//{ "005F", "_" },
146151497Sru//{ "005F", "ru" },
147151497Sru  { "005F", "ul" },
148151497Sru  { "0060", "ga" },
149151497Sru//{ "0060", "\\`" },
150151497Sru  { "0061", "a" },
151151497Sru  { "0061_0300", "`a" },
152151497Sru  { "0061_0301", "'a" },
153151497Sru  { "0061_0302", "^a" },
154151497Sru  { "0061_0303", "~a" },
155151497Sru  { "0061_0308", ":a" },
156151497Sru  { "0061_030A", "oa" },
157151497Sru  { "0062", "b" },
158151497Sru  { "0063", "c" },
159151497Sru  { "0063_0301", "'c" },
160151497Sru  { "0063_0327", ",c" },
161151497Sru  { "0064", "d" },
162151497Sru  { "0065", "e" },
163151497Sru  { "0065_0300", "`e" },
164151497Sru  { "0065_0301", "'e" },
165151497Sru  { "0065_0302", "^e" },
166151497Sru  { "0065_0308", ":e" },
167151497Sru  { "0066", "f" },
168151497Sru  { "0066_0066", "ff" },
169151497Sru  { "0066_0066_0069", "Fi" },
170151497Sru  { "0066_0066_006C", "Fl" },
171151497Sru  { "0066_0069", "fi" },
172151497Sru  { "0066_006C", "fl" },
173151497Sru  { "0067", "g" },
174151497Sru  { "0068", "h" },
175151497Sru  { "0069", "i" },
176151497Sru  { "0069_0300", "`i" },
177151497Sru  { "0069_0301", "'i" },
178151497Sru  { "0069_0302", "^i" },
179151497Sru  { "0069_0308", ":i" },
180151497Sru  { "006A", "j" },
181151497Sru  { "006B", "k" },
182151497Sru  { "006C", "l" },
183151497Sru  { "006D", "m" },
184151497Sru  { "006E", "n" },
185151497Sru  { "006E_0303", "~n" },
186151497Sru  { "006F", "o" },
187151497Sru  { "006F_0300", "`o" },
188151497Sru  { "006F_0301", "'o" },
189151497Sru  { "006F_0302", "^o" },
190151497Sru  { "006F_0303", "~o" },
191151497Sru  { "006F_0308", ":o" },
192151497Sru  { "0070", "p" },
193151497Sru  { "0071", "q" },
194151497Sru  { "0072", "r" },
195151497Sru  { "0073", "s" },
196151497Sru  { "0073_030C", "vs" },
197151497Sru  { "0074", "t" },
198151497Sru  { "0075", "u" },
199151497Sru  { "0075_0300", "`u" },
200151497Sru  { "0075_0301", "'u" },
201151497Sru  { "0075_0302", "^u" },
202151497Sru  { "0075_0308", ":u" },
203151497Sru  { "0076", "v" },
204151497Sru  { "0077", "w" },
205151497Sru  { "0078", "x" },
206151497Sru  { "0079", "y" },
207151497Sru  { "0079_0301", "'y" },
208151497Sru  { "0079_0308", ":y" },
209151497Sru  { "007A", "z" },
210151497Sru  { "007A_030C", "vz" },
211151497Sru  { "007B", "lC" },
212151497Sru//{ "007B", "{" },
213151497Sru  { "007C", "ba" },
214151497Sru//{ "007C", "or" },
215151497Sru//{ "007C", "|" },
216151497Sru  { "007D", "rC" },
217151497Sru//{ "007D", "}" },
218151497Sru//{ "007E", "a~" },
219151497Sru  { "007E", "ti" },
220151497Sru//{ "007E", "~" },
221151497Sru  { "00A1", "r!" },
222151497Sru  { "00A2", "ct" },
223151497Sru  { "00A3", "Po" },
224151497Sru  { "00A4", "Cs" },
225151497Sru  { "00A5", "Ye" },
226151497Sru  { "00A6", "bb" },
227151497Sru  { "00A7", "sc" },
228151497Sru  { "00A8", "ad" },
229151497Sru  { "00A9", "co" },
230151497Sru  { "00AA", "Of" },
231151497Sru  { "00AB", "Fo" },
232151497Sru  { "00AC", "no" },
233151497Sru//{ "00AC", "tno" },
234151497Sru  { "00AD", "shc" },
235151497Sru  { "00AE", "rg" },
236151497Sru  { "00AF", "a-" },
237151497Sru  { "00B0", "de" },
238151497Sru  { "00B1", "+-" },
239151497Sru//{ "00B1", "t+-" },
240151497Sru  { "00B2", "S2" },
241151497Sru  { "00B3", "S3" },
242151497Sru  { "00B4", "aa" },
243151497Sru//{ "00B4", "\\'" },
244151497Sru  { "00B5", "mc" },
245151497Sru  { "00B6", "ps" },
246151497Sru  { "00B7", "pc" },
247151497Sru  { "00B8", "ac" },
248151497Sru  { "00B9", "S1" },
249151497Sru  { "00BA", "Om" },
250151497Sru  { "00BB", "Fc" },
251151497Sru  { "00BC", "14" },
252151497Sru  { "00BD", "12" },
253151497Sru  { "00BE", "34" },
254151497Sru  { "00BF", "r?" },
255151497Sru  { "00C6", "AE" },
256151497Sru  { "00D0", "-D" },
257151497Sru  { "00D7", "mu" },
258151497Sru//{ "00D7", "tmu" },
259151497Sru  { "00D8", "/O" },
260151497Sru  { "00DE", "TP" },
261151497Sru  { "00DF", "ss" },
262151497Sru  { "00E6", "ae" },
263151497Sru  { "00F0", "Sd" },
264151497Sru  { "00F7", "di" },
265151497Sru//{ "00F7", "tdi" },
266151497Sru  { "00F8", "/o" },
267151497Sru  { "00FE", "Tp" },
268151497Sru  { "0131", ".i" },
269151497Sru  { "0132", "IJ" },
270151497Sru  { "0133", "ij" },
271151497Sru  { "0141", "/L" },
272151497Sru  { "0142", "/l" },
273151497Sru  { "0152", "OE" },
274151497Sru  { "0153", "oe" },
275151497Sru  { "0192", "Fn" },
276151497Sru  { "02C7", "ah" },
277151497Sru  { "02D8", "ab" },
278151497Sru  { "02D9", "a." },
279151497Sru  { "02DA", "ao" },
280151497Sru  { "02DB", "ho" },
281151497Sru  { "02DD", "a\"" },
282151497Sru  { "0391", "*A" },
283151497Sru  { "0392", "*B" },
284151497Sru  { "0393", "*G" },
285151497Sru  { "0394", "*D" },
286151497Sru  { "0395", "*E" },
287151497Sru  { "0396", "*Z" },
288151497Sru  { "0397", "*Y" },
289151497Sru  { "0398", "*H" },
290151497Sru  { "0399", "*I" },
291151497Sru  { "039A", "*K" },
292151497Sru  { "039B", "*L" },
293151497Sru  { "039C", "*M" },
294151497Sru  { "039D", "*N" },
295151497Sru  { "039E", "*C" },
296151497Sru  { "039F", "*O" },
297151497Sru  { "03A0", "*P" },
298151497Sru  { "03A1", "*R" },
299151497Sru  { "03A3", "*S" },
300151497Sru  { "03A4", "*T" },
301151497Sru  { "03A5", "*U" },
302151497Sru  { "03A6", "*F" },
303151497Sru  { "03A7", "*X" },
304151497Sru  { "03A8", "*Q" },
305151497Sru  { "03A9", "*W" },
306151497Sru  { "03B1", "*a" },
307151497Sru  { "03B2", "*b" },
308151497Sru  { "03B3", "*g" },
309151497Sru  { "03B4", "*d" },
310151497Sru  { "03B5", "*e" },
311151497Sru  { "03B6", "*z" },
312151497Sru  { "03B7", "*y" },
313151497Sru  { "03B8", "*h" },
314151497Sru  { "03B9", "*i" },
315151497Sru  { "03BA", "*k" },
316151497Sru  { "03BB", "*l" },
317151497Sru  { "03BC", "*m" },
318151497Sru  { "03BD", "*n" },
319151497Sru  { "03BE", "*c" },
320151497Sru  { "03BF", "*o" },
321151497Sru  { "03C0", "*p" },
322151497Sru  { "03C1", "*r" },
323151497Sru  { "03C2", "ts" },
324151497Sru  { "03C3", "*s" },
325151497Sru  { "03C4", "*t" },
326151497Sru  { "03C5", "*u" },
327151497Sru  { "03C6", "*f" },
328151497Sru  { "03C7", "*x" },
329151497Sru  { "03C8", "*q" },
330151497Sru  { "03C9", "*w" },
331151497Sru  { "03D1", "+h" },
332151497Sru  { "03D5", "+f" },
333151497Sru  { "03D6", "+p" },
334151497Sru  { "03F5", "+e" },
335151497Sru//{ "2010", "-" },
336151497Sru  { "2010", "hy" },
337151497Sru  { "2013", "en" },
338151497Sru  { "2014", "em" },
339151497Sru//{ "2018", "`" },
340151497Sru  { "2018", "oq" },
341151497Sru//{ "2019", "'" },
342151497Sru  { "2019", "cq" },
343151497Sru  { "201A", "bq" },
344151497Sru  { "201C", "lq" },
345151497Sru  { "201D", "rq" },
346151497Sru  { "201E", "Bq" },
347151497Sru  { "2020", "dg" },
348151497Sru  { "2021", "dd" },
349151497Sru  { "2022", "bu" },
350151497Sru  { "2030", "%0" },
351151497Sru  { "2032", "fm" },
352151497Sru  { "2033", "sd" },
353151497Sru  { "2039", "fo" },
354151497Sru  { "203A", "fc" },
355151497Sru  { "203E", "rn" },
356151497Sru  { "2044", "f/" },
357151497Sru  { "20AC", "Eu" },
358151497Sru//{ "20AC", "eu" },
359151497Sru  { "210F", "-h" },
360151497Sru//{ "210F", "hbar" },
361151497Sru  { "2111", "Im" },
362151497Sru  { "2118", "wp" },
363151497Sru  { "211C", "Re" },
364151497Sru  { "2122", "tm" },
365151497Sru  { "2135", "Ah" },
366151497Sru  { "215B", "18" },
367151497Sru  { "215C", "38" },
368151497Sru  { "215D", "58" },
369151497Sru  { "215E", "78" },
370151497Sru  { "2190", "<-" },
371151497Sru  { "2191", "ua" },
372151497Sru  { "2192", "->" },
373151497Sru  { "2193", "da" },
374151497Sru  { "2194", "<>" },
375151497Sru  { "2195", "va" },
376151497Sru  { "21B5", "CR" },
377151497Sru  { "21D0", "lA" },
378151497Sru  { "21D1", "uA" },
379151497Sru  { "21D2", "rA" },
380151497Sru  { "21D3", "dA" },
381151497Sru  { "21D4", "hA" },
382151497Sru  { "21D5", "vA" },
383151497Sru  { "2200", "fa" },
384151497Sru  { "2202", "pd" },
385151497Sru  { "2203", "te" },
386151497Sru  { "2205", "es" },
387151497Sru  { "2207", "gr" },
388151497Sru  { "2208", "mo" },
389151497Sru  { "2208_0338", "nm" },
390151497Sru  { "220B", "st" },
391151497Sru  { "220F", "product" },
392151497Sru  { "2210", "coproduct" },
393151497Sru  { "2211", "sum" },
394151497Sru  { "2212", "mi" },
395151497Sru//{ "2212", "\\-" },
396151497Sru  { "2213", "-+" },
397151497Sru  { "2217", "**" },
398151497Sru  { "221A", "sr" },
399151497Sru  { "221D", "pt" },
400151497Sru  { "221E", "if" },
401151497Sru  { "2220", "/_" },
402151497Sru  { "2227", "AN" },
403151497Sru  { "2228", "OR" },
404151497Sru  { "2229", "ca" },
405151497Sru  { "222A", "cu" },
406151497Sru  { "222B", "is" },
407151497Sru//{ "222B", "integral" },
408151497Sru//{ "2234", "3d" },
409151497Sru  { "2234", "tf" },
410151497Sru  { "223C", "ap" },
411151497Sru  { "2243", "|=" },
412151497Sru  { "2245", "=~" },
413151497Sru//{ "2248", "~=" },
414151497Sru  { "2248", "~~" },
415151497Sru  { "2261", "==" },
416151497Sru  { "2261_0338", "ne" },
417151497Sru  { "2264", "<=" },
418151497Sru  { "2265", ">=" },
419151497Sru  { "226A", ">>" },
420151497Sru  { "226B", "<<" },
421151497Sru  { "2282", "sb" },
422151497Sru  { "2282_0338", "nb" },
423151497Sru  { "2283", "sp" },
424151497Sru  { "2283_0338", "nc" },
425151497Sru  { "2286", "ib" },
426151497Sru  { "2287", "ip" },
427151497Sru  { "2295", "c+" },
428151497Sru  { "2297", "c*" },
429151497Sru  { "22A5", "pp" },
430151497Sru  { "22C5", "md" },
431151497Sru  { "2308", "lc" },
432151497Sru  { "2309", "rc" },
433151497Sru  { "230A", "lf" },
434151497Sru  { "230B", "rf" },
435151497Sru  { "239B", "parenlefttp" },
436151497Sru  { "239C", "parenleftex" },
437151497Sru  { "239D", "parenleftbt" },
438151497Sru  { "239E", "parenrighttp" },
439151497Sru  { "239F", "parenrightex" },
440151497Sru  { "23A0", "parenrightbt" },
441151497Sru//{ "23A1", "bracketlefttp" },
442151497Sru  { "23A2", "bracketleftex" },
443151497Sru//{ "23A3", "bracketleftbt" },
444151497Sru//{ "23A4", "bracketrighttp" },
445151497Sru  { "23A5", "bracketrightex" },
446151497Sru//{ "23A6", "bracketrightbt" },
447151497Sru  { "23A7", "lt" },
448151497Sru//{ "23A7", "bracelefttp" },
449151497Sru  { "23A8", "lk" },
450151497Sru//{ "23A8", "braceleftmid" },
451151497Sru  { "23A9", "lb" },
452151497Sru//{ "23A9", "braceleftbt" },
453151497Sru  { "23AA", "bv" },
454151497Sru//{ "23AA", "braceex" },
455151497Sru//{ "23AA", "braceleftex" },
456151497Sru//{ "23AA", "bracerightex" },
457151497Sru  { "23AB", "rt" },
458151497Sru//{ "23AB", "bracerighttp" },
459151497Sru  { "23AC", "rk" },
460151497Sru//{ "23AC", "bracerightmid" },
461151497Sru  { "23AD", "rb" },
462151497Sru//{ "23AD", "bracerightbt" },
463151497Sru  { "23AF", "an" },
464151497Sru  { "2502", "br" },
465151497Sru  { "251D", "rk" },
466151497Sru  { "2525", "lk" },
467151497Sru  { "256D", "lt" },
468151497Sru  { "256E", "rt" },
469151497Sru  { "256F", "rb" },
470151497Sru  { "2570", "lb" },
471151497Sru  { "25A1", "sq" },
472151497Sru  { "25CA", "lz" },
473151497Sru  { "25CB", "ci" },
474151497Sru  { "261C", "lh" },
475151497Sru  { "261E", "rh" },
476151497Sru  { "2660", "SP" },
477151497Sru  { "2663", "CL" },
478151497Sru  { "2665", "HE" },
479151497Sru  { "2666", "DI" },
480151497Sru  { "2713", "OK" },
481151497Sru  { "27E8", "la" },
482151497Sru  { "27E9", "ra" },
483151497Sru};
484151497Sru
485151497Sru// global constructor
486151497Srustatic struct unicode_to_glyph_init {
487151497Sru  unicode_to_glyph_init();
488151497Sru} _unicode_to_glyph_init;
489151497Sru
490151497Sruunicode_to_glyph_init::unicode_to_glyph_init() {
491151497Sru  for (unsigned int i = 0;
492151497Sru       i < sizeof(unicode_to_glyph_list)/sizeof(unicode_to_glyph_list[0]);
493151497Sru       i++) {
494151497Sru    unicode_to_glyph *utg = new unicode_to_glyph[1];
495151497Sru    utg->value = (char *)unicode_to_glyph_list[i].value;
496151497Sru    unicode_to_glyph_table.define(unicode_to_glyph_list[i].key, utg);
497151497Sru  }
498151497Sru}
499151497Sru
500151497Sruconst char *unicode_to_glyph_name(const char *s)
501151497Sru{
502151497Sru  unicode_to_glyph *result = unicode_to_glyph_table.lookup(s);
503151497Sru  return result ? result->value : 0;
504151497Sru}
505