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