Home | History | Annotate | Line # | Download | only in ic
      1 /* $NetBSD: pcdisplay_chars.c,v 1.16 2010/02/25 11:20:10 drochner Exp $ */
      2 
      3 /*
      4  * Copyright (c) 1998
      5  *	Matthias Drochner.  All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  *
     27  */
     28 
     29 #include <sys/cdefs.h>
     30 __KERNEL_RCSID(0, "$NetBSD: pcdisplay_chars.c,v 1.16 2010/02/25 11:20:10 drochner Exp $");
     31 
     32 #include <sys/param.h>
     33 #include <sys/systm.h>
     34 #include <sys/device.h>
     35 #include <sys/bus.h>
     36 
     37 #include <dev/ic/mc6845reg.h>
     38 #include <dev/ic/pcdisplayvar.h>
     39 
     40 #include <dev/wscons/unicode.h>
     41 
     42 #define CONTROL 1 /* XXX smiley */
     43 #define NOTPRINTABLE 4 /* diamond XXX watch out - not in ISO part! */
     44 
     45 static const u_char isomappings[128] = {
     46 	CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL,
     47 	CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL,
     48 	CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL,
     49 	CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL, CONTROL,
     50 	0xff, /* 0x00a0 NO-BREAK SPACE */
     51 	0xad, /* 0x00a1 INVERTED EXCLAMATION MARK */
     52 	0x9b, /* 0x00a2 CENT SIGN */
     53 	0x9c, /* 0x00a3 POUND SIGN */
     54 	NOTPRINTABLE, /* 0x00a4 CURRENCY SIGN */
     55 	0x9d, /* 0x00a5 YEN SIGN */
     56 	0x7c, /* 0x00a6 BROKEN BAR */
     57 	0x15, /* 0x00a7 SECTION SIGN */
     58 	NOTPRINTABLE, /* 0x00a8 DIAERESIS */
     59 	NOTPRINTABLE, /* 0x00a9 COPYRIGHT SIGN */
     60 	0xa6, /* 0x00aa FEMININE ORDINAL INDICATOR */
     61 	0xae, /* 0x00ab LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
     62 	0xaa, /* 0x00ac NOT SIGN */
     63 	0xc4, /* 0x00ad SOFT HYPHEN */
     64 	NOTPRINTABLE, /* 0x00ae REGISTERED SIGN */
     65 	NOTPRINTABLE, /* 0x00af MACRON */
     66 	0xf8, /* 0x00b0 DEGREE SIGN */
     67 	0xf1, /* 0x00b1 PLUS-MINUS SIGN */
     68 	0xfd, /* 0x00b2 SUPERSCRIPT TWO */
     69 	NOTPRINTABLE, /* 0x00b3 SUPERSCRIPT THREE */
     70 	0x27, /* 0x00b4 ACUTE ACCENT */
     71 	0xe6, /* 0x00b5 MICRO SIGN */
     72 	0x14, /* 0x00b6 PILCROW SIGN */
     73 	0xfa, /* 0x00b7 MIDDLE DOT */
     74 	NOTPRINTABLE, /* 0x00b8 CEDILLA */
     75 	NOTPRINTABLE, /* 0x00b9 SUPERSCRIPT ONE */
     76 	0xa7, /* 0x00ba MASCULINE ORDINAL INDICATOR */
     77 	0xaf, /* 0x00bb RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
     78 	0xac, /* 0x00bc VULGAR FRACTION ONE QUARTER */
     79 	0xab, /* 0x00bd VULGAR FRACTION ONE HALF */
     80 	NOTPRINTABLE, /* 0x00be VULGAR FRACTION THREE QUARTERS */
     81 	0xa8, /* 0x00bf INVERTED QUESTION MARK */
     82 	NOTPRINTABLE, /* 0x00c0 LATIN CAPITAL LETTER A WITH GRAVE */
     83 	NOTPRINTABLE, /* 0x00c1 LATIN CAPITAL LETTER A WITH ACUTE */
     84 	NOTPRINTABLE, /* 0x00c2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
     85 	NOTPRINTABLE, /* 0x00c3 LATIN CAPITAL LETTER A WITH TILDE */
     86 	0x8e, /* 0x00c4 LATIN CAPITAL LETTER A WITH DIAERESIS */
     87 	0x8f, /* 0x00c5 LATIN CAPITAL LETTER A WITH RING ABOVE */
     88 	0x92, /* 0x00c6 LATIN CAPITAL LIGATURE AE */
     89 	0x80, /* 0x00c7 LATIN CAPITAL LETTER C WITH CEDILLA */
     90 	NOTPRINTABLE, /* 0x00c8 LATIN CAPITAL LETTER E WITH GRAVE */
     91 	0x90, /* 0x00c9 LATIN CAPITAL LETTER E WITH ACUTE */
     92 	NOTPRINTABLE, /* 0x00ca LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
     93 	NOTPRINTABLE, /* 0x00cb LATIN CAPITAL LETTER E WITH DIAERESIS */
     94 	NOTPRINTABLE, /* 0x00cc LATIN CAPITAL LETTER I WITH GRAVE */
     95 	NOTPRINTABLE, /* 0x00cd LATIN CAPITAL LETTER I WITH ACUTE */
     96 	NOTPRINTABLE, /* 0x00ce LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
     97 	NOTPRINTABLE, /* 0x00cf LATIN CAPITAL LETTER I WITH DIAERESIS */
     98 	NOTPRINTABLE, /* 0x00d0 LATIN CAPITAL LETTER ETH */
     99 	0xa5, /* 0x00d1 LATIN CAPITAL LETTER N WITH TILDE */
    100 	NOTPRINTABLE, /* 0x00d2 LATIN CAPITAL LETTER O WITH GRAVE */
    101 	NOTPRINTABLE, /* 0x00d3 LATIN CAPITAL LETTER O WITH ACUTE */
    102 	NOTPRINTABLE, /* 0x00d4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
    103 	NOTPRINTABLE, /* 0x00d5 LATIN CAPITAL LETTER O WITH TILDE */
    104 	0x99, /* 0x00d6 LATIN CAPITAL LETTER O WITH DIAERESIS */
    105 	NOTPRINTABLE, /* 0x00d7 MULTIPLICATION SIGN */
    106 	NOTPRINTABLE, /* 0x00d8 LATIN CAPITAL LETTER O WITH STROKE */
    107 	NOTPRINTABLE, /* 0x00d9 LATIN CAPITAL LETTER U WITH GRAVE */
    108 	NOTPRINTABLE, /* 0x00da LATIN CAPITAL LETTER U WITH ACUTE */
    109 	NOTPRINTABLE, /* 0x00db LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
    110 	0x9a, /* 0x00dc LATIN CAPITAL LETTER U WITH DIAERESIS */
    111 	NOTPRINTABLE, /* 0x00dd LATIN CAPITAL LETTER Y WITH ACUTE */
    112 	NOTPRINTABLE, /* 0x00de LATIN CAPITAL LETTER THORN */
    113 	0xe1, /* 0x00df LATIN SMALL LETTER SHARP S */
    114 	0x85, /* 0x00e0 LATIN SMALL LETTER A WITH GRAVE */
    115 	0xa0, /* 0x00e1 LATIN SMALL LETTER A WITH ACUTE */
    116 	0x83, /* 0x00e2 LATIN SMALL LETTER A WITH CIRCUMFLEX */
    117 	NOTPRINTABLE, /* 0x00e3 LATIN SMALL LETTER A WITH TILDE */
    118 	0x84, /* 0x00e4 LATIN SMALL LETTER A WITH DIAERESIS */
    119 	0x86, /* 0x00e5 LATIN SMALL LETTER A WITH RING ABOVE */
    120 	0x91, /* 0x00e6 LATIN SMALL LIGATURE AE */
    121 	0x87, /* 0x00e7 LATIN SMALL LETTER C WITH CEDILLA */
    122 	0x8a, /* 0x00e8 LATIN SMALL LETTER E WITH GRAVE */
    123 	0x82, /* 0x00e9 LATIN SMALL LETTER E WITH ACUTE */
    124 	0x88, /* 0x00ea LATIN SMALL LETTER E WITH CIRCUMFLEX */
    125 	0x89, /* 0x00eb LATIN SMALL LETTER E WITH DIAERESIS */
    126 	0x8d, /* 0x00ec LATIN SMALL LETTER I WITH GRAVE */
    127 	0xa1, /* 0x00ed LATIN SMALL LETTER I WITH ACUTE */
    128 	0x8c, /* 0x00ee LATIN SMALL LETTER I WITH CIRCUMFLEX */
    129 	0x8b, /* 0x00ef LATIN SMALL LETTER I WITH DIAERESIS */
    130 	NOTPRINTABLE, /* 0x00f0 LATIN SMALL LETTER ETH */
    131 	0xa4, /* 0x00f1 LATIN SMALL LETTER N WITH TILDE */
    132 	0x95, /* 0x00f2 LATIN SMALL LETTER O WITH GRAVE */
    133 	0xa2, /* 0x00f3 LATIN SMALL LETTER O WITH ACUTE */
    134 	0x93, /* 0x00f4 LATIN SMALL LETTER O WITH CIRCUMFLEX */
    135 	NOTPRINTABLE, /* 0x00f5 LATIN SMALL LETTER O WITH TILDE */
    136 	0x94, /* 0x00f6 LATIN SMALL LETTER O WITH DIAERESIS */
    137 	0xf6, /* 0x00f7 DIVISION SIGN */
    138 	NOTPRINTABLE, /* 0x00f8 LATIN SMALL LETTER O WITH STROKE */
    139 	0x97, /* 0x00f9 LATIN SMALL LETTER U WITH GRAVE */
    140 	0xa3, /* 0x00fa LATIN SMALL LETTER U WITH ACUTE */
    141 	0x96, /* 0x00fb LATIN SMALL LETTER U WITH CIRCUMFLEX */
    142 	0x81, /* 0x00fc LATIN SMALL LETTER U WITH DIAERESIS */
    143 	NOTPRINTABLE, /* 0x00fd LATIN SMALL LETTER Y WITH ACUTE */
    144 	NOTPRINTABLE, /* 0x00fe LATIN SMALL LETTER THORN */
    145 	0x98, /* 0x00ff LATIN SMALL LETTER Y WITH DIAERESIS */
    146 };
    147 
    148 static const struct {
    149 	u_int16_t uni;
    150 	u_char ibm;
    151 } unimappings[] = {
    152 	{0x0192, 0x9f}, /* LATIN SMALL LETTER F WITH HOOK */
    153 	{0x0393, 0xe2}, /* GREEK CAPITAL LETTER GAMMA */
    154 	{0x0398, 0xe9}, /* GREEK CAPITAL LETTER THETA */
    155 	{0x03a3, 0xe4}, /* GREEK CAPITAL LETTER SIGMA */
    156 	{0x03a6, 0xe8}, /* GREEK CAPITAL LETTER PHI */
    157 	{0x03a9, 0xea}, /* GREEK CAPITAL LETTER OMEGA */
    158 	{0x03b1, 0xe0}, /* GREEK SMALL LETTER ALPHA */
    159 	{0x03b2, 0xe1}, /* GREEK SMALL LETTER BETA */
    160 	{0x03b4, 0xeb}, /* GREEK SMALL LETTER DELTA */
    161 	{0x03b5, 0xee}, /* GREEK SMALL LETTER EPSILON */
    162 	{0x03c0, 0xe3}, /* GREEK SMALL LETTER PI */
    163 	{0x03c3, 0xe5}, /* GREEK SMALL LETTER SIGMA */
    164 	{0x03c4, 0xe7}, /* GREEK SMALL LETTER TAU */
    165 	{0x03c6, 0xed}, /* GREEK SMALL LETTER PHI */
    166 	{0x2022, 0x07}, /* BULLET */
    167 	{0x203c, 0x13}, /* DOUBLE EXCLAMATION MARK */
    168 	{0x207f, 0xfc}, /* SUPERSCRIPT LATIN SMALL LETTER N */
    169 	{0x20a7, 0x9e}, /* PESETA SIGN */
    170 	{0x2190, 0x1b}, /* LEFTWARDS ARROW */
    171 	{0x2191, 0x18}, /* UPWARDS ARROW */
    172 	{0x2192, 0x1a}, /* RIGHTWARDS ARROW */
    173 	{0x2193, 0x19}, /* DOWNWARDS ARROW */
    174 	{0x2194, 0x1d}, /* LEFT RIGHT ARROW */
    175 	{0x2195, 0x12}, /* UP DOWN ARROW */
    176 	{0x21a8, 0x17}, /* UP DOWN ARROW WITH BASE */
    177 	{0x2212, 0x2d}, /* MINUS SIGN XXX move to more general place */
    178 	{0x2215, 0x2f}, /* DIVISION SLASH XXX move to more general place */
    179 	{0x2219, 0xf9}, /* BULLET OPERATOR */
    180 	{0x221a, 0xfb}, /* SQUARE ROOT */
    181 	{0x221e, 0xec}, /* INFINITY */
    182 	{0x2229, 0xef}, /* INTERSECTION */
    183 	{0x2248, 0xf7}, /* ALMOST EQUAL TO */
    184 	{0x2261, 0xf0}, /* IDENTICAL TO */
    185 	{0x2264, 0xf3}, /* LESS-THAN OR EQUAL TO */
    186 	{0x2265, 0xf2}, /* GREATER-THAN OR EQUAL TO */
    187 	{0x2302, 0x7f}, /* HOUSE */
    188 	{0x2310, 0xa9}, /* REVERSED NOT SIGN */
    189 	{0x2320, 0xf4}, /* TOP HALF INTEGRAL */
    190 	{0x2321, 0xf5}, /* BOTTOM HALF INTEGRAL */
    191 	{0x2500, 0xc4}, /* BOX DRAWINGS LIGHT HORIZONTAL */
    192 	{0x2502, 0xb3}, /* BOX DRAWINGS LIGHT VERTICAL */
    193 	{0x250c, 0xda}, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
    194 	{0x2510, 0xbf}, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
    195 	{0x2514, 0xc0}, /* BOX DRAWINGS LIGHT UP AND RIGHT */
    196 	{0x2518, 0xd9}, /* BOX DRAWINGS LIGHT UP AND LEFT */
    197 	{0x251c, 0xc3}, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
    198 	{0x2524, 0xb4}, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
    199 	{0x252c, 0xc2}, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
    200 	{0x2534, 0xc1}, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
    201 	{0x253c, 0xc5}, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
    202 	{0x2550, 0xcd}, /* BOX DRAWINGS DOUBLE HORIZONTAL */
    203 	{0x2551, 0xba}, /* BOX DRAWINGS DOUBLE VERTICAL */
    204 	{0x2552, 0xd5}, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */
    205 	{0x2553, 0xd6}, /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE */
    206 	{0x2554, 0xc9}, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */
    207 	{0x2555, 0xb8}, /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE */
    208 	{0x2556, 0xb7}, /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE */
    209 	{0x2557, 0xbb}, /* BOW DRAWINGS DOUBLE DOWN AND LEFT */
    210 	{0x2558, 0xd4}, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */
    211 	{0x2559, 0xd3}, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */
    212 	{0x255a, 0xc8}, /* BOX DRAWINGS DOUBLE UP AND RIGHT */
    213 	{0x255b, 0xbe}, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */
    214 	{0x255c, 0xbd}, /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE */
    215 	{0x255d, 0xbc}, /* BOX DRAWINGS DOUBLE UP AND LEFT */
    216 	{0x255e, 0xc6}, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */
    217 	{0x255f, 0xc7}, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */
    218 	{0x2560, 0xcc}, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */
    219 	{0x2561, 0xb4}, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */
    220 	{0x2562, 0xb5}, /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE */
    221 	{0x2563, 0xb9}, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */
    222 	{0x2564, 0xd1}, /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE */
    223 	{0x2565, 0xd2}, /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE */
    224 	{0x2566, 0xcb}, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */
    225 	{0x2567, 0xcf}, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */
    226 	{0x2568, 0xd0}, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */
    227 	{0x2569, 0xca}, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */
    228 	{0x256a, 0xd8}, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE */
    229 	{0x256b, 0xd7}, /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE */
    230 	{0x256c, 0xce}, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */
    231 	{0x2580, 0xdf}, /* UPPER HALF BLOCK */
    232 	{0x2584, 0xdc}, /* LOWER HALF BLOCK */
    233 	{0x2588, 0xdb}, /* FULL BLOCK */
    234 	{0x258c, 0xdd}, /* LEFT HALF BLOCK */
    235 	{0x2590, 0xde}, /* RIGHT HALF BLOCK */
    236 	{0x2591, 0xb0}, /* LIGHT SHADE */
    237 	{0x2592, 0xb1}, /* MEDIUM SHADE */
    238 	{0x2593, 0xb2}, /* DARK SHADE */
    239 	{0x25a0, 0xfe}, /* BLACK SQUARE */
    240 	{0x25ac, 0x16}, /* BLACK RECTANGLE */
    241 	{0x25b2, 0x1e}, /* BLACK UP-POINTING TRIANGLE */
    242 	{0x25ba, 0x10}, /* BLACK RIGHT-POINTING POINTER */
    243 	{0x25bc, 0x1f}, /* BLACK DOWN-POINTING TRIANGLE */
    244 	{0x25c4, 0x11}, /* BLACK LEFT-POINTING POINTER */
    245 	{0x25c6, 0x04}, /* BLACK DIAMOND */
    246 	{0x25cb, 0x09}, /* WHITE CIRCLE */
    247 	{0x25d8, 0x08}, /* INVERSE BULLET */
    248 	{0x25d9, 0x0a}, /* INVERSE WHITE CIRCLE */
    249 	{0x263a, 0x01}, /* WHITE SMILING FACE */
    250 	{0x263b, 0x02}, /* BLACK SMILING FACE */
    251 	{0x263c, 0x0f}, /* WHITE SUN WITH RAYS */
    252 	{0x2640, 0x0c}, /* FEMALE SIGN */
    253 	{0x2642, 0x0b}, /* MALE SIGN */
    254 	{0x2660, 0x06}, /* BLACK SPADE SUIT */
    255 	{0x2663, 0x05}, /* BLACK CLUB SUIT */
    256 	{0x2665, 0x03}, /* BLACK HEART SUIT */
    257 	{0x2666, 0x04}, /* BLACK DIAMOND SUIT */
    258 	{0x266a, 0x0d}, /* EIGHTH NOTE */
    259 	{0x266b, 0x0e}, /* BEAMED EIGHTH NOTES */
    260 };
    261 
    262 static const struct {
    263 	u_int16_t uni;
    264 	u_char ibm;
    265 	int quality;
    266 } replacements[] = {
    267 	{0x00af, 0x2d, 3}, /* MACRON -> - */
    268 	{0x2010, 0x2d, 3}, /* HYPHEN -> - */
    269 	{0x2013, 0x2d, 3}, /* EN DASH -> - */
    270 	{0x2014, 0x2d, 3}, /* EM DASH -> - */
    271 	{0x2018, 0x60, 3}, /* LEFT SINGLE QUOTATION MARK -> ` */
    272 	{0x2019, 0x27, 3}, /* RIGHT SINGLE QUOTATION MARK -> ' */
    273 	{0x201A, 0x2c, 3}, /* SINGLE LOW QUOTATION MARK -> , */
    274 	{0x201c, 0x22, 3}, /* LEFT DOUBLE QUOTATION MARK -> " */
    275 	{0x201d, 0x22, 3}, /* RIGHT DOUBLE QUOTATION MARK -> " */
    276 	{0x2039, 0x3c, 3}, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK -> < */
    277 	{0x203a, 0x3e, 3}, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -> > */
    278 	{0x221f, 0xc0, 3}, /* RIGHT ANGLE -> light up and right */
    279 	{0x222a, 0x55, 3}, /* UNION -> U */
    280 	{0x223c, 0x7e, 3}, /* TILDE OPERATOR -> ~ */
    281 	{0x2308, 0xda, 3}, /* LEFT CEILING -> light down and right */
    282 	{0x2309, 0xbf, 3}, /* RIGHT CEILING -> light down and left */
    283 	{0x230a, 0xc0, 3}, /* LEFT FLOOR -> light up and right */
    284 	{0x230b, 0xd9, 3}, /* RIGHT FLOOR -> light up and left */
    285 	{0x2329, 0x3c, 3}, /* LEFT-POINTING ANGLE BRACKET -> < */
    286 	{0x232a, 0x3e, 3}, /* RIGHT-POINTING ANGLE BRACKET -> > */
    287 	{0x23bd, 0x5f, 3}, /* scan 9 -> _ */
    288 	{_e00bU, 0x7b, 3}, /* braceleftmid -> { */
    289 	{_e00cU, 0x7d, 3}, /* bracerightmid -> } */
    290 	{_e00fU, 0xd9, 3}, /* mirrored not sign? -> light up and left */
    291 	{0x00d7, 0x78, 2}, /* MULTIPLICATION SIGN -> x */
    292 	{0x00d8, 0xe9, 2}, /* LATIN CAPITAL LETTER O WITH STROKE -> Theta */
    293 	{0x00f8, 0xed, 2}, /* LATIN SMALL LETTER O WITH STROKE -> phi */
    294 	{0x03a0, 0xe3, 2}, /* GREEK CAPITAL LETTER PI -> pi */
    295 	{0x03a5, 0x59, 2}, /* GREEK CAPITAL LETTER UPSILON -> Y */
    296 	{0x03b3, 0x59, 2}, /* GREEK SMALL LETTER GAMMA -> Y */
    297 	{0x03b8, 0xe9, 2}, /* GREEK SMALL LETTER THETA -> Theta */
    298 	{0x03bd, 0x76, 2}, /* GREEK SMALL LETTER NU -> v */
    299 	{0x03c9, 0x77, 2}, /* GREEK SMALL LETTER OMEGA -> w */
    300 	{0x20ac, 0x45, 2}, /* EURO SIGN -> E */
    301 	{0x23bb, 0x2d, 2}, /* scan 3 -> - */
    302 	{0x23bc, 0x2d, 2}, /* scan 7 -> - */
    303 	{0x25cf, 0xf9, 2}, /* BLACK CIRCLE */
    304 	{_e007U, 0xda, 2}, /* bracelefttp -> light down and right */
    305 	{_e008U, 0xc0, 2}, /* braceleftbt -> light up and right */
    306 	{_e009U, 0xbf, 2}, /* bracerighttp -> light down and left */
    307 	{_e00aU, 0xd9, 2}, /* bracerighrbt -> light up and left */
    308 	{_e00dU, 0x3c, 2}, /* inverted angle? -> < */
    309 	{_e00eU, 0x3c, 2}, /* angle? -> < */
    310 	{_e00fU, 0xd9, 2}, /* mirrored not sign? -> light up and left */
    311 	{0x00a9, 0x63, 1}, /* COPYRIGHT SIGN -> c */
    312 	{0x00ae, 0x72, 1}, /* REGISTERED SIGN -> r */
    313 	{0x00b3, 0x33, 1}, /* SUPERSCRIPT THREE -> 3 */
    314 	{0x00b9, 0x39, 1}, /* SUPERSCRIPT ONE -> 1 */
    315 	{0x00c0, 0x41, 1}, /* LATIN CAPITAL LETTER A WITH GRAVE -> A */
    316 	{0x00c1, 0x41, 1}, /* LATIN CAPITAL LETTER A WITH ACUTE -> A */
    317 	{0x00c2, 0x41, 1}, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX -> A */
    318 	{0x00c3, 0x41, 1}, /* LATIN CAPITAL LETTER A WITH TILDE -> A */
    319 	{0x00c8, 0x45, 1}, /* LATIN CAPITAL LETTER E WITH GRAVE -> E */
    320 	{0x00ca, 0x45, 1}, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX -> E */
    321 	{0x00cb, 0x45, 1}, /* LATIN CAPITAL LETTER E WITH DIAERESIS -> E */
    322 	{0x00cc, 0x49, 1}, /* LATIN CAPITAL LETTER I WITH GRAVE -> I */
    323 	{0x00cd, 0x49, 1}, /* LATIN CAPITAL LETTER I WITH ACUTE -> I */
    324 	{0x00ce, 0x49, 1}, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX -> I */
    325 	{0x00cf, 0x49, 1}, /* LATIN CAPITAL LETTER I WITH DIAERESIS -> I */
    326 	{0x00d0, 0x44, 1}, /* LATIN CAPITAL LETTER ETH -> D */
    327 	{0x00d2, 0x4f, 1}, /* LATIN CAPITAL LETTER O WITH GRAVE -> O */
    328 	{0x00d3, 0x4f, 1}, /* LATIN CAPITAL LETTER O WITH ACUTE -> O */
    329 	{0x00d4, 0x4f, 1}, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX -> O */
    330 	{0x00d5, 0x4f, 1}, /* LATIN CAPITAL LETTER O WITH TILDE -> O */
    331 	{0x00d9, 0x55, 1}, /* LATIN CAPITAL LETTER U WITH GRAVE -> U */
    332 	{0x00da, 0x55, 1}, /* LATIN CAPITAL LETTER U WITH ACUTE -> U */
    333 	{0x00db, 0x55, 1}, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX -> U */
    334 	{0x00dd, 0x59, 1}, /* LATIN CAPITAL LETTER Y WITH ACUTE -> Y */
    335 	{0x00e3, 0x61, 1}, /* LATIN SMALL LETTER A WITH TILDE -> a */
    336 	{0x00f5, 0x6f, 1}, /* LATIN SMALL LETTER O WITH TILDE -> o */
    337 	{0x00fd, 0x79, 1}, /* LATIN SMALL LETTER Y WITH ACUTE -> y */
    338 	{0x010c, 0x43, 1}, /* LATIN CAPITAL LETTER C WITH CARON -> C */
    339 	{0x010d, 0x63, 1}, /* LATIN SMALL LETTER C WITH CARON -> c */
    340 	{0x011a, 0x45, 1}, /* LATIN CAPITAL LETTER A WITH CARON -> A */
    341 	{0x011b, 0x65, 1}, /* LATIN SMALL LETTER A WITH CARON -> a */
    342 	{0x013d, 0x4c, 1}, /* LATIN CAPITAL LETTER L WITH CARON -> L */
    343 	{0x013e, 0x6c, 1}, /* LATIN SMALL LETTER L WITH CARON -> l */
    344 	{0x0147, 0x4e, 1}, /* LATIN CAPITAL LETTER N WITH CARON -> N */
    345 	{0x0148, 0x6e, 1}, /* LATIN SMALL LETTER N WITH CARON -> n */
    346 	{0x0150, 0x99, 1}, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
    347 	{0x0151, 0x94, 1}, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */
    348 	{0x0158, 0x52, 1}, /* LATIN CAPITAL LETTER R WITH CARON -> R */
    349 	{0x0159, 0x72, 1}, /* LATIN SMALL LETTER R WITH CARON -> r */
    350 	{0x0160, 0x53, 1}, /* LATIN CAPITAL LETTER S WITH CARON -> S */
    351 	{0x0161, 0x73, 1}, /* LATIN SMALLLETTER S WITH CARON -> s */
    352 	{0x0164, 0x54, 1}, /* LATIN CAPITAL LETTER T WITH CARON -> T */
    353 	{0x0165, 0x74, 1}, /* LATIN SMALL LETTER T WITH CARON -> t */
    354 	{0x016c, 0x55, 1}, /* LATIN CAPITAL LETTER U WITH BREVE -> U */
    355 	{0x016d, 0x75, 1}, /* LATIN SMALL LETTER U WITH BREVE -> u */
    356 	{0x016e, 0x55, 1}, /* LATIN CAPITAL LETTER U WITH RING ABOVE -> U */
    357 	{0x016f, 0x75, 1}, /* LATIN SMALL LETTER U WITH RING ABOVE -> u */
    358 	{0x0170, 0x9a, 1}, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
    359 	{0x0171, 0x81, 1}, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */
    360 	{0x017d, 0x5a, 1}, /* LATIN CAPITAL LETTER Z WITH CARON -> Z */
    361 	{0x017e, 0x7a, 1}, /* LATIN SMALL LETTER Z WITH CARON -> z */
    362 	{0x201e, 0x22, 1}, /* DOUBLE LOW QUOTATION MARK -> " */
    363 	{0x2026, 0x5f, 1}, /* HORIZONTAL ELLIPSIS -> _ */
    364 	{0x25a1, 0xfe, 1}, /* WHITE SQUARE */
    365 	{0x2606, 0x2a, 1}, /* WHITE STAR -> * */
    366 };
    367 
    368 int
    369 pcdisplay_mapchar(void *id, int uni, unsigned int *index)
    370 {
    371 	u_int i;
    372 
    373 	if (uni < 128) {
    374 		*index = uni;
    375 		return (5);
    376 	} else if ((uni < 256) && (isomappings[uni - 128] != NOTPRINTABLE)) {
    377 		*index = isomappings[uni - 128];
    378 		return (5);
    379 	}
    380 
    381 	for (i = 0; i < sizeof(unimappings) / sizeof(unimappings[0]); i++)
    382 		if (uni == unimappings[i].uni) {
    383 			*index = unimappings[i].ibm;
    384 			return (5);
    385 		}
    386 
    387 	for (i = 0; i < sizeof(replacements) / sizeof(replacements[0]); i++)
    388 		if (uni == replacements[i].uni) {
    389 			*index = replacements[i].ibm;
    390 			return (replacements[i].quality);
    391 		}
    392 
    393 	*index = NOTPRINTABLE;
    394 	return (0);
    395 }
    396