Merge branch 'vendor/LIBPCAP'
[dragonfly.git] / contrib / groff / src / utils / hpftodit / hpuni.cpp
1 // -*- C++ -*-
2 /* Copyright (C) 2003, 2004, 2009 Free Software Foundation, Inc.
3      Written by Jeff Conrad (jeff_conrad@msn.com)
4
5 This file is part of groff.
6
7 groff is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 groff is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "lib.h"
21 #include "stringclass.h"
22 #include "ptable.h"
23
24 #include "unicode.h"
25
26 struct hp_msl_to_unicode {
27   char *value;
28 };
29
30 declare_ptable(hp_msl_to_unicode)
31 implement_ptable(hp_msl_to_unicode)
32
33 PTABLE(hp_msl_to_unicode) hp_msl_to_unicode_table;
34
35 struct S {
36   const char *key;
37   const char *value;
38 } hp_msl_to_unicode_list[] = {
39   { "1", "0021", },     // Exclamation Mark
40   { "2", "0022", },     // Neutral Double Quote
41   { "3", "0023", },     // Number Sign
42   { "4", "0024", },     // Dollar Sign
43   { "5", "0025", },     // Per Cent Sign
44   { "6", "0026", },     // Ampersand
45   { "8", "2019", },     // Single Close Quote (9)
46   { "9", "0028", },     // Left Parenthesis
47   { "10", "0029", },    // Right Parenthesis
48   { "11", "002A", },    // Asterisk
49   { "12", "002B", },    // Plus Sign
50   { "13", "002C", },    // Comma, or Decimal Separator
51   { "14", "002D", },    // Hyphen
52   { "15", "002E", },    // Period, or Full Stop
53   { "16", "002F", },    // Solidus, or Slash
54   { "17", "0030", },    // Numeral Zero
55   { "18", "0031", },    // Numeral One
56   { "19", "0032", },    // Numeral Two
57   { "20", "0033", },    // Numeral Three
58   { "21", "0034", },    // Numeral Four
59   { "22", "0035", },    // Numeral Five
60   { "23", "0036", },    // Numeral Six
61   { "24", "0037", },    // Numeral Seven
62   { "25", "0038", },    // Numeral Eight
63   { "26", "0039", },    // Numeral Nine
64   { "27", "003A", },    // Colon
65   { "28", "003B", },    // Semicolon
66   { "29", "003C", },    // Less Than Sign
67   { "30", "003D", },    // Equals Sign
68   { "31", "003E", },    // Greater Than Sign
69   { "32", "003F", },    // Question Mark
70   { "33", "0040", },    // Commercial At
71   { "34", "0041", },    // Uppercase A
72   { "35", "0042", },    // Uppercase B
73   { "36", "0043", },    // Uppercase C
74   { "37", "0044", },    // Uppercase D
75   { "38", "0045", },    // Uppercase E
76   { "39", "0046", },    // Uppercase F
77   { "40", "0047", },    // Uppercase G
78   { "41", "0048", },    // Uppercase H
79   { "42", "0049", },    // Uppercase I
80   { "43", "004A", },    // Uppercase J
81   { "44", "004B", },    // Uppercase K
82   { "45", "004C", },    // Uppercase L
83   { "46", "004D", },    // Uppercase M
84   { "47", "004E", },    // Uppercase N
85   { "48", "004F", },    // Uppercase O
86   { "49", "0050", },    // Uppercase P
87   { "50", "0051", },    // Uppercase Q
88   { "51", "0052", },    // Uppercase R
89   { "52", "0053", },    // Uppercase S
90   { "53", "0054", },    // Uppercase T
91   { "54", "0055", },    // Uppercase U
92   { "55", "0056", },    // Uppercase V
93   { "56", "0057", },    // Uppercase W
94   { "57", "0058", },    // Uppercase X
95   { "58", "0059", },    // Uppercase Y
96   { "59", "005A", },    // Uppercase Z
97   { "60", "005B", },    // Left Bracket
98   { "61", "005C", },    // Reverse Solidus, or Backslash
99   { "62", "005D", },    // Right Bracket
100   { "63", "005E", },    // Circumflex, Exponent, or Pointer
101   { "64", "005F", },    // Underline or Underscore Character
102   { "66", "2018", },    // Single Open Quote (6)
103   { "67", "0061", },    // Lowercase A
104   { "68", "0062", },    // Lowercase B
105   { "69", "0063", },    // Lowercase C
106   { "70", "0064", },    // Lowercase D
107   { "71", "0065", },    // Lowercase E
108   { "72", "0066", },    // Lowercase F
109   { "73", "0067", },    // Lowercase G
110   { "74", "0068", },    // Lowercase H
111   { "75", "0069", },    // Lowercase I
112   { "76", "006A", },    // Lowercase J
113   { "77", "006B", },    // Lowercase K
114   { "78", "006C", },    // Lowercase L
115   { "79", "006D", },    // Lowercase M
116   { "80", "006E", },    // Lowercase N
117   { "81", "006F", },    // Lowercase O
118   { "82", "0070", },    // Lowercase P
119   { "83", "0071", },    // Lowercase Q
120   { "84", "0072", },    // Lowercase R
121   { "85", "0073", },    // Lowercase S
122   { "86", "0074", },    // Lowercase T
123   { "87", "0075", },    // Lowercase U
124   { "88", "0076", },    // Lowercase V
125   { "89", "0077", },    // Lowercase W
126   { "90", "0078", },    // Lowercase X
127   { "91", "0079", },    // Lowercase Y
128   { "92", "007A", },    // Lowercase Z
129   { "93", "007B", },    // Left Brace
130   { "94", "007C", },    // Long Vertical Mark
131   { "95", "007D", },    // Right Brace
132   { "96", "007E", },    // One Wavy Line Approximate
133   { "97", "2592", },    // Medium Shading Character
134   { "99", "00C0", },    // Uppercase A Grave
135   { "100", "00C2", },   // Uppercase A Circumflex
136   { "101", "00C8", },   // Uppercase E Grave
137   { "102", "00CA", },   // Uppercase E Circumflex
138   { "103", "00CB", },   // Uppercase E Dieresis
139   { "104", "00CE", },   // Uppercase I Circumflex
140   { "105", "00CF", },   // Uppercase I Dieresis
141   { "106", "00B4", },   // Lowercase Acute Accent (Spacing)
142   { "107", "0060", },   // Lowercase Grave Accent (Spacing)
143   { "108", "02C6", },   // Lowercase Circumflex Accent (Spacing)
144   { "109", "00A8", },   // Lowercase Dieresis Accent (Spacing)
145   { "110", "02DC", },   // Lowercase Tilde Accent (Spacing)
146   { "111", "00D9", },   // Uppercase U Grave
147   { "112", "00DB", },   // Uppercase U Circumflex
148   { "113", "00AF", },   // Overline, or Overscore Character
149   { "114", "00DD", },   // Uppercase Y Acute
150   { "115", "00FD", },   // Lowercase Y Acute
151   { "116", "00B0", },   // Degree Sign
152   { "117", "00C7", },   // Uppercase C Cedilla
153   { "118", "00E7", },   // Lowercase C Cedilla
154   { "119", "00D1", },   // Uppercase N Tilde
155   { "120", "00F1", },   // Lowercase N Tilde
156   { "121", "00A1", },   // Inverted Exclamation
157   { "122", "00BF", },   // Inverted Question Mark
158   { "123", "00A4", },   // Currency Symbol
159   { "124", "00A3", },   // Pound Sterling Sign
160   { "125", "00A5", },   // Yen Sign
161   { "126", "00A7", },   // Section Mark
162   { "127", "0192", },   // Florin Sign
163   { "128", "00A2", },   // Cent Sign
164   { "129", "00E2", },   // Lowercase A Circumflex
165   { "130", "00EA", },   // Lowercase E Circumflex
166   { "131", "00F4", },   // Lowercase O Circumflex
167   { "132", "00FB", },   // Lowercase U Circumflex
168   { "133", "00E1", },   // Lowercase A Acute
169   { "134", "00E9", },   // Lowercase E Acute
170   { "135", "00F3", },   // Lowercase O Acute
171   { "136", "00FA", },   // Lowercase U Acute
172   { "137", "00E0", },   // Lowercase A Grave
173   { "138", "00E8", },   // Lowercase E Grave
174   { "139", "00F2", },   // Lowercase O Grave
175   { "140", "00F9", },   // Lowercase U Grave
176   { "141", "00E4", },   // Lowercase A Dieresis
177   { "142", "00EB", },   // Lowercase E Dieresis
178   { "143", "00F6", },   // Lowercase O Dieresis
179   { "144", "00FC", },   // Lowercase U Dieresis
180   { "145", "00C5", },   // Uppercase A Ring
181   { "146", "00EE", },   // Lowercase I Circumflex
182   { "147", "00D8", },   // Uppercase O Oblique
183   { "148", "00C6", },   // Uppercase AE Diphthong
184   { "149", "00E5", },   // Lowercase A Ring
185   { "150", "00ED", },   // Lowercase I Acute
186   { "151", "00F8", },   // Lowercase O Oblique
187   { "152", "00E6", },   // Lowercase AE Diphthong
188   { "153", "00C4", },   // Uppercase A Dieresis
189   { "154", "00EC", },   // Lowercase I Grave
190   { "155", "00D6", },   // Uppercase O Dieresis
191   { "156", "00DC", },   // Uppercase U Dieresis
192   { "157", "00C9", },   // Uppercase E Acute
193   { "158", "00EF", },   // Lowercase I Dieresis
194   { "159", "00DF", },   // Lowercase Es-zet Ligature
195   { "160", "00D4", },   // Uppercase O Circumflex
196   { "161", "00C1", },   // Uppercase A Acute
197   { "162", "00C3", },   // Uppercase A Tilde
198   { "163", "00E3", },   // Lowercase A Tilde
199   { "164", "00D0", },   // Uppercase Eth
200 //{ "164", "0110", },   // Uppercase D-Stroke
201   { "165", "00F0", },   // Lowercase Eth
202   { "166", "00CD", },   // Uppercase I Acute
203   { "167", "00CC", },   // Uppercase I Grave
204   { "168", "00D3", },   // Uppercase O Acute
205   { "169", "00D2", },   // Uppercase O Grave
206   { "170", "00D5", },   // Uppercase O Tilde
207   { "171", "00F5", },   // Lowercase O Tilde
208   { "172", "0160", },   // Uppercase S Hacek
209   { "173", "0161", },   // Lowercase S Hacek
210   { "174", "00DA", },   // Uppercase U Acute
211   { "175", "0178", },   // Uppercase Y Dieresis
212   { "176", "00FF", },   // Lowercase Y Dieresis
213   { "177", "00DE", },   // Uppercase Thorn
214   { "178", "00FE", },   // Lowercase Thorn
215   { "180", "00B5", },   // Lowercase Greek Mu, or Micro
216   { "181", "00B6", },   // Pilcrow, or Paragraph Sign
217   { "182", "00BE", },   // Vulgar Fraction 3/4
218   { "183", "2212", },   // Minus Sign
219   { "184", "00BC", },   // Vulgar Fraction 1/4
220   { "185", "00BD", },   // Vulgar Fraction 1/2
221   { "186", "00AA", },   // Female Ordinal
222   { "187", "00BA", },   // Male Ordinal
223   { "188", "00AB", },   // Left Pointing Double Angle Quote
224   { "189", "25A0", },   // Medium Solid Square Box
225   { "190", "00BB", },   // Right Pointing Double Angle Quote
226   { "191", "00B1", },   // Plus Over Minus Sign
227   { "192", "00A6", },   // Broken Vertical Mark
228   { "193", "00A9", },   // Copyright Sign
229   { "194", "00AC", },   // Not Sign
230   { "195", "00AD", },   // Soft Hyphen
231   { "196", "00AE", },   // Registered Sign
232   { "197", "00B2", },   // Superior Numeral 2
233   { "198", "00B3", },   // Superior Numeral 3
234   { "199", "00B8", },   // Lowercase Cedilla (Spacing)
235   { "200", "00B9", },   // Superior Numeral 1
236   { "201", "00D7", },   // Multiply Sign
237   { "202", "00F7", },   // Divide Sign
238   { "203", "263A", },   // Open Smiling Face
239   { "204", "263B", },   // Solid Smiling Face
240   { "205", "2665", },   // Solid Heart, Card Suit
241   { "206", "2666", },   // Solid Diamond, Card Suit
242   { "207", "2663", },   // Solid Club, Card Suit
243   { "208", "2660", },   // Solid Spade, Card Suit
244   { "209", "25CF", },   // Medium Solid Round Bullet
245   { "210", "25D8", },   // Large Solid square with White Dot
246   { "211", "EFFD", },   // Large Open Round Bullet
247   { "212", "25D9", },   // Large Solid square with White Circle
248   { "213", "2642", },   // Male Symbol
249   { "214", "2640", },   // Female Symbol
250   { "215", "266A", },   // Musical Note
251   { "216", "266B", },   // Pair Of Musical Notes
252   { "217", "263C", },   // Compass, or Eight Pointed Sun
253   { "218", "25BA", },   // Right Solid Arrowhead
254   { "219", "25C4", },   // Left Solid Arrowhead
255   { "220", "2195", },   // Up/Down Arrow
256   { "221", "203C", },   // Double Exclamation Mark
257   { "222", "25AC", },   // Thick Horizontal Mark
258   { "223", "21A8", },   // Up/Down Arrow Baseline
259   { "224", "2191", },   // Up Arrow
260   { "225", "2193", },   // Down Arrow
261   { "226", "2192", },   // Right Arrow
262   { "227", "2190", },   // Left Arrow
263   { "229", "2194", },   // Left/Right Arrow
264   { "230", "25B2", },   // Up Solid Arrowhead
265   { "231", "25BC", },   // Down Solid Arrowhead
266   { "232", "20A7", },   // Pesetas Sign
267   { "233", "2310", },   // Reversed Not Sign
268   { "234", "2591", },   // Light Shading Character
269   { "235", "2593", },   // Dark Shading Character
270   { "236", "2502", },   // Box Draw Line, Vert. 1
271   { "237", "2524", },   // Box Draw Right Tee, Vert. 1 Horiz. 1
272   { "238", "2561", },   // Box Draw Right Tee, Vert. 1 Horiz. 2
273   { "239", "2562", },   // Box Draw Right Tee, Vert. 2 Horiz. 1
274   { "240", "2556", },   // Box Draw Upper Right Corner, Vert. 2 Horiz. 1
275   { "241", "2555", },   // Box Draw Upper Right Corner, Vert. 1 Horiz. 2
276   { "242", "2563", },   // Box Draw Right Tee, Vert. 2 Horiz. 2
277   { "243", "2551", },   // Box Draw Lines, Vert. 2
278   { "244", "2557", },   // Box Draw Upper Right Corner, Vert. 2 Horiz. 2
279   { "245", "255D", },   // Box Draw Lower Right Corner, Vert. 2 Horiz. 2
280   { "246", "255C", },   // Box Draw Lower Right Corner, Vert. 2 Horiz. 1
281   { "247", "255B", },   // Box Draw Lower Right Corner, Vert. 1 Horiz. 2
282   { "248", "2510", },   // Box Draw Upper Right Corner, Vert. 1, Horiz. 1
283   { "249", "2514", },   // Box Draw Lower Left Corner, Vert. 1, Horiz. 1
284   { "250", "2534", },   // Box Draw Bottom Tee, Vert. 1 Horiz. 1
285   { "251", "252C", },   // Box Draw Top Tee, Vert. 1 Horiz. 1
286   { "252", "251C", },   // Box Draw Left Tee, Vert. 1 Horiz. 1
287   { "253", "2500", },   // Box Draw Line, Horiz. 1
288   { "254", "253C", },   // Box Draw Cross, Vert. 1 Horiz. 1
289   { "255", "255E", },   // Box Draw Left Tee, Vert. 1 Horiz. 2
290   { "256", "255F", },   // Box Draw Left Tee, Vert. 2 Horz. 1
291   { "257", "255A", },   // Box Draw Lower Left Corner, Vert. 2 Horiz. 2
292   { "258", "2554", },   // Box Draw Upper Left Corner, Vert. 2 Horiz. 2
293   { "259", "2569", },   // Box Draw Bottom Tee, Vert. 2 Horiz. 2
294   { "260", "2566", },   // Box Draw Top Tee, Vert. 2 Horiz. 2
295   { "261", "2560", },   // Box Draw Left Tee, Vert. 2 Horiz. 2
296   { "262", "2550", },   // Box Draw Lines, Horiz. 2
297   { "263", "256C", },   // Box Draw Cross Open Center, Vert. 2 Horiz. 2
298   { "264", "2567", },   // Box Draw Bottom Tee, Vert. 1 Horiz. 2
299   { "265", "2568", },   // Box Draw Bottom Tee, Vert. 2 Horiz. 1
300   { "266", "2564", },   // Box Draw Top Tee, Vert. 1 Horiz. 2
301   { "267", "2565", },   // Box Draw Top Tee, Vert. 2 Horiz. 1
302   { "268", "2559", },   // Box Draw Lower Left Corner, Vert. 2 Horiz. 1
303   { "269", "2558", },   // Box Draw Lower Left Corner, Vert. 1 Horiz. 2
304   { "270", "2552", },   // Box Draw Upper Left Corner, Vert. 1 Horiz. 2
305   { "271", "2553", },   // Box Draw Upper Left Corner, Vert. 2 Horiz. 1
306   { "272", "256B", },   // Box Draw Cross, Vert. 2 Horiz. 1
307   { "273", "256A", },   // Box Draw Cross, Vert. 1 Horiz. 2
308   { "274", "2518", },   // Box Draw Lower Right Corner, Vert. 1 Horiz. 1
309   { "275", "250C", },   // Box Draw Upper Left Corner, Vert. 1, Horiz. 1
310   { "276", "2588", },   // Solid Full High/Wide
311   { "277", "2584", },   // Bottom Half Solid Rectangle
312   { "278", "258C", },   // Left Half Solid Rectangle
313   { "279", "2590", },   // Right Half Solid Rectangle
314   { "280", "2580", },   // Top Half Solid Rectangle
315   { "290", "2126", },   // Uppercase Greek Omega, or Ohms
316   { "292", "221E", },   // Infinity Symbol
317   { "295", "2229", },   // Set Intersection Symbol
318   { "296", "2261", },   // Exactly Equals Sign
319   { "297", "2265", },   // Greater Than or Equal Sign
320   { "298", "2264", },   // Less Than or Equal Sign
321   { "299", "2320", },   // Top Integral
322   { "300", "2321", },   // Bottom Integral
323   { "301", "2248", },   // Two Wavy Line Approximate Sign
324 //{ "302", "00B7", },   // Middle Dot, or Centered Period (see 2219)
325 //{ "302", "2219", },   // Centered Period, Middle Dot
326   { "302", "2219", },   // Math Dot, Centered Period
327   { "303", "221A", },   // Radical Symbol, Standalone Diagonal
328   { "305", "25AA", },   // Small Solid Square Box
329   { "306", "013F", },   // Uppercase L-Dot
330   { "307", "0140", },   // Lowercase L-Dot
331   { "308", "2113", },   // Litre Symbol
332   { "309", "0149", },   // Lowercase Apostrophe-N
333   { "310", "2032", },   // Prime, Minutes, or Feet Symbol
334   { "311", "2033", },   // Double Prime, Seconds, or Inches Symbol
335   { "312", "2020", },   // Dagger Symbol
336   { "313", "2122", },   // Trademark Sign
337   { "314", "2017", },   // Double Underline Character
338   { "315", "02C7", },   // Lowercase Hacek Accent (Spacing)
339   { "316", "02DA", },   // Lowercase Ring Accent (Spacing)
340   { "317", "EFF9", },   // Uppercase Acute Accent (Spacing)
341   { "318", "EFF8", },   // Uppercase Grave Accent (Spacing)
342   { "319", "EFF7", },   // Uppercase Circumflex Accent (Spacing)
343   { "320", "EFF6", },   // Uppercase Dieresis Accent (Spacing)
344   { "321", "EFF5", },   // Uppercase Tilde Accent (Spacing)
345   { "322", "EFF4", },   // Uppercase Hacek Accent (Spacing)
346   { "323", "EFF3", },   // Uppercase Ring Accent (Spacing)
347   { "324", "2215", },   // Vulgar Fraction Bar
348   { "325", "2014", },   // Em Dash
349   { "326", "2013", },   // En Dash
350   { "327", "2021", },   // Double Dagger Symbol
351   { "328", "0131", },   // Lowercase Undotted I
352   { "329", "0027", },   // Neutral Single Quote
353   { "330", "EFF2", },   // Uppercase Cedilla (Spacing)
354   { "331", "2022", },   // Small Solid Round Bullet
355   { "332", "207F", },   // Superior Lowercase N
356   { "333", "2302", },   // Home Plate
357   { "335", "0138", },   // Lowercase Kra
358   { "338", "0166", },   // Uppercase T-Stroke
359   { "339", "0167", },   // Lowercase T-Stroke
360   { "340", "014A", },   // Uppercase Eng
361   { "341", "014B", },   // Lowercase Eng
362   { "342", "0111", },   // Lowercase D-Stroke
363   { "400", "0102", },   // Uppercase A Breve
364   { "401", "0103", },   // Lowercase A Breve
365   { "402", "0100", },   // Uppercase A Macron
366   { "403", "0101", },   // Lowercase A Macron
367   { "404", "0104", },   // Uppercase A Ogonek
368   { "405", "0105", },   // Lowercase A Ogonek
369   { "406", "0106", },   // Uppercase C Acute
370   { "407", "0107", },   // Lowercase C Acute
371   { "410", "010C", },   // Uppercase C Hacek
372   { "411", "010D", },   // Lowercase C Hacek
373   { "414", "010E", },   // Uppercase D Hacek
374   { "415", "010F", },   // Lowercase D Hacek
375   { "416", "011A", },   // Uppercase E Hacek
376   { "417", "011B", },   // Lowercase E Hacek
377   { "418", "0116", },   // Uppercase E Overdot
378   { "419", "0117", },   // Lowercase E Overdot
379   { "420", "0112", },   // Uppercase E Macron
380   { "421", "0113", },   // Lowercase E Macron
381   { "422", "0118", },   // Uppercase E Ogonek
382   { "423", "0119", },   // Lowercase E Ogonek
383   { "428", "0122", },   // Uppercase G Cedilla
384   { "429", "0123", },   // Lowercase G Cedilla
385   { "432", "012E", },   // Uppercase I Ogonek
386   { "433", "012F", },   // Lowercase I Ogonek
387   { "434", "012A", },   // Uppercase I Macron
388   { "435", "012B", },   // Lowercase I Macron
389   { "438", "0136", },   // Uppercase K Cedilla
390   { "439", "0137", },   // Lowercase K Cedilla
391   { "440", "0139", },   // Uppercase L Acute
392   { "441", "013A", },   // Lowercase L Acute
393   { "442", "013D", },   // Uppercase L Hacek
394   { "443", "013E", },   // Lowercase L Hacek
395   { "444", "013B", },   // Uppercase L Cedilla
396   { "445", "013C", },   // Lowercase L Cedilla
397   { "446", "0143", },   // Uppercase N Acute
398   { "447", "0144", },   // Lowercase N Acute
399   { "448", "0147", },   // Uppercase N Hacek
400   { "449", "0148", },   // Lowercase N Hacek
401   { "450", "0145", },   // Uppercase N Cedilla
402   { "451", "0146", },   // Lowercase N Cedilla
403   { "452", "0150", },   // Uppercase O Double Acute
404   { "453", "0151", },   // Lowercase O Double Acute
405   { "454", "014C", },   // Uppercase O Macron
406   { "455", "014D", },   // Lowercase O Macron
407   { "456", "0154", },   // Uppercase R Acute
408   { "457", "0155", },   // Lowercase R Acute
409   { "458", "0158", },   // Uppercase R Hacek
410   { "459", "0159", },   // Lowercase R Hacek
411   { "460", "0156", },   // Uppercase R Cedilla
412   { "461", "0157", },   // Lowercase R Cedilla
413   { "462", "015A", },   // Uppercase S Acute
414   { "463", "015B", },   // Lowercase S Acute
415   { "466", "0164", },   // Uppercase T Hacek
416   { "467", "0165", },   // Lowercase T Hacek
417   { "468", "0162", },   // Uppercase T Cedilla
418   { "469", "0163", },   // Lowercase T Cedilla
419   { "470", "0168", },   // Uppercase U Tilde
420   { "471", "0169", },   // Lowercase U Tilde
421   { "474", "0170", },   // Uppercase U Double Acute
422   { "475", "0171", },   // Lowercase U Double Acute
423   { "476", "016E", },   // Uppercase U Ring
424   { "477", "016F", },   // Lowercase U Ring
425   { "478", "016A", },   // Uppercase U Macron
426   { "479", "016B", },   // Lowercase U Macron
427   { "480", "0172", },   // Uppercase U Ogonek
428   { "481", "0173", },   // Lowercase U Ogonek
429   { "482", "0179", },   // Uppercase Z Acute
430   { "483", "017A", },   // Lowercase Z Acute
431   { "484", "017B", },   // Uppercase Z Overdot
432   { "485", "017C", },   // Lowercase Z Overdot
433   { "486", "0128", },   // Uppercase I Tilde
434   { "487", "0129", },   // Lowercase I Tilde
435   { "500", "EFBF", },   // Radical, Diagonal, Composite
436   { "501", "221D", },   // Proportional To Symbol
437   { "502", "212F", },   // Napierian (italic e)
438   { "503", "03F5", },   // Alternate Lowercase Greek Epsilon
439 //{ "503", "EFEC", },   // Alternate Lowercase Greek Epsilon
440   { "504", "2234", },   // Therefore Symbol
441   { "505", "0393", },   // Uppercase Greek Gamma
442   { "506", "2206", },   // Increment Symbol (Delta)
443   { "507", "0398", },   // Uppercase Greek Theta
444   { "508", "039B", },   // Uppercase Greek Lambda
445   { "509", "039E", },   // Uppercase Greek Xi
446   { "510", "03A0", },   // Uppercase Greek Pi
447   { "511", "03A3", },   // Uppercase Greek Sigma
448   { "512", "03A5", },   // Uppercase Greek Upsilon
449   { "513", "03A6", },   // Uppercase Greek Phi
450   { "514", "03A8", },   // Uppercase Greek Psi
451   { "515", "03A9", },   // Uppercase Greek Omega
452   { "516", "2207", },   // Nabla Symbol (inverted Delta)
453   { "517", "2202", },   // Partial Differential Delta Symbol
454   { "518", "03C2", },   // Lowercase Sigma, Terminal
455   { "519", "2260", },   // Not Equal To Symbol
456   { "520", "EFEB", },   // Underline, Composite
457   { "521", "2235", },   // Because Symbol
458   { "522", "03B1", },   // Lowercase Greek Alpha
459   { "523", "03B2", },   // Lowercase Greek Beta
460   { "524", "03B3", },   // Lowercase Greek Gamma
461   { "525", "03B4", },   // Lowercase Greek Delta
462   { "526", "03B5", },   // Lowercase Greek Epsilon
463   { "527", "03B6", },   // Lowercase Greek Zeta
464   { "528", "03B7", },   // Lowercase Greek Eta
465   { "529", "03B8", },   // Lowercase Greek Theta
466   { "530", "03B9", },   // Lowercase Greek Iota
467   { "531", "03BA", },   // Lowercase Greek Kappa
468   { "532", "03BB", },   // Lowercase Greek Lambda
469   { "533", "03BC", },   // Lowercase Greek Mu
470   { "534", "03BD", },   // Lowercase Greek Nu
471   { "535", "03BE", },   // Lowercase Greek Xi
472   { "536", "03BF", },   // Lowercase Greek Omicron
473   { "537", "03C0", },   // Lowercase Greek Pi
474   { "538", "03C1", },   // Lowercase Greek Rho
475   { "539", "03C3", },   // Lowercase Greek Sigma
476   { "540", "03C4", },   // Lowercase Greek Tau
477   { "541", "03C5", },   // Lowercase Greek Upsilon
478   { "542", "03C6", },   // Lowercase Greek Phi
479   { "543", "03C7", },   // Lowercase Greek Chi
480   { "544", "03C8", },   // Lowercase Greek Psi
481   { "545", "03C9", },   // Lowercase Greek Omega
482   { "546", "03D1", },   // Lowercase Greek Theta, Open
483   { "547", "03D5", },   // Lowercase Greek Phi, Open
484   { "548", "03D6", },   // Lowercase Pi, Alternate
485   { "549", "2243", },   // Wavy Over Straight Approximate Symbol
486   { "550", "2262", },   // Not Exactly Equal To Symbol
487   { "551", "21D1", },   // Up Arrow Double Stroke
488   { "552", "21D2", },   // Right Arrow Double Stroke
489   { "553", "21D3", },   // Down Arrow Double Stroke
490   { "554", "21D0", },   // Left Arrow Double Stroke
491   { "555", "21D5", },   // Up/Down Arrow Double Stroke
492   { "556", "21D4", },   // Left/Right Arrow Double Stroke
493   { "557", "21C4", },   // Right Over Left Arrow
494   { "558", "21C6", },   // Left Over Right Arrow
495   { "559", "EFE9", },   // Vector Symbol
496   { "560", "0305", },   // Overline, Composite
497   { "561", "2200", },   // For All Symbol, or Universal (inverted A)
498   { "562", "2203", },   // There Exists Symbol, or Existential (inverted E)
499   { "563", "22A4", },   // Top Symbol
500   { "564", "22A5", },   // Bottom Symbol
501   { "565", "222A", },   // Set Union Symbol
502   { "566", "2208", },   // Element-Of Symbol
503   { "567", "220B", },   // Contains Symbol
504   { "568", "2209", },   // Not-Element-Of Symbol
505   { "569", "2282", },   // Proper Subset Symbol
506   { "570", "2283", },   // Proper Superset Symbol
507   { "571", "2284", },   // Not Proper Subset Symbol
508   { "572", "2285", },   // Not Proper Superset Symbol
509   { "573", "2286", },   // Subset Symbol
510   { "574", "2287", },   // Superset Symbol
511   { "575", "2295", },   // Plus In Circle Symbol
512   { "576", "2299", },   // Dot In Circle Symbol
513   { "577", "2297", },   // Times In Circle Symbol
514   { "578", "2296", },   // Minus In Circle Symbol
515   { "579", "2298", },   // Slash In Circle Symbol
516   { "580", "2227", },   // Logical And Symbol
517   { "581", "2228", },   // Logical Or Symbol
518   { "582", "22BB", },   // Exclusive Or Symbol
519   { "583", "2218", },   // Functional Composition Symbol
520   { "584", "20DD", },   // Large Open Circle
521   { "585", "22A3", },   // Assertion Symbol
522   { "586", "22A2", },   // Backwards Assertion Symbol
523   { "587", "222B", },   // Integral Symbol
524   { "588", "222E", },   // Curvilinear Integral Symbol
525   { "589", "2220", },   // Angle Symbol
526   { "590", "2205", },   // Empty Set Symbol
527   { "591", "2135", },   // Hebrew Aleph
528   { "592", "2136", },   // Hebrew Beth
529   { "593", "2137", },   // Hebrew Gimmel
530   { "594", "212D", },   // Fraktur Uppercase C
531   { "595", "2111", },   // Fraktur Uppercase I
532   { "596", "211C", },   // Fraktur Uppercase R
533   { "597", "2128", },   // Fraktur Uppercase Z
534   { "598", "23A1", },   // Top Segment Left Bracket (Left Square Bracket Upper Corner)
535   { "599", "23A3", },   // Bottom Segment Left Bracket (Left Square Bracket Lower Corner)
536   { "600", "239B", },   // Top Segment Left Brace (Left Parenthesis Upper Hook)
537 //{ "600", "23A7", },   // Top Segment Left Brace (Right Curly Bracket Upper Hook)
538   { "601", "23A8", },   // Middle Segment Left Brace (Right Curly Bracket Middle Piece)
539   { "602", "239D", },   // Bottom Segment LeftBrace (Left Parenthesis Lower Hook)
540 //{ "602", "23A9", },   // Bottom Segment Left Brace (Right Curly Bracket Lower Hook)
541   { "603", "EFD4", },   // Middle Segment Curvilinear Integral
542   { "604", "EFD3", },   // Top Left Segment Summation
543   { "605", "2225", },   // Double Vertical Line, Composite
544   { "606", "EFD2", },   // Bottom Left Segment Summation
545   { "607", "EFD1", },   // Bottom Diagonal Summation
546   { "608", "23A4", },   // Top Segment Right Bracket (Right Square Bracket Upper Corner)
547   { "609", "23A6", },   // Bottom Segment Right Bracket (Right Square Bracket Lower Corner)
548   { "610", "239E", },   // Top Segment Right Brace (Right Parenthesis Upper Hook)
549 //{ "610", "23AB", },   // Top Segment Right Brace (Right Curly Bracket Upper Hook)
550   { "611", "23AC", },   // Middle Segment Right Brace (Right Curly Bracket Middle Piece)
551   { "612", "23A0", },   // Bottom Segment Right ( Right Parenthesis Lower Hook)
552 //{ "612", "23AD", },   // Bottom Segment Right Brace (Right Curly Bracket Lower Hook)
553   { "613", "239C", },   // Thick Vertical Line, Composite (Left Parenthesis Extension)
554 //{ "613", "239F", },   // Thick Vertical Line, Composite (Right Parenthesis Extension)
555 //{ "613", "23AA", },   // Thick Vertical Line, Composite (Curly Bracket Extension)
556 //{ "613", "23AE", },   // Thick Vertical Line, Composite (Integral Extension)
557   { "614", "2223", },   // Thin Vertical Line, Composite
558   { "615", "EFDC", },   // Bottom Segment of Vertical Radical
559   { "616", "EFD0", },   // Top Right Segment Summation
560   { "617", "EFCF", },   // Middle Segment Summation
561   { "618", "EFCE", },   // Bottom Right Segment Summation
562   { "619", "EFCD", },   // Top Diagonal Summation
563   { "620", "2213", },   // Minus Over Plus Sign
564   { "621", "2329", },   // Left Angle Bracket
565   { "622", "232A", },   // Right Angle Bracket
566   { "623", "EFFF", },   // Mask Symbol
567   { "624", "2245", },   // Wavy Over Two Straight Approximate Symbol
568   { "625", "2197", },   // 45 Degree Arrow
569   { "626", "2198", },   // -45 Degree Arrow
570   { "627", "2199", },   // -135 Degree Arrow
571   { "628", "2196", },   // 135 Degree Arrow
572   { "629", "25B5", },   // Up Open Triangle
573   { "630", "25B9", },   // Right Open Triangle
574   { "631", "25BF", },   // Down Open Triangle
575   { "632", "25C3", },   // Left Open Triangle
576   { "633", "226A", },   // Much Less Than Sign
577   { "634", "226B", },   // Much Greater Than Sign
578   { "635", "2237", },   // Proportional To Symbol (4 dots)
579   { "636", "225C", },   // Defined As Symbol
580   { "637", "03DD", },   // Lowercase Greek Digamma
581   { "638", "210F", },   // Planck's Constant divided by 2 pi
582   { "639", "2112", },   // Laplace Transform Symbol
583   { "640", "EFFE", },   // Power Set
584   { "641", "2118", },   // Weierstrassian Symbol
585   { "642", "2211", },   // Summation Symbol (large Sigma)
586   { "643", "301A", },   // Left Double Bracket
587   { "644", "EFC9", },   // Middle Segment Double Bracket
588   { "645", "301B", },   // Right Double Bracket
589   { "646", "256D", },   // Box Draw Left Top Round Corner
590   { "647", "2570", },   // Box Draw Left Bottom Round Corner
591   { "648", "EFC8", },   // Extender Large Union/Product
592   { "649", "EFC7", },   // Bottom Segment Large Union
593   { "650", "EFC6", },   // Top Segment Large Intersection
594   { "651", "EFC5", },   // Top Segment Left Double Bracket
595   { "652", "EFC4", },   // Bottom Segment Left Double Bracket
596   { "653", "EFFC", },   // Large Open Square Box
597   { "654", "25C7", },   // Open Diamond
598   { "655", "256E", },   // Box Draw Right Top Round Corner
599   { "656", "256F", },   // Box Draw Right Bottom Round Corner
600   { "657", "EFC3", },   // Bottom Segment Large Bottom Product
601   { "658", "EFC2", },   // Top Segment Large Top Product
602   { "659", "EFC1", },   // Top Segment Right Double Bracket
603   { "660", "EFC0", },   // Bottom Segment Right Double Bracket
604   { "661", "EFFB", },   // Large Solid Square Box
605   { "662", "25C6", },   // Solid Diamond
606   { "663", "220D", },   // Such That Symbol (rotated lc epsilon)
607   { "664", "2217", },   // Math Asterisk
608   { "665", "23AF", },   // Horizontal Arrow Extender (Horizontal Line Extension)
609   { "666", "EFCB", },   // Double Horizontal Arrow Extender
610   { "667", "EFCC", },   // Inverted Complement of 0xEFCF or MSL 617
611   { "668", "221F", },   // Right Angle Symbol
612   { "669", "220F", },   // Product Symbol (large Pi)
613   { "684", "25CA", },   // Lozenge, Diamond
614   { "1000", "2070", },  // Superior Numeral 0
615   { "1001", "2074", },  // Superior Numeral 4
616   { "1002", "2075", },  // Superior Numeral 5
617   { "1003", "2076", },  // Superior Numeral 6
618   { "1004", "2077", },  // Superior Numeral 7
619   { "1005", "2078", },  // Superior Numeral 8
620   { "1006", "2079", },  // Superior Numeral 9
621   { "1017", "201C", },  // Double Open Quote (6)
622   { "1018", "201D", },  // Double Close Quote (9)
623   { "1019", "201E", },  // Double Baseline Quote (9)
624   { "1020", "2003", },  // Em Space
625   { "1021", "2002", },  // En Space
626   { "1023", "2009", },  // Thin Space
627   { "1028", "2026", },  // Ellipsis
628   { "1030", "EFF1", },  // Uppercase Ogonek (Spacing)
629   { "1031", "017E", },  // Lowercase Z Hacek
630   { "1034", "2120", },  // Service Mark
631   { "1036", "211E", },  // Prescription Sign
632 //{ "1040", "F001", },  // Lowercase FI Ligature
633   { "1040", "FB01", },  // Lowercase FI Ligature
634 //{ "1041", "F002", },  // Lowercase FL Ligature
635   { "1041", "FB02", },  // Lowercase FL Ligature
636   { "1042", "FB00", },  // Lowercase FF Ligature
637   { "1043", "FB03", },  // Lowercase FFI Ligature
638   { "1044", "FB04", },  // Lowercase FFL Ligature
639   { "1045", "EFF0", },  // Uppercase Double Acute Accent (Spacing)
640   { "1047", "0133", },  // Lowercase IJ Ligature
641   { "1060", "2105", },  // Care Of Symbol
642   { "1061", "011E", },  // Uppercase G Breve
643   { "1062", "011F", },  // Lowercase G Breve
644   { "1063", "015E", },  // Uppercase S Cedilla
645   { "1064", "015F", },  // Lowercase S Cedilla
646   { "1065", "0130", },  // Uppercase I Overdot
647   { "1067", "201A", },  // Single Baseline Quote (9)
648   { "1068", "2030", },  // Per Mill Sign
649   { "1069", "20AC", },  // Euro
650   { "1084", "02C9", },  // Lowercase Macron Accent (Spacing)
651   { "1086", "02D8", },  // Lowercase Breve Accent (Spacing)
652   { "1088", "02D9", },  // Lowercase Overdot Accent (Spacing)
653   { "1090", "0153", },  // Lowercase OE Ligature
654   { "1091", "0152", },  // Uppercase OE Ligature
655   { "1092", "2039", },  // Left Pointing Single Angle Quote
656   { "1093", "203A", },  // Right Pointing Single Angle Quote
657   { "1094", "25A1", },  // Medium Open Square Box
658   { "1095", "0141", },  // Uppercase L-Stroke
659   { "1096", "0142", },  // Lowercase L-Stroke
660   { "1097", "02DD", },  // Lowercase Double Acute Accent (Spacing)
661   { "1098", "02DB", },  // Lowercase Ogonek (Spacing)
662   { "1099", "21B5", },  // Carriage Return Symbol
663   { "1100", "EFDB", },  // Full Size Serif Registered
664   { "1101", "EFDA", },  // Full Size Serif Copyright
665   { "1102", "EFD9", },  // Full Size Serif Trademark
666   { "1103", "EFD8", },  // Full Size Sans Registered
667   { "1104", "EFD7", },  // Full Size Sans Copyright
668   { "1105", "EFD6", },  // Full Size Sans Trademark
669   { "1106", "017D", },  // Uppercase Z Hacek
670   { "1107", "0132", },  // Uppercase IJ Ligature
671   { "1108", "25AB", },  // Small Open Square Box
672   { "1109", "25E6", },  // Small Open Round Bullet
673   { "1110", "25CB", },  // Medium Open Round Bullet
674   { "1111", "EFFA", },  // Large Solid Round Bullet
675   { "3812", "F000", },  // Ornament, Apple
676 };
677
678 // global constructor
679 static struct hp_msl_to_unicode_init {
680   hp_msl_to_unicode_init();
681 } _hp_msl_to_unicode_init;
682
683 hp_msl_to_unicode_init::hp_msl_to_unicode_init() {
684   for (unsigned int i = 0;
685        i < sizeof(hp_msl_to_unicode_list)/sizeof(hp_msl_to_unicode_list[0]);
686        i++) {
687     hp_msl_to_unicode *ptu = new hp_msl_to_unicode[1];
688     ptu->value = (char *)hp_msl_to_unicode_list[i].value;
689     hp_msl_to_unicode_table.define(hp_msl_to_unicode_list[i].key, ptu);
690   }
691 }
692
693 const char *hp_msl_to_unicode_code(const char *s)
694 {
695   hp_msl_to_unicode *result = hp_msl_to_unicode_table.lookup(s);
696   return result ? result->value : 0;
697 }