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