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