| 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 | |