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