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