glyphuni.cpp revision 302408
1103739Stjr// -*- C++ -*-
2103739Stjr/* Copyright (C) 2002, 2003, 2004
3103739Stjr   Free Software Foundation, Inc.
4103739Stjr     Written by Werner Lemberg <wl@gnu.org>
5103739Stjr
6103739StjrThis file is part of groff.
7103739Stjr
8103739Stjrgroff is free software; you can redistribute it and/or modify it under
9103739Stjrthe terms of the GNU General Public License as published by the Free
10103739StjrSoftware Foundation; either version 2, or (at your option) any later
11103739Stjrversion.
12103739Stjr
13103739Stjrgroff is distributed in the hope that it will be useful, but WITHOUT ANY
14103739StjrWARRANTY; without even the implied warranty of MERCHANTABILITY or
15103739StjrFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16103739Stjrfor more details.
17103739Stjr
18103739StjrYou should have received a copy of the GNU General Public License along
19103739Stjrwith groff; see the file COPYING.  If not, write to the Free Software
20103739StjrFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
21103739Stjr
22103739Stjr#include "lib.h"
23103739Stjr#include "stringclass.h"
24103739Stjr#include "ptable.h"
25103739Stjr
26103739Stjr#include "unicode.h"
27103739Stjr
28103739Stjrstruct glyph_to_unicode {
29103739Stjr  char *value;
30103739Stjr};
31103739Stjr
32103739Stjrdeclare_ptable(glyph_to_unicode)
33103739Stjrimplement_ptable(glyph_to_unicode)
34103739Stjr
35103739StjrPTABLE(glyph_to_unicode) glyph_to_unicode_table;
36103739Stjr
37103739Stjrstruct S {
38128843Sobrien  const char *key;
39103739Stjr  const char *value;
40103739Stjr} glyph_to_unicode_list[] = {
41103739Stjr  { "!", "0021" },
42103739Stjr  { "\"", "0022" },
43103739Stjr  { "dq", "0022" },
44103739Stjr  { "#", "0023" },
45103739Stjr  { "sh", "0023" },
46103739Stjr  { "$", "0024" },
47103739Stjr  { "Do", "0024" },
48103739Stjr  { "%", "0025" },
49103739Stjr  { "&", "0026" },
50103739Stjr  { "aq", "0027" },
51103739Stjr  { "(", "0028" },
52103739Stjr  { ")", "0029" },
53103739Stjr  { "*", "002A" },
54103739Stjr  { "+", "002B" },
55103739Stjr  { "pl", "002B" },
56103739Stjr  { ",", "002C" },
57103739Stjr  { ".", "002E" },
58103739Stjr  { "/", "002F" },
59103739Stjr  { "sl", "002F" },
60103739Stjr  { "0", "0030" },
61103739Stjr  { "1", "0031" },
62103739Stjr  { "2", "0032" },
63103739Stjr  { "3", "0033" },
64103739Stjr  { "4", "0034" },
65103739Stjr  { "5", "0035" },
66103739Stjr  { "6", "0036" },
67180104Sdas  { "7", "0037" },
68103739Stjr  { "8", "0038" },
69103739Stjr  { "9", "0039" },
70122547Stjr  { ":", "003A" },
71124887Sdas  { ";", "003B" },
72113199Stjr  { "<", "003C" },
73124887Sdas  { "=", "003D" },
74113199Stjr  { "eq", "003D" },
75103739Stjr  { ">", "003E" },
76103739Stjr  { "?", "003F" },
77103739Stjr  { "@", "0040" },
78103739Stjr  { "at", "0040" },
79103739Stjr  { "A", "0041" },
80103739Stjr  { "B", "0042" },
81103739Stjr  { "C", "0043" },
82103739Stjr  { "D", "0044" },
83103739Stjr  { "E", "0045" },
84103739Stjr  { "F", "0046" },
85103739Stjr  { "G", "0047" },
86103739Stjr  { "H", "0048" },
87103739Stjr  { "I", "0049" },
88103739Stjr  { "J", "004A" },
89103739Stjr  { "K", "004B" },
90103739Stjr  { "L", "004C" },
91103739Stjr  { "M", "004D" },
92103739Stjr  { "N", "004E" },
93103739Stjr  { "O", "004F" },
94178287Sjhb  { "P", "0050" },
95178287Sjhb  { "Q", "0051" },
96103739Stjr  { "R", "0052" },
97103739Stjr  { "S", "0053" },
98103739Stjr  { "T", "0054" },
99103739Stjr  { "U", "0055" },
100103739Stjr  { "V", "0056" },
101103739Stjr  { "W", "0057" },
102103739Stjr  { "X", "0058" },
103103739Stjr  { "Y", "0059" },
104103739Stjr  { "Z", "005A" },
105103739Stjr//{ "[", "005B" },
106103739Stjr  { "lB", "005B" },
107103739Stjr//{ "\\", "005C" },
108103739Stjr  { "rs", "005C" },
109103739Stjr//{ "]", "005D" },
110103739Stjr  { "rB", "005D" },
111103739Stjr  { "a^", "005E" },
112122547Stjr  { "^", "005E" },
113122547Stjr  { "ha", "005E" },
114122547Stjr  { "_", "005F" },
115122547Stjr  { "ru", "005F" },
116122547Stjr  { "ul", "005F" },
117122547Stjr//{ "\\`", "0060" },
118128002Stjr  { "ga", "0060" },
119128002Stjr  { "a", "0061" },
120122547Stjr  { "b", "0062" },
121122547Stjr  { "c", "0063" },
122122547Stjr  { "d", "0064" },
123124174Snectar  { "e", "0065" },
124122547Stjr  { "f", "0066" },
125122547Stjr  { "ff", "0066_0066" },
126122547Stjr  { "Fi", "0066_0066_0069" },
127122547Stjr  { "Fl", "0066_0066_006C" },
128128002Stjr  { "fi", "0066_0069" },
129128002Stjr  { "fl", "0066_006C" },
130122547Stjr  { "g", "0067" },
131122547Stjr  { "h", "0068" },
132122547Stjr  { "i", "0069" },
133122547Stjr  { "j", "006A" },
134122547Stjr  { "k", "006B" },
135122547Stjr  { "l", "006C" },
136122547Stjr  { "m", "006D" },
137122547Stjr  { "n", "006E" },
138122547Stjr  { "o", "006F" },
139122547Stjr  { "p", "0070" },
140122547Stjr  { "q", "0071" },
141122547Stjr  { "r", "0072" },
142103739Stjr  { "s", "0073" },
143103739Stjr  { "t", "0074" },
144103739Stjr  { "u", "0075" },
145103739Stjr  { "v", "0076" },
146103739Stjr  { "w", "0077" },
147103739Stjr  { "x", "0078" },
148124887Sdas  { "y", "0079" },
149103739Stjr  { "z", "007A" },
150103739Stjr  { "lC", "007B" },
151103739Stjr  { "{", "007B" },
152103739Stjr  { "ba", "007C" },
153103739Stjr  { "or", "007C" },
154103739Stjr  { "|", "007C" },
155103739Stjr  { "rC", "007D" },
156103739Stjr  { "}", "007D" },
157103739Stjr  { "a~", "007E" },
158103739Stjr  { "~", "007E" },
159103739Stjr  { "ti", "007E" },
160103739Stjr  { "r!", "00A1" },
161103739Stjr  { "ct", "00A2" },
162103739Stjr  { "Po", "00A3" },
163103739Stjr  { "Cs", "00A4" },
164103739Stjr  { "Ye", "00A5" },
165103739Stjr  { "bb", "00A6" },
166103739Stjr  { "sc", "00A7" },
167103739Stjr  { "ad", "00A8" },
168103739Stjr  { "co", "00A9" },
169103739Stjr  { "Of", "00AA" },
170103739Stjr  { "Fo", "00AB" },
171103739Stjr  { "no", "00AC" },
172103739Stjr  { "tno", "00AC" },
173103739Stjr  { "shc", "00AD" },
174103739Stjr  { "rg", "00AE" },
175103739Stjr  { "a-", "00AF" },
176103739Stjr  { "de", "00B0" },
177103739Stjr  { "+-", "00B1" },
178103739Stjr  { "t+-", "00B1" },
179103739Stjr  { "S2", "00B2" },
180103739Stjr  { "S3", "00B3" },
181103739Stjr  { "aa", "00B4" },
182103739Stjr//{ "\\'", "00B4" },
183103739Stjr  { "mc", "00B5" },
184103739Stjr  { "ps", "00B6" },
185103739Stjr  { "pc", "00B7" },
186103739Stjr  { "ac", "00B8" },
187103739Stjr  { "S1", "00B9" },
188103739Stjr  { "Om", "00BA" },
189103739Stjr  { "Fc", "00BB" },
190103739Stjr  { "14", "00BC" },
191103739Stjr  { "12", "00BD" },
192103739Stjr  { "34", "00BE" },
193103739Stjr  { "r?", "00BF" },
194103739Stjr  { "`A", "00C0" },
195103739Stjr  { "'A", "00C1" },
196103739Stjr  { "^A", "00C2" },
197103739Stjr  { "~A", "00C3" },
198103739Stjr  { ":A", "00C4" },
199103739Stjr  { "oA", "00C5" },
200103739Stjr  { "AE", "00C6" },
201103739Stjr  { ",C", "00C7" },
202103739Stjr  { "`E", "00C8" },
203103739Stjr  { "'E", "00C9" },
204103739Stjr  { "^E", "00CA" },
205103739Stjr  { ":E", "00CB" },
206103739Stjr  { "`I", "00CC" },
207103739Stjr  { "'I", "00CD" },
208103739Stjr  { "^I", "00CE" },
209103739Stjr  { ":I", "00CF" },
210103739Stjr  { "-D", "00D0" },
211103739Stjr  { "~N", "00D1" },
212103739Stjr  { "`O", "00D2" },
213103739Stjr  { "'O", "00D3" },
214103739Stjr  { "^O", "00D4" },
215103739Stjr  { "~O", "00D5" },
216103739Stjr  { ":O", "00D6" },
217103739Stjr  { "mu", "00D7" },
218103739Stjr  { "tmu", "00D7" },
219103739Stjr  { "/O", "00D8" },
220103739Stjr  { "`U", "00D9" },
221103739Stjr  { "'U", "00DA" },
222103739Stjr  { "^U", "00DB" },
223103739Stjr  { ":U", "00DC" },
224103739Stjr  { "'Y", "00DD" },
225113199Stjr  { "TP", "00DE" },
226124887Sdas  { "ss", "00DF" },
227103739Stjr  { "`a", "00E0" },
228103739Stjr  { "'a", "00E1" },
229103739Stjr  { "^a", "00E2" },
230103739Stjr  { "~a", "00E3" },
231103739Stjr  { ":a", "00E4" },
232103739Stjr  { "oa", "00E5" },
233103739Stjr  { "ae", "00E6" },
234103739Stjr  { ",c", "00E7" },
235103739Stjr  { "`e", "00E8" },
236103739Stjr  { "'e", "00E9" },
237103739Stjr  { "^e", "00EA" },
238103739Stjr  { ":e", "00EB" },
239103739Stjr  { "`i", "00EC" },
240103739Stjr  { "'i", "00ED" },
241103739Stjr  { "^i", "00EE" },
242103739Stjr  { ":i", "00EF" },
243103739Stjr  { "Sd", "00F0" },
244103739Stjr  { "~n", "00F1" },
245103739Stjr  { "`o", "00F2" },
246103739Stjr  { "'o", "00F3" },
247103739Stjr  { "^o", "00F4" },
248103739Stjr  { "~o", "00F5" },
249103739Stjr  { ":o", "00F6" },
250103739Stjr  { "di", "00F7" },
251103739Stjr  { "tdi", "00F7" },
252103739Stjr  { "/o", "00F8" },
253103739Stjr  { "`u", "00F9" },
254103739Stjr  { "'u", "00FA" },
255103739Stjr  { "^u", "00FB" },
256103739Stjr  { ":u", "00FC" },
257103739Stjr  { "'y", "00FD" },
258103739Stjr  { "Tp", "00FE" },
259103739Stjr  { ":y", "00FF" },
260103739Stjr  { "'C", "0106" },
261103739Stjr  { "'c", "0107" },
262103739Stjr  { ".i", "0131" },
263103739Stjr  { "IJ", "0132" },
264103739Stjr  { "ij", "0133" },
265103739Stjr  { "/L", "0141" },
266103739Stjr  { "/l", "0142" },
267103739Stjr  { "OE", "0152" },
268103739Stjr  { "oe", "0153" },
269103739Stjr  { "vS", "0160" },
270103739Stjr  { "vs", "0161" },
271103739Stjr  { ":Y", "0178" },
272103739Stjr  { "vZ", "017D" },
273103739Stjr  { "vz", "017E" },
274103739Stjr  { "Fn", "0192" },
275103739Stjr  { "ah", "02C7" },
276103739Stjr  { "ab", "02D8" },
277103739Stjr  { "a.", "02D9" },
278103739Stjr  { "ao", "02DA" },
279103739Stjr  { "ho", "02DB" },
280103739Stjr  { "a\"", "02DD" },
281103739Stjr  { "*A", "0391" },
282103739Stjr  { "*B", "0392" },
283103739Stjr  { "*G", "0393" },
284103739Stjr  { "*D", "0394" },
285103739Stjr  { "*E", "0395" },
286103739Stjr  { "*Z", "0396" },
287103739Stjr  { "*Y", "0397" },
288103739Stjr  { "*H", "0398" },
289103739Stjr  { "*I", "0399" },
290103739Stjr  { "*K", "039A" },
291103739Stjr  { "*L", "039B" },
292103739Stjr  { "*M", "039C" },
293103739Stjr  { "*N", "039D" },
294103739Stjr  { "*C", "039E" },
295103739Stjr  { "*O", "039F" },
296103739Stjr  { "*P", "03A0" },
297103739Stjr  { "*R", "03A1" },
298103739Stjr  { "*S", "03A3" },
299103739Stjr  { "*T", "03A4" },
300103739Stjr  { "*U", "03A5" },
301103739Stjr  { "*F", "03A6" },
302103739Stjr  { "*X", "03A7" },
303103739Stjr  { "*Q", "03A8" },
304128002Stjr  { "*W", "03A9" },
305128002Stjr  { "*a", "03B1" },
306103739Stjr  { "*b", "03B2" },
307103739Stjr  { "*g", "03B3" },
308103739Stjr  { "*d", "03B4" },
309103739Stjr  { "*e", "03B5" },
310113199Stjr  { "*z", "03B6" },
311113199Stjr  { "*y", "03B7" },
312113199Stjr  { "*h", "03B8" },
313103739Stjr  { "*i", "03B9" },
314103739Stjr  { "*k", "03BA" },
315103739Stjr  { "*l", "03BB" },
316103739Stjr  { "*m", "03BC" },
317103739Stjr  { "*n", "03BD" },
318103739Stjr  { "*c", "03BE" },
319103739Stjr  { "*o", "03BF" },
320103739Stjr  { "*p", "03C0" },
321103739Stjr  { "*r", "03C1" },
322103739Stjr  { "ts", "03C2" },
323103739Stjr  { "*s", "03C3" },
324128002Stjr  { "*t", "03C4" },
325103739Stjr  { "*u", "03C5" },
326128002Stjr  { "*f", "03C6" },
327103739Stjr  { "*x", "03C7" },
328103739Stjr  { "*q", "03C8" },
329103739Stjr  { "*w", "03C9" },
330103739Stjr  { "+h", "03D1" },
331103739Stjr  { "+f", "03D5" },
332103739Stjr  { "+p", "03D6" },
333103739Stjr  { "+e", "03F5" },
334103739Stjr  { "-", "2010" },
335103739Stjr  { "hy", "2010" },
336103739Stjr  { "en", "2013" },
337103739Stjr  { "em", "2014" },
338103739Stjr  { "`", "2018" },
339103739Stjr  { "oq", "2018" },
340103739Stjr  { "'", "2019" },
341103739Stjr  { "cq", "2019" },
342103739Stjr  { "bq", "201A" },
343103739Stjr  { "lq", "201C" },
344103739Stjr  { "rq", "201D" },
345103739Stjr  { "Bq", "201E" },
346103739Stjr  { "dg", "2020" },
347103739Stjr  { "dd", "2021" },
348103739Stjr  { "bu", "2022" },
349128002Stjr  { "%0", "2030" },
350103739Stjr  { "fm", "2032" },
351128002Stjr  { "sd", "2033" },
352103739Stjr  { "fo", "2039" },
353103739Stjr  { "fc", "203A" },
354103739Stjr  { "rn", "203E" },
355103739Stjr  { "f/", "2044" },
356103739Stjr  { "eu", "20AC" },
357103739Stjr  { "Eu", "20AC" },
358103739Stjr  { "-h", "210F" },
359103739Stjr  { "hbar", "210F" },
360103739Stjr  { "Im", "2111" },
361103739Stjr  { "wp", "2118" },
362103739Stjr  { "Re", "211C" },
363103739Stjr  { "tm", "2122" },
364103739Stjr  { "Ah", "2135" },
365103739Stjr  { "18", "215B" },
366103739Stjr  { "38", "215C" },
367103739Stjr  { "58", "215D" },
368103739Stjr  { "78", "215E" },
369103739Stjr  { "<-", "2190" },
370103739Stjr  { "ua", "2191" },
371103739Stjr  { "->", "2192" },
372103739Stjr  { "da", "2193" },
373103739Stjr  { "<>", "2194" },
374103739Stjr  { "va", "2195" },
375103739Stjr  { "CR", "21B5" },
376103739Stjr  { "lA", "21D0" },
377103739Stjr  { "uA", "21D1" },
378103739Stjr  { "rA", "21D2" },
379103739Stjr  { "dA", "21D3" },
380103739Stjr  { "hA", "21D4" },
381103739Stjr  { "vA", "21D5" },
382128821Sdas  { "fa", "2200" },
383113199Stjr  { "pd", "2202" },
384113199Stjr  { "te", "2203" },
385113199Stjr  { "es", "2205" },
386113199Stjr  { "gr", "2207" },
387113143Sdas  { "mo", "2208" },
388103739Stjr  { "nm", "2209" },
389103739Stjr  { "st", "220B" },
390113199Stjr  { "product", "220F" },
391103739Stjr  { "coproduct", "2210" },
392103739Stjr  { "sum", "2211" },
393103739Stjr//{ "\\-", "2212" },
394103739Stjr  { "mi", "2212" },
395103739Stjr  { "-+", "2213" },
396128821Sdas  { "**", "2217" },
397103739Stjr  { "sr", "221A" },
398113142Sdas  { "pt", "221D" },
399113142Sdas  { "if", "221E" },
400113142Sdas  { "/_", "2220" },
401113142Sdas  { "AN", "2227" },
402113142Sdas  { "OR", "2228" },
403113142Sdas  { "ca", "2229" },
404113142Sdas  { "cu", "222A" },
405113142Sdas  { "is", "222B" },
406103739Stjr  { "integral", "222B" },
407103739Stjr  { "tf", "2234" },
408103739Stjr  { "3d", "2234" },
409103739Stjr  { "ap", "223C" },
410103739Stjr  { "|=", "2243" },
411103739Stjr  { "=~", "2245" },
412103739Stjr  { "~~", "2248" },
413103739Stjr  { "~=", "2248" },
414103739Stjr  { "!=", "2260" },
415113199Stjr  { "==", "2261" },
416103739Stjr  { "ne", "2262" },
417103739Stjr  { "<=", "2264" },
418103739Stjr  { ">=", "2265" },
419103739Stjr  { ">>", "226A" },
420113199Stjr  { "<<", "226B" },
421103739Stjr  { "sb", "2282" },
422103739Stjr  { "sp", "2283" },
423103739Stjr  { "nb", "2284" },
424128821Sdas  { "nc", "2285" },
425113199Stjr  { "ib", "2286" },
426113199Stjr  { "ip", "2287" },
427113199Stjr  { "c+", "2295" },
428113199Stjr  { "c*", "2297" },
429113199Stjr  { "pp", "22A5" },
430113199Stjr  { "md", "22C5" },
431113199Stjr  { "lc", "2308" },
432113199Stjr  { "rc", "2309" },
433113199Stjr  { "lf", "230A" },
434113199Stjr  { "rf", "230B" },
435113199Stjr  { "parenlefttp", "239B" },
436113199Stjr  { "parenleftex", "239C" },
437113199Stjr  { "parenleftbt", "239D" },
438113199Stjr  { "parenrighttp", "239E" },
439103739Stjr  { "parenrightex", "239F" },
440113199Stjr  { "parenrightbt", "23A0" },
441113199Stjr  { "bracketlefttp", "23A1" },
442113199Stjr  { "bracketleftex", "23A2" },
443113199Stjr  { "bracketleftbt", "23A3" },
444113199Stjr  { "bracketrighttp", "23A4" },
445103739Stjr  { "bracketrightex", "23A5" },
446113199Stjr  { "bracketrightbt", "23A6" },
447113199Stjr  { "lt", "23A7" },
448103739Stjr  { "bracelefttp", "23A7" },
449113199Stjr  { "lk", "23A8" },
450113199Stjr  { "braceleftmid", "23A8" },
451113199Stjr  { "lb", "23A9" },
452113199Stjr  { "braceleftbt", "23A9" },
453113199Stjr  { "bv", "23AA" },
454113199Stjr  { "braceex", "23AA" },
455103739Stjr  { "braceleftex", "23AA" },
456103739Stjr  { "bracerightex", "23AA" },
457103739Stjr  { "rt", "23AB" },
458103739Stjr  { "bracerighttp", "23AB" },
459103739Stjr  { "rk", "23AC" },
460103739Stjr  { "bracerightmid", "23AC" },
461103739Stjr  { "rb", "23AD" },
462103739Stjr  { "bracerightbt", "23AD" },
463124887Sdas  { "an", "23AF" },
464113142Sdas  { "br", "2502" },
465103739Stjr  { "rk", "251D" },
466103739Stjr  { "lk", "2525" },
467103739Stjr  { "lt", "256D" },
468103739Stjr  { "rt", "256E" },
469103739Stjr  { "rb", "256F" },
470103739Stjr  { "lb", "2570" },
471103739Stjr  { "sq", "25A1" },
472103739Stjr  { "lz", "25CA" },
473103739Stjr  { "ci", "25CB" },
474103739Stjr  { "lh", "261C" },
475103739Stjr  { "rh", "261E" },
476103739Stjr  { "SP", "2660" },
477103739Stjr  { "CL", "2663" },
478103739Stjr  { "HE", "2665" },
479103739Stjr  { "DI", "2666" },
480103739Stjr  { "OK", "2713" },
481103739Stjr  { "la", "27E8" },
482103739Stjr  { "ra", "27E9" },
483124887Sdas};
484124887Sdas
485113199Stjr// global constructor
486103739Stjrstatic struct glyph_to_unicode_init {
487103739Stjr  glyph_to_unicode_init();
488103739Stjr} _glyph_to_unicode_init;
489103739Stjr
490103739Stjrglyph_to_unicode_init::glyph_to_unicode_init() {
491113199Stjr  for (unsigned int i = 0;
492122547Stjr       i < sizeof(glyph_to_unicode_list)/sizeof(glyph_to_unicode_list[0]);
493103739Stjr       i++) {
494103739Stjr    glyph_to_unicode *gtu = new glyph_to_unicode[1];
495103739Stjr    gtu->value = (char *)glyph_to_unicode_list[i].value;
496103739Stjr    glyph_to_unicode_table.define(glyph_to_unicode_list[i].key, gtu);
497103739Stjr  }
498103739Stjr}
499103739Stjr
500103739Stjrconst char *glyph_name_to_unicode(const char *s)
501103739Stjr{
502103739Stjr  glyph_to_unicode *result = glyph_to_unicode_table.lookup(s);
503113199Stjr  return result ? result->value : 0;
504113199Stjr}
505113199Stjr