1 /* $XTermId: charsets.c,v 1.113 2020/12/25 15:15:37 tom Exp $ */
2 
3 /*
4  * Copyright 1998-2019,2020 by Thomas E. Dickey
5  *
6  *                         All Rights Reserved
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the
10  * "Software"), to deal in the Software without restriction, including
11  * without limitation the rights to use, copy, modify, merge, publish,
12  * distribute, sublicense, and/or sell copies of the Software, and to
13  * permit persons to whom the Software is furnished to do so, subject to
14  * the following conditions:
15  *
16  * The above copyright notice and this permission notice shall be included
17  * in all copies or substantial portions of the Software.
18  *
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22  * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
23  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  *
27  * Except as contained in this notice, the name(s) of the above copyright
28  * holders shall not be used in advertising or otherwise to promote the
29  * sale, use or other dealings in this Software without prior written
30  * authorization.
31  *
32  */
33 
34 #include <xterm.h>
35 #include <data.h>
36 #include <fontutils.h>
37 
38 #include <X11/keysym.h>
39 
40 #define BLANK ' '
41 #define UNDEF 0x2e2e		/* rendered as a backwards "?" (alt: 0x2426) */
42 
43 /*
44  * This module performs translation as needed to support the DEC VT220 national
45  * replacement character sets as well as supplementary character sets (aka
46  * code-pages) introduced in VT320, etc.
47  *
48  * We assume that xterm's font is based on the ISO 8859-1 (Latin 1) character
49  * set, which is almost the same as the DEC multinational character set.  Glyph
50  * positions 0-31 have to be the DEC graphic characters, though.
51  *
52  * References:
53  *	"VT220 Programmer Pocket Guide" EK-VT220-HR-002 (2nd ed., 1984), which
54  *		contains character charts for the national character sets.
55  *	"VT330/VT340 Programmer Reference Manual Volume 1: Text Programming"
56  *		EK-VT3XX-TP-001 (1st ed, 1987), which contains a table (2-1)
57  *		listing the glyphs which are mapped from the multinational
58  *		character set to the national character set.
59  *
60  * The latter reference, though easier to read, has a few errors and omissions.
61  *
62  * According to
63  *  Digital ANSI-Compliant Printing Protocol
64  *  Level 2 Programming Reference Manual
65  *  EK–PPLV2–PM. B01
66  *
67  * the supplementary character sets Greek, Hebrew, Latin-5 and Latin/Cyrillic
68  * are standardized by ISO:
69  *  ISO Greek is 8859-7
70  *  ISO Hebrew is 8859-8
71  *  ISO Latin-5 is 8859-9
72  *  ISO Latin/Cyrillic is 8859-5
73  *
74  * These are derived from the data at
75  *  ftp://www.unicode.org/Public/MAPPINGS/ISO8859/
76  *
77  * Note: the "figure A-xx" comments refer to EK–PPLV2–PM.
78  */
79 
80 /*
81  * A "codepage" is treated different from the NRC mode:  it is always enabled.
82  * Reuse the UNI() macros by temporarily setting its state.
83  */
84 #if OPT_WIDE_CHARS
85 #define begin_CODEPAGE() \
86 	if (!(xw->flags & NATIONAL)) { \
87 	    screen->utf8_nrc_mode++; \
88 	}
89 #define end_CODEPAGE() \
90 	if (!(xw->flags & NATIONAL)) { \
91 	    screen->utf8_nrc_mode--; \
92 	}
93 #else
94 #define begin_CODEPAGE()	/* nothing */
95 #define end_CODEPAGE()		/* nothing */
96 #endif
97 
98 /*
99  * xterm's original implementation of NRCS in 1998 was before Unicode became
100  * prevalent.  Most of the necessary mappings could be done using definitions
101  * from X11/keysymdef.h
102  */
103 #define map_NRCS_Dutch(code) \
104 	switch (code) { \
105 	    MAP(0x23, XK_sterling); \
106 	    MAP(0x40, XK_threequarters); \
107 	    UNI(0x5b, 0x0133); /* ij ligature */ \
108 	    MAP(0x5c, XK_onehalf); \
109 	    MAP(0x5d, XK_bar); \
110 	    MAP(0x7b, XK_diaeresis); \
111 	    UNI(0x7c, 0x0192); /* florin */ \
112 	    MAP(0x7d, XK_onequarter); \
113 	    MAP(0x7e, XK_acute); \
114 	}
115 
116 #define map_NRCS_Finnish(code) \
117 	switch (code) { \
118 	    MAP(0x5b, XK_Adiaeresis); \
119 	    MAP(0x5c, XK_Odiaeresis); \
120 	    MAP(0x5d, XK_Aring); \
121 	    MAP(0x5e, XK_Udiaeresis); \
122 	    MAP(0x60, XK_eacute); \
123 	    MAP(0x7b, XK_adiaeresis); \
124 	    MAP(0x7c, XK_odiaeresis); \
125 	    MAP(0x7d, XK_aring); \
126 	    MAP(0x7e, XK_udiaeresis); \
127 	}
128 
129 #define map_NRCS_French(code) \
130 	switch (code) { \
131 	    MAP(0x23, XK_sterling); \
132 	    MAP(0x40, XK_agrave); \
133 	    MAP(0x5b, XK_degree); \
134 	    MAP(0x5c, XK_ccedilla); \
135 	    MAP(0x5d, XK_section); \
136 	    MAP(0x7b, XK_eacute); \
137 	    MAP(0x7c, XK_ugrave); \
138 	    MAP(0x7d, XK_egrave); \
139 	    MAP(0x7e, XK_diaeresis); \
140 	}
141 
142 #define map_NRCS_French_Canadian(code) \
143 	switch (code) { \
144 	    MAP(0x40, XK_agrave); \
145 	    MAP(0x5b, XK_acircumflex); \
146 	    MAP(0x5c, XK_ccedilla); \
147 	    MAP(0x5d, XK_ecircumflex); \
148 	    MAP(0x5e, XK_icircumflex); \
149 	    MAP(0x60, XK_ocircumflex); \
150 	    MAP(0x7b, XK_eacute); \
151 	    MAP(0x7c, XK_ugrave); \
152 	    MAP(0x7d, XK_egrave); \
153 	    MAP(0x7e, XK_ucircumflex); \
154 	}
155 
156 #define map_NRCS_German(code) \
157 	switch (code) { \
158 	    MAP(0x40, XK_section); \
159 	    MAP(0x5b, XK_Adiaeresis); \
160 	    MAP(0x5c, XK_Odiaeresis); \
161 	    MAP(0x5d, XK_Udiaeresis); \
162 	    MAP(0x7b, XK_adiaeresis); \
163 	    MAP(0x7c, XK_odiaeresis); \
164 	    MAP(0x7d, XK_udiaeresis); \
165 	    MAP(0x7e, XK_ssharp); \
166 	}
167 
168 #define map_NRCS_Italian(code) \
169 	switch (code) { \
170 	    MAP(0x23, XK_sterling); \
171 	    MAP(0x40, XK_section); \
172 	    MAP(0x5b, XK_degree); \
173 	    MAP(0x5c, XK_ccedilla); \
174 	    MAP(0x5d, XK_eacute); \
175 	    MAP(0x60, XK_ugrave); \
176 	    MAP(0x7b, XK_agrave); \
177 	    MAP(0x7c, XK_ograve); \
178 	    MAP(0x7d, XK_egrave); \
179 	    MAP(0x7e, XK_igrave); \
180 	}
181 
182 #define map_NRCS_Norwegian_Danish(code) \
183 	switch (code) { \
184 	    MAP(0x40, XK_Adiaeresis); \
185 	    MAP(0x5b, XK_AE); \
186 	    MAP(0x5c, XK_Ooblique); \
187 	    MAP(0x5d, XK_Aring); \
188 	    MAP(0x5e, XK_Udiaeresis); \
189 	    MAP(0x60, XK_adiaeresis); \
190 	    MAP(0x7b, XK_ae); \
191 	    MAP(0x7c, XK_oslash); \
192 	    MAP(0x7d, XK_aring); \
193 	    MAP(0x7e, XK_udiaeresis); \
194 	}
195 
196 #define map_NRCS_Portuguese(code) \
197 	switch (code) { \
198 	    MAP(0x5b, XK_Atilde); \
199 	    MAP(0x5c, XK_Ccedilla); \
200 	    MAP(0x5d, XK_Otilde); \
201 	    MAP(0x7b, XK_atilde); \
202 	    MAP(0x7c, XK_ccedilla); \
203 	    MAP(0x7d, XK_otilde); \
204 	}
205 
206 #define map_NRCS_Spanish(code) \
207 	switch (code) { \
208 	    MAP(0x23, XK_sterling); \
209 	    MAP(0x40, XK_section); \
210 	    MAP(0x5b, XK_exclamdown); \
211 	    MAP(0x5c, XK_Ntilde); \
212 	    MAP(0x5d, XK_questiondown); \
213 	    MAP(0x7b, XK_degree); \
214 	    MAP(0x7c, XK_ntilde); \
215 	    MAP(0x7d, XK_ccedilla); \
216 	}
217 
218 #define map_NRCS_Swedish(code) \
219 	switch (code) { \
220 	    MAP(0x40, XK_Eacute); \
221 	    MAP(0x5b, XK_Adiaeresis); \
222 	    MAP(0x5c, XK_Odiaeresis); \
223 	    MAP(0x5d, XK_Aring); \
224 	    MAP(0x5e, XK_Udiaeresis); \
225 	    MAP(0x60, XK_eacute); \
226 	    MAP(0x7b, XK_adiaeresis); \
227 	    MAP(0x7c, XK_odiaeresis); \
228 	    MAP(0x7d, XK_aring); \
229 	    MAP(0x7e, XK_udiaeresis); \
230 	}
231 
232 #define map_NRCS_Swiss(code) \
233 	switch (code) { \
234 	    MAP(0x23, XK_ugrave); \
235 	    MAP(0x40, XK_agrave); \
236 	    MAP(0x5b, XK_eacute); \
237 	    MAP(0x5c, XK_ccedilla); \
238 	    MAP(0x5d, XK_ecircumflex); \
239 	    MAP(0x5e, XK_icircumflex); \
240 	    MAP(0x5f, XK_egrave); \
241 	    MAP(0x60, XK_ocircumflex); \
242 	    MAP(0x7b, XK_adiaeresis); \
243 	    MAP(0x7c, XK_odiaeresis); \
244 	    MAP(0x7d, XK_udiaeresis); \
245 	    MAP(0x7e, XK_ucircumflex); \
246 	}
247 
248 /*
249  * Unlike NRCS, which splices a few characters onto ASCII, the supplementary
250  * character sets are complete, normally mapped to GR.  Most of these mappings
251  * rely upon glyphs not found in ISO-8859-1.  We can display most of those
252  * using Unicode, thereby supporting specialized applications that use SCS
253  * with luit, subject to the limitation that select/paste will give meaningless
254  * results in terms of the application which uses these mappings.
255  *
256  * Since the codepages introduced with VT320, etc, use 8-bit encodings, there
257  * is no plausible argument to be made that these mappings "use" UTF-8, even
258  * though there is a hidden step in the terminal emulator which relies upon
259  * UTF-8.
260  */
261 #define map_DEC_Supp_Graphic(code,dft) \
262 	begin_CODEPAGE(); \
263 	switch (code) { \
264 	    XXX(0x24, UNDEF); \
265 	    XXX(0x26, UNDEF); \
266 	    MAP(0x28, 0xa4); \
267 	    XXX(0x2c, UNDEF); \
268 	    XXX(0x2d, UNDEF); \
269 	    XXX(0x2e, UNDEF); \
270 	    XXX(0x2f, UNDEF); \
271 	    XXX(0x34, UNDEF); \
272 	    XXX(0x38, UNDEF); \
273 	    XXX(0x3e, UNDEF); \
274 	    XXX(0x50, UNDEF); \
275 	    UNI(0x57, 0x0152); \
276 	    MAP(0x5d, 0x0178); \
277 	    XXX(0x5e, UNDEF); \
278 	    XXX(0x70, UNDEF); \
279 	    UNI(0x77, 0x0153); \
280 	    MAP(0x7d, 0xff); \
281 	    XXX(0x7e, UNDEF); \
282 	    XXX(0x7f, UNDEF); \
283 	    default: dft; break; \
284 	} \
285 	end_CODEPAGE()
286 
287 #if OPT_WIDE_CHARS
288 	/* derived from http://www.vt100.net/charsets/technical.html */
289 #define map_DEC_Technical(code) \
290 	begin_CODEPAGE(); \
291 	switch (code) { \
292 	    UNI(0x21, 0x23b7);	/* RADICAL SYMBOL BOTTOM Centred left to right, so that it joins up with 02/02 */ \
293 	    UNI(0x22, 0x250c);	/* BOX DRAWINGS LIGHT DOWN AND RIGHT */ \
294 	    UNI(0x23, 0x2500);	/* BOX DRAWINGS LIGHT HORIZONTAL */ \
295 	    UNI(0x24, 0x2320);	/* TOP HALF INTEGRAL with the proviso that the stem is vertical, to join with 02/06 */ \
296 	    UNI(0x25, 0x2321);	/* BOTTOM HALF INTEGRAL with the proviso above. */ \
297 	    UNI(0x26, 0x2502);	/* BOX DRAWINGS LIGHT VERTICAL */ \
298 	    UNI(0x27, 0x23a1);	/* LEFT SQUARE BRACKET UPPER CORNER Joins vertically to 02/06, 02/08. Doesn't join to its right. */ \
299 	    UNI(0x28, 0x23a3);	/* LEFT SQUARE BRACKET LOWER CORNER Joins vertically to 02/06, 02/07. Doesn't join to its right. */ \
300 	    UNI(0x29, 0x23a4);	/* RIGHT SQUARE BRACKET UPPER CORNER Joins vertically to 026, 02a. Doesn't join to its left. */ \
301 	    UNI(0x2a, 0x23a6);	/* RIGHT SQUARE BRACKET LOWER CORNER Joins vertically to 026, 029. Doesn't join to its left. */ \
302 	    UNI(0x2b, 0x23a7);	/* LEFT CURLY BRACKET UPPER HOOK Joins vertically to 026, 02c, 02/15. Doesn't join to its right. */ \
303 	    UNI(0x2c, 0x23a9);	/* LEFT CURLY BRACKET LOWER HOOK Joins vertically to 026, 02b, 02/15. Doesn't join to its right. */ \
304 	    UNI(0x2d, 0x23ab);	/* RIGHT CURLY BRACKET UPPER HOOK Joins vertically to 026, 02e, 03/00. Doesn't join to its left. */ \
305 	    UNI(0x2e, 0x23ad);	/* RIGHT CURLY BRACKET LOWER HOOK Joins vertically to 026, 02d, 03/00. Doesn't join to its left. */ \
306 	    UNI(0x2f, 0x23a8);	/* LEFT CURLY BRACKET MIDDLE PIECE Joins vertically to 026, 02b, 02c. */ \
307 	    UNI(0x30, 0x23ac);	/* RIGHT CURLY BRACKET MIDDLE PIECE Joins vertically to 02/06, 02d, 02e. */ \
308 	    XXX(0x31, UNDEF);	/* Top Left Sigma. Joins to right with 02/03, 03/05. Joins diagonally below right with 03/03, 03/07. */ \
309 	    XXX(0x32, UNDEF);	/* Bottom Left Sigma. Joins to right with 02/03, 03/06. Joins diagonally above right with 03/04, 03/07. */ \
310 	    XXX(0x33, UNDEF);	/* Top Diagonal Sigma. Line for joining 03/01 to 03/04 or 03/07. */ \
311 	    XXX(0x34, UNDEF);	/* Bottom Diagonal Sigma. Line for joining 03/02 to 03/03 or 03/07. */ \
312 	    XXX(0x35, UNDEF);	/* Top Right Sigma. Joins to left with 02/03, 03/01. */ \
313 	    XXX(0x36, UNDEF);	/* Bottom Right Sigma. Joins to left with 02/03, 03/02. */ \
314 	    XXX(0x37, UNDEF);	/* Middle Sigma. Joins diagonally with 03/01, 03/02, 03/03, 03/04. */ \
315 	    XXX(0x38, UNDEF);	/* undefined */ \
316 	    XXX(0x39, UNDEF);	/* undefined */ \
317 	    XXX(0x3a, UNDEF);	/* undefined */ \
318 	    XXX(0x3b, UNDEF);	/* undefined */ \
319 	    UNI(0x3c, 0x2264);	/* LESS-THAN OR EQUAL TO */ \
320 	    UNI(0x3d, 0x2260);	/* NOT EQUAL TO */ \
321 	    UNI(0x3e, 0x2265);	/* GREATER-THAN OR EQUAL TO */ \
322 	    UNI(0x3f, 0x222B);	/* INTEGRAL */ \
323 	    UNI(0x40, 0x2234);	/* THEREFORE */ \
324 	    UNI(0x41, 0x221d);	/* PROPORTIONAL TO */ \
325 	    UNI(0x42, 0x221e);	/* INFINITY */ \
326 	    UNI(0x43, 0x00f7);	/* DIVISION SIGN */ \
327 	    UNI(0x44, 0x0394);	/* GREEK CAPITAL DELTA */ \
328 	    UNI(0x45, 0x2207);	/* NABLA */ \
329 	    UNI(0x46, 0x03a6);	/* GREEK CAPITAL LETTER PHI */ \
330 	    UNI(0x47, 0x0393);	/* GREEK CAPITAL LETTER GAMMA */ \
331 	    UNI(0x48, 0x223c);	/* TILDE OPERATOR */ \
332 	    UNI(0x49, 0x2243);	/* ASYMPTOTICALLY EQUAL TO */ \
333 	    UNI(0x4a, 0x0398);	/* GREEK CAPITAL LETTER THETA */ \
334 	    UNI(0x4b, 0x00d7);	/* MULTIPLICATION SIGN */ \
335 	    UNI(0x4c, 0x039b);	/* GREEK CAPITAL LETTER LAMDA */ \
336 	    UNI(0x4d, 0x21d4);	/* LEFT RIGHT DOUBLE ARROW */ \
337 	    UNI(0x4e, 0x21d2);	/* RIGHTWARDS DOUBLE ARROW */ \
338 	    UNI(0x4f, 0x2261);	/* IDENTICAL TO */ \
339 	    UNI(0x50, 0x03a0);	/* GREEK CAPITAL LETTER PI */ \
340 	    UNI(0x51, 0x03a8);	/* GREEK CAPITAL LETTER PSI */ \
341 	    UNI(0x52, UNDEF);	/* undefined */ \
342 	    UNI(0x53, 0x03a3);	/* GREEK CAPITAL LETTER SIGMA */ \
343 	    XXX(0x54, UNDEF);	/* undefined */ \
344 	    XXX(0x55, UNDEF);	/* undefined */ \
345 	    UNI(0x56, 0x221a);	/* SQUARE ROOT */ \
346 	    UNI(0x57, 0x03a9);	/* GREEK CAPITAL LETTER OMEGA */ \
347 	    UNI(0x58, 0x039e);	/* GREEK CAPITAL LETTER XI */ \
348 	    UNI(0x59, 0x03a5);	/* GREEK CAPITAL LETTER UPSILON */ \
349 	    UNI(0x5a, 0x2282);	/* SUBSET OF */ \
350 	    UNI(0x5b, 0x2283);	/* SUPERSET OF */ \
351 	    UNI(0x5c, 0x2229);	/* INTERSECTION */ \
352 	    UNI(0x5d, 0x222a);	/* UNION */ \
353 	    UNI(0x5e, 0x2227);	/* LOGICAL AND */ \
354 	    UNI(0x5f, 0x2228);	/* LOGICAL OR */ \
355 	    UNI(0x60, 0x00ac);	/* NOT SIGN */ \
356 	    UNI(0x61, 0x03b1);	/* GREEK SMALL LETTER ALPHA */ \
357 	    UNI(0x62, 0x03b2);	/* GREEK SMALL LETTER BETA */ \
358 	    UNI(0x63, 0x03c7);	/* GREEK SMALL LETTER CHI */ \
359 	    UNI(0x64, 0x03b4);	/* GREEK SMALL LETTER DELTA */ \
360 	    UNI(0x65, 0x03b5);	/* GREEK SMALL LETTER EPSILON */ \
361 	    UNI(0x66, 0x03c6);	/* GREEK SMALL LETTER PHI */ \
362 	    UNI(0x67, 0x03b3);	/* GREEK SMALL LETTER GAMMA */ \
363 	    UNI(0x68, 0x03b7);	/* GREEK SMALL LETTER ETA */ \
364 	    UNI(0x69, 0x03b9);	/* GREEK SMALL LETTER IOTA */ \
365 	    UNI(0x6a, 0x03b8);	/* GREEK SMALL LETTER THETA */ \
366 	    UNI(0x6b, 0x03ba);	/* GREEK SMALL LETTER KAPPA */ \
367 	    UNI(0x6c, 0x03bb);	/* GREEK SMALL LETTER LAMDA */ \
368 	    XXX(0x6d, UNDEF);	/* undefined */ \
369 	    UNI(0x6e, 0x03bd);	/* GREEK SMALL LETTER NU */ \
370 	    UNI(0x6f, 0x2202);	/* PARTIAL DIFFERENTIAL */ \
371 	    UNI(0x70, 0x03c0);	/* GREEK SMALL LETTER PI */ \
372 	    UNI(0x71, 0x03c8);	/* GREEK SMALL LETTER PSI */ \
373 	    UNI(0x72, 0x03c1);	/* GREEK SMALL LETTER RHO */ \
374 	    UNI(0x73, 0x03c3);	/* GREEK SMALL LETTER SIGMA */ \
375 	    UNI(0x74, 0x03c4);	/* GREEK SMALL LETTER TAU */ \
376 	    XXX(0x75, UNDEF);	/* undefined */ \
377 	    UNI(0x76, 0x0192);	/* LATIN SMALL LETTER F WITH HOOK Probably chosen for its meaning of "function" */ \
378 	    UNI(0x77, 0x03c9);	/* GREEK SMALL LETTER OMEGA */ \
379 	    UNI(0x78, 0x03bE);	/* GREEK SMALL LETTER XI */ \
380 	    UNI(0x79, 0x03c5);	/* GREEK SMALL LETTER UPSILON */ \
381 	    UNI(0x7a, 0x03b6);	/* GREEK SMALL LETTER ZETA */ \
382 	    UNI(0x7b, 0x2190);	/* LEFTWARDS ARROW */ \
383 	    UNI(0x7c, 0x2191);	/* UPWARDS ARROW */ \
384 	    UNI(0x7d, 0x2192);	/* RIGHTWARDS ARROW */ \
385 	    UNI(0x7e, 0x2193);	/* DOWNWARDS ARROW */ \
386 	} \
387 	end_CODEPAGE()
388 	/* ISO Latin/Cyrillic is 8859-5 */
389 #define map_ISO_Latin_Cyrillic(code) \
390 	begin_CODEPAGE(); \
391 	switch (code) { \
392 	    UNI(0x20, 0x00a0);	/* NO-BREAK SPACE */ \
393 	    UNI(0x21, 0x0401);	/* CYRILLIC CAPITAL LETTER IO */ \
394 	    UNI(0x22, 0x0402);	/* CYRILLIC CAPITAL LETTER DJE */ \
395 	    UNI(0x23, 0x0403);	/* CYRILLIC CAPITAL LETTER GJE */ \
396 	    UNI(0x24, 0x0404);	/* CYRILLIC CAPITAL LETTER UKRAINIAN IE */ \
397 	    UNI(0x25, 0x0405);	/* CYRILLIC CAPITAL LETTER DZE */ \
398 	    UNI(0x26, 0x0406);	/* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ \
399 	    UNI(0x27, 0x0407);	/* CYRILLIC CAPITAL LETTER YI */ \
400 	    UNI(0x28, 0x0408);	/* CYRILLIC CAPITAL LETTER JE */ \
401 	    UNI(0x29, 0x0409);	/* CYRILLIC CAPITAL LETTER LJE */ \
402 	    UNI(0x2a, 0x040a);	/* CYRILLIC CAPITAL LETTER NJE */ \
403 	    UNI(0x2b, 0x040b);	/* CYRILLIC CAPITAL LETTER TSHE */ \
404 	    UNI(0x2c, 0x040c);	/* CYRILLIC CAPITAL LETTER KJE */ \
405 	    UNI(0x2d, 0x00ad);	/* SOFT HYPHEN */ \
406 	    UNI(0x2e, 0x040e);	/* CYRILLIC CAPITAL LETTER SHORT U */ \
407 	    UNI(0x2f, 0x040f);	/* CYRILLIC CAPITAL LETTER DZHE */ \
408 	    UNI(0x30, 0x0410);	/* CYRILLIC CAPITAL LETTER A */ \
409 	    UNI(0x31, 0x0411);	/* CYRILLIC CAPITAL LETTER BE */ \
410 	    UNI(0x32, 0x0412);	/* CYRILLIC CAPITAL LETTER VE */ \
411 	    UNI(0x33, 0x0413);	/* CYRILLIC CAPITAL LETTER GHE */ \
412 	    UNI(0x34, 0x0414);	/* CYRILLIC CAPITAL LETTER DE */ \
413 	    UNI(0x35, 0x0415);	/* CYRILLIC CAPITAL LETTER IE */ \
414 	    UNI(0x36, 0x0416);	/* CYRILLIC CAPITAL LETTER ZHE */ \
415 	    UNI(0x37, 0x0417);	/* CYRILLIC CAPITAL LETTER ZE */ \
416 	    UNI(0x38, 0x0418);	/* CYRILLIC CAPITAL LETTER I */ \
417 	    UNI(0x39, 0x0419);	/* CYRILLIC CAPITAL LETTER SHORT I */ \
418 	    UNI(0x3a, 0x041a);	/* CYRILLIC CAPITAL LETTER KA */ \
419 	    UNI(0x3b, 0x041b);	/* CYRILLIC CAPITAL LETTER EL */ \
420 	    UNI(0x3c, 0x041c);	/* CYRILLIC CAPITAL LETTER EM */ \
421 	    UNI(0x3d, 0x041d);	/* CYRILLIC CAPITAL LETTER EN */ \
422 	    UNI(0x3e, 0x041e);	/* CYRILLIC CAPITAL LETTER O */ \
423 	    UNI(0x3f, 0x041f);	/* CYRILLIC CAPITAL LETTER PE */ \
424 	    UNI(0x40, 0x0420);	/* CYRILLIC CAPITAL LETTER ER */ \
425 	    UNI(0x41, 0x0421);	/* CYRILLIC CAPITAL LETTER ES */ \
426 	    UNI(0x42, 0x0422);	/* CYRILLIC CAPITAL LETTER TE */ \
427 	    UNI(0x43, 0x0423);	/* CYRILLIC CAPITAL LETTER U */ \
428 	    UNI(0x44, 0x0424);	/* CYRILLIC CAPITAL LETTER EF */ \
429 	    UNI(0x45, 0x0425);	/* CYRILLIC CAPITAL LETTER HA */ \
430 	    UNI(0x46, 0x0426);	/* CYRILLIC CAPITAL LETTER TSE */ \
431 	    UNI(0x47, 0x0427);	/* CYRILLIC CAPITAL LETTER CHE */ \
432 	    UNI(0x48, 0x0428);	/* CYRILLIC CAPITAL LETTER SHA */ \
433 	    UNI(0x49, 0x0429);	/* CYRILLIC CAPITAL LETTER SHCHA */ \
434 	    UNI(0x4a, 0x042a);	/* CYRILLIC CAPITAL LETTER HARD SIGN */ \
435 	    UNI(0x4b, 0x042b);	/* CYRILLIC CAPITAL LETTER YERU */ \
436 	    UNI(0x4c, 0x042c);	/* CYRILLIC CAPITAL LETTER SOFT SIGN */ \
437 	    UNI(0x4d, 0x042d);	/* CYRILLIC CAPITAL LETTER E */ \
438 	    UNI(0x4e, 0x042e);	/* CYRILLIC CAPITAL LETTER YU */ \
439 	    UNI(0x4f, 0x042f);	/* CYRILLIC CAPITAL LETTER YA */ \
440 	    UNI(0x50, 0x0430);	/* CYRILLIC SMALL LETTER A */ \
441 	    UNI(0x51, 0x0431);	/* CYRILLIC SMALL LETTER BE */ \
442 	    UNI(0x52, 0x0432);	/* CYRILLIC SMALL LETTER VE */ \
443 	    UNI(0x53, 0x0433);	/* CYRILLIC SMALL LETTER GHE */ \
444 	    UNI(0x54, 0x0434);	/* CYRILLIC SMALL LETTER DE */ \
445 	    UNI(0x55, 0x0435);	/* CYRILLIC SMALL LETTER IE */ \
446 	    UNI(0x56, 0x0436);	/* CYRILLIC SMALL LETTER ZHE */ \
447 	    UNI(0x57, 0x0437);	/* CYRILLIC SMALL LETTER ZE */ \
448 	    UNI(0x58, 0x0438);	/* CYRILLIC SMALL LETTER I */ \
449 	    UNI(0x59, 0x0439);	/* CYRILLIC SMALL LETTER SHORT I */ \
450 	    UNI(0x5a, 0x043a);	/* CYRILLIC SMALL LETTER KA */ \
451 	    UNI(0x5b, 0x043b);	/* CYRILLIC SMALL LETTER EL */ \
452 	    UNI(0x5c, 0x043c);	/* CYRILLIC SMALL LETTER EM */ \
453 	    UNI(0x5d, 0x043d);	/* CYRILLIC SMALL LETTER EN */ \
454 	    UNI(0x5e, 0x043e);	/* CYRILLIC SMALL LETTER O */ \
455 	    UNI(0x5f, 0x043f);	/* CYRILLIC SMALL LETTER PE */ \
456 	    UNI(0x60, 0x0440);	/* CYRILLIC SMALL LETTER ER */ \
457 	    UNI(0x61, 0x0441);	/* CYRILLIC SMALL LETTER ES */ \
458 	    UNI(0x62, 0x0442);	/* CYRILLIC SMALL LETTER TE */ \
459 	    UNI(0x63, 0x0443);	/* CYRILLIC SMALL LETTER U */ \
460 	    UNI(0x64, 0x0444);	/* CYRILLIC SMALL LETTER EF */ \
461 	    UNI(0x65, 0x0445);	/* CYRILLIC SMALL LETTER HA */ \
462 	    UNI(0x66, 0x0446);	/* CYRILLIC SMALL LETTER TSE */ \
463 	    UNI(0x67, 0x0447);	/* CYRILLIC SMALL LETTER CHE */ \
464 	    UNI(0x68, 0x0448);	/* CYRILLIC SMALL LETTER SHA */ \
465 	    UNI(0x69, 0x0449);	/* CYRILLIC SMALL LETTER SHCHA */ \
466 	    UNI(0x6a, 0x044a);	/* CYRILLIC SMALL LETTER HARD SIGN */ \
467 	    UNI(0x6b, 0x044b);	/* CYRILLIC SMALL LETTER YERU */ \
468 	    UNI(0x6c, 0x044c);	/* CYRILLIC SMALL LETTER SOFT SIGN */ \
469 	    UNI(0x6d, 0x044d);	/* CYRILLIC SMALL LETTER E */ \
470 	    UNI(0x6e, 0x044e);	/* CYRILLIC SMALL LETTER YU */ \
471 	    UNI(0x6f, 0x044f);	/* CYRILLIC SMALL LETTER YA */ \
472 	    UNI(0x70, 0x2116);	/* NUMERO SIGN */ \
473 	    UNI(0x71, 0x0451);	/* CYRILLIC SMALL LETTER IO */ \
474 	    UNI(0x72, 0x0452);	/* CYRILLIC SMALL LETTER DJE */ \
475 	    UNI(0x73, 0x0453);	/* CYRILLIC SMALL LETTER GJE */ \
476 	    UNI(0x74, 0x0454);	/* CYRILLIC SMALL LETTER UKRAINIAN IE */ \
477 	    UNI(0x75, 0x0455);	/* CYRILLIC SMALL LETTER DZE */ \
478 	    UNI(0x76, 0x0456);	/* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ \
479 	    UNI(0x77, 0x0457);	/* CYRILLIC SMALL LETTER YI */ \
480 	    UNI(0x78, 0x0458);	/* CYRILLIC SMALL LETTER JE */ \
481 	    UNI(0x79, 0x0459);	/* CYRILLIC SMALL LETTER LJE */ \
482 	    UNI(0x7a, 0x045a);	/* CYRILLIC SMALL LETTER NJE */ \
483 	    UNI(0x7b, 0x045b);	/* CYRILLIC SMALL LETTER TSHE */ \
484 	    UNI(0x7c, 0x045c);	/* CYRILLIC SMALL LETTER KJE */ \
485 	    UNI(0x7d, 0x00a7);	/* SECTION SIGN */ \
486 	    UNI(0x7e, 0x045e);	/* CYRILLIC SMALL LETTER SHORT U */ \
487 	    UNI(0x7f, 0x045f);	/* CYRILLIC SMALL LETTER DZHE */ \
488 	} \
489 	end_CODEPAGE()
490 	/* ISO Greek is 8859-7 */
491 #define map_ISO_Greek_Supp(code) \
492 	begin_CODEPAGE(); \
493 	switch (code) { \
494 	    UNI(0x20, 0x00a0);	/* NO-BREAK SPACE */ \
495 	    UNI(0x21, 0x2018);	/* LEFT SINGLE QUOTATION MARK */ \
496 	    UNI(0x22, 0x2019);	/* RIGHT SINGLE QUOTATION MARK */ \
497 	    UNI(0x23, 0x00a3);	/* POUND SIGN */ \
498 	    UNI(0x24, 0x20ac);	/* EURO SIGN */ \
499 	    UNI(0x25, 0x20af);	/* DRACHMA SIGN */ \
500 	    UNI(0x26, 0x00a6);	/* BROKEN BAR */ \
501 	    UNI(0x27, 0x00a7);	/* SECTION SIGN */ \
502 	    UNI(0x28, 0x00a8);	/* DIAERESIS */ \
503 	    UNI(0x29, 0x00a9);	/* COPYRIGHT SIGN */ \
504 	    UNI(0x2a, 0x037a);	/* GREEK YPOGEGRAMMENI */ \
505 	    UNI(0x2b, 0x00ab);	/* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
506 	    UNI(0x2c, 0x00ac);	/* NOT SIGN */ \
507 	    UNI(0x2d, 0x00ad);	/* SOFT HYPHEN */ \
508 	    XXX(0x2e, UNDEF);	/* undefined */ \
509 	    UNI(0x2f, 0x2015);	/* HORIZONTAL BAR */ \
510 	    UNI(0x30, 0x00b0);	/* DEGREE SIGN */ \
511 	    UNI(0x31, 0x00b1);	/* PLUS-MINUS SIGN */ \
512 	    UNI(0x32, 0x00b2);	/* SUPERSCRIPT TWO */ \
513 	    UNI(0x33, 0x00b3);	/* SUPERSCRIPT THREE */ \
514 	    UNI(0x34, 0x0384);	/* GREEK TONOS */ \
515 	    UNI(0x35, 0x0385);	/* GREEK DIALYTIKA TONOS */ \
516 	    UNI(0x36, 0x0386);	/* GREEK CAPITAL LETTER ALPHA WITH TONOS */ \
517 	    UNI(0x37, 0x00b7);	/* MIDDLE DOT */ \
518 	    UNI(0x38, 0x0388);	/* GREEK CAPITAL LETTER EPSILON WITH TONOS */ \
519 	    UNI(0x39, 0x0389);	/* GREEK CAPITAL LETTER ETA WITH TONOS */ \
520 	    UNI(0x3a, 0x038a);	/* GREEK CAPITAL LETTER IOTA WITH TONOS */ \
521 	    UNI(0x3b, 0x00bb);	/* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
522 	    UNI(0x3c, 0x038c);	/* GREEK CAPITAL LETTER OMICRON WITH TONOS */ \
523 	    UNI(0x3d, 0x00bd);	/* VULGAR FRACTION ONE HALF */ \
524 	    UNI(0x3e, 0x038e);	/* GREEK CAPITAL LETTER UPSILON WITH TONOS */ \
525 	    UNI(0x3f, 0x038f);	/* GREEK CAPITAL LETTER OMEGA WITH TONOS */ \
526 	    UNI(0x40, 0x0390);	/* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ \
527 	    UNI(0x41, 0x0391);	/* GREEK CAPITAL LETTER ALPHA */ \
528 	    UNI(0x42, 0x0392);	/* GREEK CAPITAL LETTER BETA */ \
529 	    UNI(0x43, 0x0393);	/* GREEK CAPITAL LETTER GAMMA */ \
530 	    UNI(0x44, 0x0394);	/* GREEK CAPITAL LETTER DELTA */ \
531 	    UNI(0x45, 0x0395);	/* GREEK CAPITAL LETTER EPSILON */ \
532 	    UNI(0x46, 0x0396);	/* GREEK CAPITAL LETTER ZETA */ \
533 	    UNI(0x47, 0x0397);	/* GREEK CAPITAL LETTER ETA */ \
534 	    UNI(0x48, 0x0398);	/* GREEK CAPITAL LETTER THETA */ \
535 	    UNI(0x49, 0x0399);	/* GREEK CAPITAL LETTER IOTA */ \
536 	    UNI(0x4a, 0x039a);	/* GREEK CAPITAL LETTER KAPPA */ \
537 	    UNI(0x4b, 0x039b);	/* GREEK CAPITAL LETTER LAMDA */ \
538 	    UNI(0x4c, 0x039c);	/* GREEK CAPITAL LETTER MU */ \
539 	    UNI(0x4d, 0x039d);	/* GREEK CAPITAL LETTER NU */ \
540 	    UNI(0x4e, 0x039e);	/* GREEK CAPITAL LETTER XI */ \
541 	    UNI(0x4f, 0x039f);	/* GREEK CAPITAL LETTER OMICRON */ \
542 	    UNI(0x50, 0x03a0);	/* GREEK CAPITAL LETTER PI */ \
543 	    UNI(0x51, 0x03a1);	/* GREEK CAPITAL LETTER RHO */ \
544 	    XXX(0x52, UNDEF);	/* undefined */ \
545 	    UNI(0x53, 0x03a3);	/* GREEK CAPITAL LETTER SIGMA */ \
546 	    UNI(0x54, 0x03a4);	/* GREEK CAPITAL LETTER TAU */ \
547 	    UNI(0x55, 0x03a5);	/* GREEK CAPITAL LETTER UPSILON */ \
548 	    UNI(0x56, 0x03a6);	/* GREEK CAPITAL LETTER PHI */ \
549 	    UNI(0x57, 0x03a7);	/* GREEK CAPITAL LETTER CHI */ \
550 	    UNI(0x58, 0x03a8);	/* GREEK CAPITAL LETTER PSI */ \
551 	    UNI(0x59, 0x03a9);	/* GREEK CAPITAL LETTER OMEGA */ \
552 	    UNI(0x5a, 0x03aa);	/* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ \
553 	    UNI(0x5b, 0x03ab);	/* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ \
554 	    UNI(0x5c, 0x03ac);	/* GREEK SMALL LETTER ALPHA WITH TONOS */ \
555 	    UNI(0x5d, 0x03ad);	/* GREEK SMALL LETTER EPSILON WITH TONOS */ \
556 	    UNI(0x5e, 0x03ae);	/* GREEK SMALL LETTER ETA WITH TONOS */ \
557 	    UNI(0x5f, 0x03af);	/* GREEK SMALL LETTER IOTA WITH TONOS */ \
558 	    UNI(0x60, 0x03b0);	/* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ \
559 	    UNI(0x61, 0x03b1);	/* GREEK SMALL LETTER ALPHA */ \
560 	    UNI(0x62, 0x03b2);	/* GREEK SMALL LETTER BETA */ \
561 	    UNI(0x63, 0x03b3);	/* GREEK SMALL LETTER GAMMA */ \
562 	    UNI(0x64, 0x03b4);	/* GREEK SMALL LETTER DELTA */ \
563 	    UNI(0x65, 0x03b5);	/* GREEK SMALL LETTER EPSILON */ \
564 	    UNI(0x66, 0x03b6);	/* GREEK SMALL LETTER ZETA */ \
565 	    UNI(0x67, 0x03b7);	/* GREEK SMALL LETTER ETA */ \
566 	    UNI(0x68, 0x03b8);	/* GREEK SMALL LETTER THETA */ \
567 	    UNI(0x69, 0x03b9);	/* GREEK SMALL LETTER IOTA */ \
568 	    UNI(0x6a, 0x03ba);	/* GREEK SMALL LETTER KAPPA */ \
569 	    UNI(0x6b, 0x03bb);	/* GREEK SMALL LETTER LAMDA */ \
570 	    UNI(0x6c, 0x03bc);	/* GREEK SMALL LETTER MU */ \
571 	    UNI(0x6d, 0x03bd);	/* GREEK SMALL LETTER NU */ \
572 	    UNI(0x6e, 0x03be);	/* GREEK SMALL LETTER XI */ \
573 	    UNI(0x6f, 0x03bf);	/* GREEK SMALL LETTER OMICRON */ \
574 	    UNI(0x70, 0x03c0);	/* GREEK SMALL LETTER PI */ \
575 	    UNI(0x71, 0x03c1);	/* GREEK SMALL LETTER RHO */ \
576 	    UNI(0x72, 0x03c2);	/* GREEK SMALL LETTER FINAL SIGMA */ \
577 	    UNI(0x73, 0x03c3);	/* GREEK SMALL LETTER SIGMA */ \
578 	    UNI(0x74, 0x03c4);	/* GREEK SMALL LETTER TAU */ \
579 	    UNI(0x75, 0x03c5);	/* GREEK SMALL LETTER UPSILON */ \
580 	    UNI(0x76, 0x03c6);	/* GREEK SMALL LETTER PHI */ \
581 	    UNI(0x77, 0x03c7);	/* GREEK SMALL LETTER CHI */ \
582 	    UNI(0x78, 0x03c8);	/* GREEK SMALL LETTER PSI */ \
583 	    UNI(0x79, 0x03c9);	/* GREEK SMALL LETTER OMEGA */ \
584 	    UNI(0x7a, 0x03ca);	/* GREEK SMALL LETTER IOTA WITH DIALYTIKA */ \
585 	    UNI(0x7b, 0x03cb);	/* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ \
586 	    UNI(0x7c, 0x03cc);	/* GREEK SMALL LETTER OMICRON WITH TONOS */ \
587 	    UNI(0x7d, 0x03cd);	/* GREEK SMALL LETTER UPSILON WITH TONOS */ \
588 	    UNI(0x7e, 0x03ce);	/* GREEK SMALL LETTER OMEGA WITH TONOS */ \
589 	} \
590 	end_CODEPAGE()
591 	/* figure A-23 "ISO Latin-Hebrew Supplemental Character Set" */
592 #define map_ISO_Hebrew(code) \
593 	begin_CODEPAGE(); \
594 	switch (code) { \
595 	    UNI(0x20, 0x00a0);	/* NO-BREAK SPACE */ \
596 	    XXX(0x21, UNDEF);	/* undefined */ \
597 	    UNI(0x22, 0x00a2);	/* CENT SIGN */ \
598 	    UNI(0x23, 0x00a3);	/* POUND SIGN */ \
599 	    UNI(0x24, 0x00a4);	/* CURRENCY SIGN */ \
600 	    UNI(0x25, 0x00a5);	/* YEN SIGN */ \
601 	    UNI(0x26, 0x00a6);	/* BROKEN BAR */ \
602 	    UNI(0x27, 0x00a7);	/* SECTION SIGN */ \
603 	    UNI(0x28, 0x00a8);	/* DIAERESIS */ \
604 	    UNI(0x29, 0x00a9);	/* COPYRIGHT SIGN */ \
605 	    UNI(0x2a, 0x00d7);	/* MULTIPLICATION SIGN */ \
606 	    UNI(0x2b, 0x00ab);	/* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
607 	    UNI(0x2c, 0x00ac);	/* NOT SIGN */ \
608 	    UNI(0x2d, 0x00ad);	/* SOFT HYPHEN */ \
609 	    UNI(0x2e, 0x00ae);	/* REGISTERED SIGN */ \
610 	    UNI(0x2f, 0x00af);	/* MACRON */ \
611 	    UNI(0x30, 0x00b0);	/* DEGREE SIGN */ \
612 	    UNI(0x31, 0x00b1);	/* PLUS-MINUS SIGN */ \
613 	    UNI(0x32, 0x00b2);	/* SUPERSCRIPT TWO */ \
614 	    UNI(0x33, 0x00b3);	/* SUPERSCRIPT THREE */ \
615 	    UNI(0x34, 0x00b4);	/* ACUTE ACCENT */ \
616 	    UNI(0x35, 0x00b5);	/* MICRO SIGN */ \
617 	    UNI(0x36, 0x00b6);	/* PILCROW SIGN */ \
618 	    UNI(0x37, 0x00b7);	/* MIDDLE DOT */ \
619 	    UNI(0x38, 0x00b8);	/* CEDILLA */ \
620 	    UNI(0x39, 0x00b9);	/* SUPERSCRIPT ONE */ \
621 	    UNI(0x3a, 0x00f7);	/* DIVISION SIGN */ \
622 	    UNI(0x3b, 0x00bb);	/* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
623 	    UNI(0x3c, 0x00bc);	/* VULGAR FRACTION ONE QUARTER */ \
624 	    UNI(0x3d, 0x00bd);	/* VULGAR FRACTION ONE HALF */ \
625 	    UNI(0x3e, 0x00be);	/* VULGAR FRACTION THREE QUARTERS */ \
626 	    XXX(0x3f, UNDEF);	/* undefined */ \
627 	    XXX(0x40, UNDEF);	/* undefined */ \
628 	    XXX(0x41, UNDEF);	/* undefined */ \
629 	    XXX(0x42, UNDEF);	/* undefined */ \
630 	    XXX(0x43, UNDEF);	/* undefined */ \
631 	    XXX(0x44, UNDEF);	/* undefined */ \
632 	    XXX(0x45, UNDEF);	/* undefined */ \
633 	    XXX(0x46, UNDEF);	/* undefined */ \
634 	    XXX(0x47, UNDEF);	/* undefined */ \
635 	    XXX(0x48, UNDEF);	/* undefined */ \
636 	    XXX(0x49, UNDEF);	/* undefined */ \
637 	    XXX(0x4a, UNDEF);	/* undefined */ \
638 	    XXX(0x4b, UNDEF);	/* undefined */ \
639 	    XXX(0x4c, UNDEF);	/* undefined */ \
640 	    XXX(0x4d, UNDEF);	/* undefined */ \
641 	    XXX(0x4e, UNDEF);	/* undefined */ \
642 	    XXX(0x4f, UNDEF);	/* undefined */ \
643 	    XXX(0x50, UNDEF);	/* undefined */ \
644 	    XXX(0x51, UNDEF);	/* undefined */ \
645 	    XXX(0x52, UNDEF);	/* undefined */ \
646 	    XXX(0x53, UNDEF);	/* undefined */ \
647 	    XXX(0x54, UNDEF);	/* undefined */ \
648 	    XXX(0x55, UNDEF);	/* undefined */ \
649 	    XXX(0x56, UNDEF);	/* undefined */ \
650 	    XXX(0x57, UNDEF);	/* undefined */ \
651 	    XXX(0x58, UNDEF);	/* undefined */ \
652 	    XXX(0x59, UNDEF);	/* undefined */ \
653 	    XXX(0x5a, UNDEF);	/* undefined */ \
654 	    XXX(0x5b, UNDEF);	/* undefined */ \
655 	    XXX(0x5c, UNDEF);	/* undefined */ \
656 	    XXX(0x5d, UNDEF);	/* undefined */ \
657 	    XXX(0x5e, UNDEF);	/* undefined */ \
658 	    UNI(0x5f, 0x2017);	/* DOUBLE LOW LINE */ \
659 	    UNI(0x60, 0x05d0);	/* HEBREW LETTER ALEF */ \
660 	    UNI(0x61, 0x05d1);	/* HEBREW LETTER BET */ \
661 	    UNI(0x62, 0x05d2);	/* HEBREW LETTER GIMEL */ \
662 	    UNI(0x63, 0x05d3);	/* HEBREW LETTER DALET */ \
663 	    UNI(0x64, 0x05d4);	/* HEBREW LETTER HE */ \
664 	    UNI(0x65, 0x05d5);	/* HEBREW LETTER VAV */ \
665 	    UNI(0x66, 0x05d6);	/* HEBREW LETTER ZAYIN */ \
666 	    UNI(0x67, 0x05d7);	/* HEBREW LETTER HET */ \
667 	    UNI(0x68, 0x05d8);	/* HEBREW LETTER TET */ \
668 	    UNI(0x69, 0x05d9);	/* HEBREW LETTER YOD */ \
669 	    UNI(0x6a, 0x05da);	/* HEBREW LETTER FINAL KAF */ \
670 	    UNI(0x6b, 0x05db);	/* HEBREW LETTER KAF */ \
671 	    UNI(0x6c, 0x05dc);	/* HEBREW LETTER LAMED */ \
672 	    UNI(0x6d, 0x05dd);	/* HEBREW LETTER FINAL MEM */ \
673 	    UNI(0x6e, 0x05de);	/* HEBREW LETTER MEM */ \
674 	    UNI(0x6f, 0x05df);	/* HEBREW LETTER FINAL NUN */ \
675 	    UNI(0x70, 0x05e0);	/* HEBREW LETTER NUN */ \
676 	    UNI(0x71, 0x05e1);	/* HEBREW LETTER SAMEKH */ \
677 	    UNI(0x72, 0x05e2);	/* HEBREW LETTER AYIN */ \
678 	    UNI(0x73, 0x05e3);	/* HEBREW LETTER FINAL PE */ \
679 	    UNI(0x74, 0x05e4);	/* HEBREW LETTER PE */ \
680 	    UNI(0x75, 0x05e5);	/* HEBREW LETTER FINAL TSADI */ \
681 	    UNI(0x76, 0x05e6);	/* HEBREW LETTER TSADI */ \
682 	    UNI(0x77, 0x05e7);	/* HEBREW LETTER QOF */ \
683 	    UNI(0x78, 0x05e8);	/* HEBREW LETTER RESH */ \
684 	    UNI(0x79, 0x05e9);	/* HEBREW LETTER SHIN */ \
685 	    UNI(0x7a, 0x05ea);	/* HEBREW LETTER TAV */ \
686 	    XXX(0x7b, UNDEF);	/* undefined */ \
687 	    XXX(0x7c, UNDEF);	/* undefined */ \
688 	    UNI(0x7d, 0x200e);	/* LEFT-TO-RIGHT MARK */ \
689 	    UNI(0x7e, 0x200f);	/* RIGHT-TO-LEFT MARK */ \
690 	} \
691 	end_CODEPAGE()
692 	/* ISO Latin-2 is 8859-2 */
693 #define map_ISO_Latin_2(code) \
694 	begin_CODEPAGE(); \
695 	switch (code) { \
696 	    UNI(0x20, 0x00a0);	/* NO-BREAK SPACE */ \
697 	    UNI(0x21, 0x0104);	/* LATIN CAPITAL LETTER A WITH OGONEK */ \
698 	    UNI(0x22, 0x02d8);	/* BREVE */ \
699 	    UNI(0x23, 0x0141);	/* LATIN CAPITAL LETTER L WITH STROKE */ \
700 	    UNI(0x24, 0x00a4);	/* CURRENCY SIGN */ \
701 	    UNI(0x25, 0x013d);	/* LATIN CAPITAL LETTER L WITH CARON */ \
702 	    UNI(0x26, 0x015a);	/* LATIN CAPITAL LETTER S WITH ACUTE */ \
703 	    UNI(0x27, 0x00a7);	/* SECTION SIGN */ \
704 	    UNI(0x28, 0x00a8);	/* DIAERESIS */ \
705 	    UNI(0x29, 0x0160);	/* LATIN CAPITAL LETTER S WITH CARON */ \
706 	    UNI(0x2a, 0x015e);	/* LATIN CAPITAL LETTER S WITH CEDILLA */ \
707 	    UNI(0x2b, 0x0164);	/* LATIN CAPITAL LETTER T WITH CARON */ \
708 	    UNI(0x2c, 0x0179);	/* LATIN CAPITAL LETTER Z WITH ACUTE */ \
709 	    UNI(0x2d, 0x00ad);	/* SOFT HYPHEN */ \
710 	    UNI(0x2e, 0x017d);	/* LATIN CAPITAL LETTER Z WITH CARON */ \
711 	    UNI(0x2f, 0x017b);	/* LATIN CAPITAL LETTER Z WITH DOT ABOVE */ \
712 	    UNI(0x30, 0x00b0);	/* DEGREE SIGN */ \
713 	    UNI(0x31, 0x0105);	/* LATIN SMALL LETTER A WITH OGONEK */ \
714 	    UNI(0x32, 0x02db);	/* OGONEK */ \
715 	    UNI(0x33, 0x0142);	/* LATIN SMALL LETTER L WITH STROKE */ \
716 	    UNI(0x34, 0x00b4);	/* ACUTE ACCENT */ \
717 	    UNI(0x35, 0x013e);	/* LATIN SMALL LETTER L WITH CARON */ \
718 	    UNI(0x36, 0x015b);	/* LATIN SMALL LETTER S WITH ACUTE */ \
719 	    UNI(0x37, 0x02c7);	/* CARON */ \
720 	    UNI(0x38, 0x00b8);	/* CEDILLA */ \
721 	    UNI(0x39, 0x0161);	/* LATIN SMALL LETTER S WITH CARON */ \
722 	    UNI(0x3a, 0x015f);	/* LATIN SMALL LETTER S WITH CEDILLA */ \
723 	    UNI(0x3b, 0x0165);	/* LATIN SMALL LETTER T WITH CARON */ \
724 	    UNI(0x3c, 0x017a);	/* LATIN SMALL LETTER Z WITH ACUTE */ \
725 	    UNI(0x3d, 0x02dd);	/* DOUBLE ACUTE ACCENT */ \
726 	    UNI(0x3e, 0x017e);	/* LATIN SMALL LETTER Z WITH CARON */ \
727 	    UNI(0x3f, 0x017c);	/* LATIN SMALL LETTER Z WITH DOT ABOVE */ \
728 	    UNI(0x40, 0x0154);	/* LATIN CAPITAL LETTER R WITH ACUTE */ \
729 	    UNI(0x41, 0x00c1);	/* LATIN CAPITAL LETTER A WITH ACUTE */ \
730 	    UNI(0x42, 0x00c2);	/* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ \
731 	    UNI(0x43, 0x0102);	/* LATIN CAPITAL LETTER A WITH BREVE */ \
732 	    UNI(0x44, 0x00c4);	/* LATIN CAPITAL LETTER A WITH DIAERESIS */ \
733 	    UNI(0x45, 0x0139);	/* LATIN CAPITAL LETTER L WITH ACUTE */ \
734 	    UNI(0x46, 0x0106);	/* LATIN CAPITAL LETTER C WITH ACUTE */ \
735 	    UNI(0x47, 0x00c7);	/* LATIN CAPITAL LETTER C WITH CEDILLA */ \
736 	    UNI(0x48, 0x010c);	/* LATIN CAPITAL LETTER C WITH CARON */ \
737 	    UNI(0x49, 0x00c9);	/* LATIN CAPITAL LETTER E WITH ACUTE */ \
738 	    UNI(0x4a, 0x0118);	/* LATIN CAPITAL LETTER E WITH OGONEK */ \
739 	    UNI(0x4b, 0x00cb);	/* LATIN CAPITAL LETTER E WITH DIAERESIS */ \
740 	    UNI(0x4c, 0x011a);	/* LATIN CAPITAL LETTER E WITH CARON */ \
741 	    UNI(0x4d, 0x00cd);	/* LATIN CAPITAL LETTER I WITH ACUTE */ \
742 	    UNI(0x4e, 0x00ce);	/* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ \
743 	    UNI(0x4f, 0x010e);	/* LATIN CAPITAL LETTER D WITH CARON */ \
744 	    UNI(0x50, 0x0110);	/* LATIN CAPITAL LETTER D WITH STROKE */ \
745 	    UNI(0x51, 0x0143);	/* LATIN CAPITAL LETTER N WITH ACUTE */ \
746 	    UNI(0x52, 0x0147);	/* LATIN CAPITAL LETTER N WITH CARON */ \
747 	    UNI(0x53, 0x00d3);	/* LATIN CAPITAL LETTER O WITH ACUTE */ \
748 	    UNI(0x54, 0x00d4);	/* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ \
749 	    UNI(0x55, 0x0150);	/* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ \
750 	    UNI(0x56, 0x00d6);	/* LATIN CAPITAL LETTER O WITH DIAERESIS */ \
751 	    UNI(0x57, 0x00d7);	/* MULTIPLICATION SIGN */ \
752 	    UNI(0x58, 0x0158);	/* LATIN CAPITAL LETTER R WITH CARON */ \
753 	    UNI(0x59, 0x016e);	/* LATIN CAPITAL LETTER U WITH RING ABOVE */ \
754 	    UNI(0x5a, 0x00da);	/* LATIN CAPITAL LETTER U WITH ACUTE */ \
755 	    UNI(0x5b, 0x0170);	/* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ \
756 	    UNI(0x5c, 0x00dc);	/* LATIN CAPITAL LETTER U WITH DIAERESIS */ \
757 	    UNI(0x5d, 0x00dd);	/* LATIN CAPITAL LETTER Y WITH ACUTE */ \
758 	    UNI(0x5e, 0x0162);	/* LATIN CAPITAL LETTER T WITH CEDILLA */ \
759 	    UNI(0x5f, 0x00df);	/* LATIN SMALL LETTER SHARP S */ \
760 	    UNI(0x60, 0x0155);	/* LATIN SMALL LETTER R WITH ACUTE */ \
761 	    UNI(0x61, 0x00e1);	/* LATIN SMALL LETTER A WITH ACUTE */ \
762 	    UNI(0x62, 0x00e2);	/* LATIN SMALL LETTER A WITH CIRCUMFLEX */ \
763 	    UNI(0x63, 0x0103);	/* LATIN SMALL LETTER A WITH BREVE */ \
764 	    UNI(0x64, 0x00e4);	/* LATIN SMALL LETTER A WITH DIAERESIS */ \
765 	    UNI(0x65, 0x013a);	/* LATIN SMALL LETTER L WITH ACUTE */ \
766 	    UNI(0x66, 0x0107);	/* LATIN SMALL LETTER C WITH ACUTE */ \
767 	    UNI(0x67, 0x00e7);	/* LATIN SMALL LETTER C WITH CEDILLA */ \
768 	    UNI(0x68, 0x010d);	/* LATIN SMALL LETTER C WITH CARON */ \
769 	    UNI(0x69, 0x00e9);	/* LATIN SMALL LETTER E WITH ACUTE */ \
770 	    UNI(0x6a, 0x0119);	/* LATIN SMALL LETTER E WITH OGONEK */ \
771 	    UNI(0x6b, 0x00eb);	/* LATIN SMALL LETTER E WITH DIAERESIS */ \
772 	    UNI(0x6c, 0x011b);	/* LATIN SMALL LETTER E WITH CARON */ \
773 	    UNI(0x6d, 0x00ed);	/* LATIN SMALL LETTER I WITH ACUTE */ \
774 	    UNI(0x6e, 0x00ee);	/* LATIN SMALL LETTER I WITH CIRCUMFLEX */ \
775 	    UNI(0x6f, 0x010f);	/* LATIN SMALL LETTER D WITH CARON */ \
776 	    UNI(0x70, 0x0111);	/* LATIN SMALL LETTER D WITH STROKE */ \
777 	    UNI(0x71, 0x0144);	/* LATIN SMALL LETTER N WITH ACUTE */ \
778 	    UNI(0x72, 0x0148);	/* LATIN SMALL LETTER N WITH CARON */ \
779 	    UNI(0x73, 0x00f3);	/* LATIN SMALL LETTER O WITH ACUTE */ \
780 	    UNI(0x74, 0x00f4);	/* LATIN SMALL LETTER O WITH CIRCUMFLEX */ \
781 	    UNI(0x75, 0x0151);	/* LATIN SMALL LETTER O WITH DOUBLE ACUTE */ \
782 	    UNI(0x76, 0x00f6);	/* LATIN SMALL LETTER O WITH DIAERESIS */ \
783 	    UNI(0x77, 0x00f7);	/* DIVISION SIGN */ \
784 	    UNI(0x78, 0x0159);	/* LATIN SMALL LETTER R WITH CARON */ \
785 	    UNI(0x79, 0x016f);	/* LATIN SMALL LETTER U WITH RING ABOVE */ \
786 	    UNI(0x7a, 0x00fa);	/* LATIN SMALL LETTER U WITH ACUTE */ \
787 	    UNI(0x7b, 0x0171);	/* LATIN SMALL LETTER U WITH DOUBLE ACUTE */ \
788 	    UNI(0x7c, 0x00fc);	/* LATIN SMALL LETTER U WITH DIAERESIS */ \
789 	    UNI(0x7d, 0x00fd);	/* LATIN SMALL LETTER Y WITH ACUTE */ \
790 	    UNI(0x7e, 0x0163);	/* LATIN SMALL LETTER T WITH CEDILLA */ \
791 	    UNI(0x7f, 0x02d9);	/* DOT ABOVE */ \
792 	} \
793 	end_CODEPAGE()
794 	/* ISO Latin-5 is 8859-9 */
795 #define map_ISO_Latin_5(code) \
796 	begin_CODEPAGE(); \
797 	switch (code) { \
798 	    UNI(0x20, 0x00a0);	/* NO-BREAK SPACE */ \
799 	    UNI(0x21, 0x00a1);	/* INVERTED EXCLAMATION MARK */ \
800 	    UNI(0x22, 0x00a2);	/* CENT SIGN */ \
801 	    UNI(0x23, 0x00a3);	/* POUND SIGN */ \
802 	    UNI(0x24, 0x00a4);	/* CURRENCY SIGN */ \
803 	    UNI(0x25, 0x00a5);	/* YEN SIGN */ \
804 	    UNI(0x26, 0x00a6);	/* BROKEN BAR */ \
805 	    UNI(0x27, 0x00a7);	/* SECTION SIGN */ \
806 	    UNI(0x28, 0x00a8);	/* DIAERESIS */ \
807 	    UNI(0x29, 0x00a9);	/* COPYRIGHT SIGN */ \
808 	    UNI(0x2a, 0x00aa);	/* FEMININE ORDINAL INDICATOR */ \
809 	    UNI(0x2b, 0x00ab);	/* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
810 	    UNI(0x2c, 0x00ac);	/* NOT SIGN */ \
811 	    UNI(0x2d, 0x00ad);	/* SOFT HYPHEN */ \
812 	    UNI(0x2e, 0x00ae);	/* REGISTERED SIGN */ \
813 	    UNI(0x2f, 0x00af);	/* MACRON */ \
814 	    UNI(0x30, 0x00b0);	/* DEGREE SIGN */ \
815 	    UNI(0x31, 0x00b1);	/* PLUS-MINUS SIGN */ \
816 	    UNI(0x32, 0x00b2);	/* SUPERSCRIPT TWO */ \
817 	    UNI(0x33, 0x00b3);	/* SUPERSCRIPT THREE */ \
818 	    UNI(0x34, 0x00b4);	/* ACUTE ACCENT */ \
819 	    UNI(0x35, 0x00b5);	/* MICRO SIGN */ \
820 	    UNI(0x36, 0x00b6);	/* PILCROW SIGN */ \
821 	    UNI(0x37, 0x00b7);	/* MIDDLE DOT */ \
822 	    UNI(0x38, 0x00b8);	/* CEDILLA */ \
823 	    UNI(0x39, 0x00b9);	/* SUPERSCRIPT ONE */ \
824 	    UNI(0x3a, 0x00ba);	/* MASCULINE ORDINAL INDICATOR */ \
825 	    UNI(0x3b, 0x00bb);	/* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
826 	    UNI(0x3c, 0x00bc);	/* VULGAR FRACTION ONE QUARTER */ \
827 	    UNI(0x3d, 0x00bd);	/* VULGAR FRACTION ONE HALF */ \
828 	    UNI(0x3e, 0x00be);	/* VULGAR FRACTION THREE QUARTERS */ \
829 	    UNI(0x3f, 0x00bf);	/* INVERTED QUESTION MARK */ \
830 	    UNI(0x40, 0x00c0);	/* LATIN CAPITAL LETTER A WITH GRAVE */ \
831 	    UNI(0x41, 0x00c1);	/* LATIN CAPITAL LETTER A WITH ACUTE */ \
832 	    UNI(0x42, 0x00c2);	/* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ \
833 	    UNI(0x43, 0x00c3);	/* LATIN CAPITAL LETTER A WITH TILDE */ \
834 	    UNI(0x44, 0x00c4);	/* LATIN CAPITAL LETTER A WITH DIAERESIS */ \
835 	    UNI(0x45, 0x00c5);	/* LATIN CAPITAL LETTER A WITH RING ABOVE */ \
836 	    UNI(0x46, 0x00c6);	/* LATIN CAPITAL LETTER AE */ \
837 	    UNI(0x47, 0x00c7);	/* LATIN CAPITAL LETTER C WITH CEDILLA */ \
838 	    UNI(0x48, 0x00c8);	/* LATIN CAPITAL LETTER E WITH GRAVE */ \
839 	    UNI(0x49, 0x00c9);	/* LATIN CAPITAL LETTER E WITH ACUTE */ \
840 	    UNI(0x4a, 0x00ca);	/* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ \
841 	    UNI(0x4b, 0x00cb);	/* LATIN CAPITAL LETTER E WITH DIAERESIS */ \
842 	    UNI(0x4c, 0x00cc);	/* LATIN CAPITAL LETTER I WITH GRAVE */ \
843 	    UNI(0x4d, 0x00cd);	/* LATIN CAPITAL LETTER I WITH ACUTE */ \
844 	    UNI(0x4e, 0x00ce);	/* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ \
845 	    UNI(0x4f, 0x00cf);	/* LATIN CAPITAL LETTER I WITH DIAERESIS */ \
846 	    UNI(0x50, 0x011e);	/* LATIN CAPITAL LETTER G WITH BREVE */ \
847 	    UNI(0x51, 0x00d1);	/* LATIN CAPITAL LETTER N WITH TILDE */ \
848 	    UNI(0x52, 0x00d2);	/* LATIN CAPITAL LETTER O WITH GRAVE */ \
849 	    UNI(0x53, 0x00d3);	/* LATIN CAPITAL LETTER O WITH ACUTE */ \
850 	    UNI(0x54, 0x00d4);	/* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ \
851 	    UNI(0x55, 0x00d5);	/* LATIN CAPITAL LETTER O WITH TILDE */ \
852 	    UNI(0x56, 0x00d6);	/* LATIN CAPITAL LETTER O WITH DIAERESIS */ \
853 	    UNI(0x57, 0x00d7);	/* MULTIPLICATION SIGN */ \
854 	    UNI(0x58, 0x00d8);	/* LATIN CAPITAL LETTER O WITH STROKE */ \
855 	    UNI(0x59, 0x00d9);	/* LATIN CAPITAL LETTER U WITH GRAVE */ \
856 	    UNI(0x5a, 0x00da);	/* LATIN CAPITAL LETTER U WITH ACUTE */ \
857 	    UNI(0x5b, 0x00db);	/* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ \
858 	    UNI(0x5c, 0x00dc);	/* LATIN CAPITAL LETTER U WITH DIAERESIS */ \
859 	    UNI(0x5d, 0x0130);	/* LATIN CAPITAL LETTER I WITH DOT ABOVE */ \
860 	    UNI(0x5e, 0x015e);	/* LATIN CAPITAL LETTER S WITH CEDILLA */ \
861 	    UNI(0x5f, 0x00df);	/* LATIN SMALL LETTER SHARP S */ \
862 	    UNI(0x60, 0x00e0);	/* LATIN SMALL LETTER A WITH GRAVE */ \
863 	    UNI(0x61, 0x00e1);	/* LATIN SMALL LETTER A WITH ACUTE */ \
864 	    UNI(0x62, 0x00e2);	/* LATIN SMALL LETTER A WITH CIRCUMFLEX */ \
865 	    UNI(0x63, 0x00e3);	/* LATIN SMALL LETTER A WITH TILDE */ \
866 	    UNI(0x64, 0x00e4);	/* LATIN SMALL LETTER A WITH DIAERESIS */ \
867 	    UNI(0x65, 0x00e5);	/* LATIN SMALL LETTER A WITH RING ABOVE */ \
868 	    UNI(0x66, 0x00e6);	/* LATIN SMALL LETTER AE */ \
869 	    UNI(0x67, 0x00e7);	/* LATIN SMALL LETTER C WITH CEDILLA */ \
870 	    UNI(0x68, 0x00e8);	/* LATIN SMALL LETTER E WITH GRAVE */ \
871 	    UNI(0x69, 0x00e9);	/* LATIN SMALL LETTER E WITH ACUTE */ \
872 	    UNI(0x6a, 0x00ea);	/* LATIN SMALL LETTER E WITH CIRCUMFLEX */ \
873 	    UNI(0x6b, 0x00eb);	/* LATIN SMALL LETTER E WITH DIAERESIS */ \
874 	    UNI(0x6c, 0x00ec);	/* LATIN SMALL LETTER I WITH GRAVE */ \
875 	    UNI(0x6d, 0x00ed);	/* LATIN SMALL LETTER I WITH ACUTE */ \
876 	    UNI(0x6e, 0x00ee);	/* LATIN SMALL LETTER I WITH CIRCUMFLEX */ \
877 	    UNI(0x6f, 0x00ef);	/* LATIN SMALL LETTER I WITH DIAERESIS */ \
878 	    UNI(0x70, 0x011f);	/* LATIN SMALL LETTER G WITH BREVE */ \
879 	    UNI(0x71, 0x00f1);	/* LATIN SMALL LETTER N WITH TILDE */ \
880 	    UNI(0x72, 0x00f2);	/* LATIN SMALL LETTER O WITH GRAVE */ \
881 	    UNI(0x73, 0x00f3);	/* LATIN SMALL LETTER O WITH ACUTE */ \
882 	    UNI(0x74, 0x00f4);	/* LATIN SMALL LETTER O WITH CIRCUMFLEX */ \
883 	    UNI(0x75, 0x00f5);	/* LATIN SMALL LETTER O WITH TILDE */ \
884 	    UNI(0x76, 0x00f6);	/* LATIN SMALL LETTER O WITH DIAERESIS */ \
885 	    UNI(0x77, 0x00f7);	/* DIVISION SIGN */ \
886 	    UNI(0x78, 0x00f8);	/* LATIN SMALL LETTER O WITH STROKE */ \
887 	    UNI(0x79, 0x00f9);	/* LATIN SMALL LETTER U WITH GRAVE */ \
888 	    UNI(0x7a, 0x00fa);	/* LATIN SMALL LETTER U WITH ACUTE */ \
889 	    UNI(0x7b, 0x00fb);	/* LATIN SMALL LETTER U WITH CIRCUMFLEX */ \
890 	    UNI(0x7c, 0x00fc);	/* LATIN SMALL LETTER U WITH DIAERESIS */ \
891 	    UNI(0x7d, 0x0131);	/* LATIN SMALL LETTER DOTLESS I */ \
892 	    UNI(0x7e, 0x015f);	/* LATIN SMALL LETTER S WITH CEDILLA */ \
893 	    UNI(0x7f, 0x00ff);	/* LATIN SMALL LETTER Y WITH DIAERESIS */ \
894 	} \
895 	end_CODEPAGE()
896 	/* DEC Cyrillic from screenshot */
897 #define map_DEC_Cyrillic(code) \
898 	begin_CODEPAGE(); \
899 	switch (code) { \
900 	    UNI(0x20, 0x00a0);	/* NO-BREAK SPACE */ \
901 	    XXX(0x21, UNDEF);	/* undefined */ \
902 	    XXX(0x22, UNDEF);	/* undefined */ \
903 	    XXX(0x23, UNDEF);	/* undefined */ \
904 	    XXX(0x24, UNDEF);	/* undefined */ \
905 	    XXX(0x25, UNDEF);	/* undefined */ \
906 	    XXX(0x26, UNDEF);	/* undefined */ \
907 	    XXX(0x27, UNDEF);	/* undefined */ \
908 	    XXX(0x28, UNDEF);	/* undefined */ \
909 	    XXX(0x29, UNDEF);	/* undefined */ \
910 	    XXX(0x2a, UNDEF);	/* undefined */ \
911 	    XXX(0x2b, UNDEF);	/* undefined */ \
912 	    XXX(0x2c, UNDEF);	/* undefined */ \
913 	    XXX(0x2d, UNDEF);	/* undefined */ \
914 	    XXX(0x2e, UNDEF);	/* undefined */ \
915 	    XXX(0x2f, UNDEF);	/* undefined */ \
916 	    XXX(0x30, UNDEF);	/* undefined */ \
917 	    XXX(0x31, UNDEF);	/* undefined */ \
918 	    XXX(0x32, UNDEF);	/* undefined */ \
919 	    XXX(0x33, UNDEF);	/* undefined */ \
920 	    XXX(0x34, UNDEF);	/* undefined */ \
921 	    XXX(0x35, UNDEF);	/* undefined */ \
922 	    XXX(0x36, UNDEF);	/* undefined */ \
923 	    XXX(0x37, UNDEF);	/* undefined */ \
924 	    XXX(0x38, UNDEF);	/* undefined */ \
925 	    XXX(0x39, UNDEF);	/* undefined */ \
926 	    XXX(0x3a, UNDEF);	/* undefined */ \
927 	    XXX(0x3b, UNDEF);	/* undefined */ \
928 	    XXX(0x3c, UNDEF);	/* undefined */ \
929 	    XXX(0x3d, UNDEF);	/* undefined */ \
930 	    XXX(0x3e, UNDEF);	/* undefined */ \
931 	    XXX(0x3f, UNDEF);	/* undefined */ \
932 	    \
933 	    UNI(0x40, 0x044e);	/* CYRILLIC SMALL LETTER YU */ \
934 	    UNI(0x41, 0x0430);	/* CYRILLIC SMALL LETTER A */ \
935 	    UNI(0x42, 0x0431);	/* CYRILLIC SMALL LETTER BE */ \
936 	    UNI(0x43, 0x0446);	/* CYRILLIC SMALL LETTER TSE */ \
937 	    UNI(0x44, 0x0434);	/* CYRILLIC SMALL LETTER DE */ \
938 	    UNI(0x45, 0x0435);	/* CYRILLIC SMALL LETTER IE */ \
939 	    UNI(0x46, 0x0444);	/* CYRILLIC SMALL LETTER EF */ \
940 	    UNI(0x47, 0x0433);	/* CYRILLIC SMALL LETTER GHE */ \
941 	    UNI(0x48, 0x0445);	/* CYRILLIC SMALL LETTER HA */ \
942 	    UNI(0x49, 0x0438);	/* CYRILLIC SMALL LETTER I */ \
943 	    UNI(0x4a, 0x0439);	/* CYRILLIC SMALL LETTER SHORT I */ \
944 	    UNI(0x4b, 0x043a);	/* CYRILLIC SMALL LETTER KA */ \
945 	    UNI(0x4c, 0x043b);	/* CYRILLIC SMALL LETTER EL */ \
946 	    UNI(0x4d, 0x043c);	/* CYRILLIC SMALL LETTER EM */ \
947 	    UNI(0x4e, 0x043d);	/* CYRILLIC SMALL LETTER EN */ \
948 	    UNI(0x4f, 0x043e);	/* CYRILLIC SMALL LETTER O */ \
949 	    UNI(0x50, 0x043f);	/* CYRILLIC SMALL LETTER PE */ \
950 	    UNI(0x51, 0x044f);	/* CYRILLIC SMALL LETTER YA */ \
951 	    UNI(0x52, 0x0440);	/* CYRILLIC SMALL LETTER ER */ \
952 	    UNI(0x53, 0x0441);	/* CYRILLIC SMALL LETTER ES */ \
953 	    UNI(0x54, 0x0442);	/* CYRILLIC SMALL LETTER TE */ \
954 	    UNI(0x55, 0x0443);	/* CYRILLIC SMALL LETTER U */ \
955 	    UNI(0x56, 0x0436);	/* CYRILLIC SMALL LETTER ZHE */ \
956 	    UNI(0x57, 0x0432);	/* CYRILLIC SMALL LETTER VE */ \
957 	    UNI(0x58, 0x044c);	/* CYRILLIC SMALL LETTER SOFT SIGN */ \
958 	    UNI(0x59, 0x044b);	/* CYRILLIC SMALL LETTER YERU */ \
959 	    UNI(0x5a, 0x0437);	/* CYRILLIC SMALL LETTER ZE */ \
960 	    UNI(0x5b, 0x0448);	/* CYRILLIC SMALL LETTER SHA */ \
961 	    UNI(0x5c, 0x044d);	/* CYRILLIC SMALL LETTER E */ \
962 	    UNI(0x5d, 0x0449);	/* CYRILLIC SMALL LETTER SHCHA */ \
963 	    UNI(0x5e, 0x0447);	/* CYRILLIC SMALL LETTER CHE */ \
964 	    UNI(0x5f, 0x044a);	/* CYRILLIC SMALL LETTER HARD SIGN */ \
965 	    \
966 	    UNI(0x60, 0x042e);	/* CYRILLIC CAPITAL LETTER YU */ \
967 	    UNI(0x61, 0x0410);	/* CYRILLIC CAPITAL LETTER A */ \
968 	    UNI(0x62, 0x0411);	/* CYRILLIC CAPITAL LETTER BE */ \
969 	    UNI(0x63, 0x0426);	/* CYRILLIC CAPITAL LETTER TSE */ \
970 	    UNI(0x64, 0x0414);	/* CYRILLIC CAPITAL LETTER DE */ \
971 	    UNI(0x65, 0x0415);	/* CYRILLIC CAPITAL LETTER IE */ \
972 	    UNI(0x66, 0x0424);	/* CYRILLIC CAPITAL LETTER EF */ \
973 	    UNI(0x67, 0x0413);	/* CYRILLIC CAPITAL LETTER GHE */ \
974 	    UNI(0x68, 0x0425);	/* CYRILLIC CAPITAL LETTER HA */ \
975 	    UNI(0x69, 0x0418);	/* CYRILLIC CAPITAL LETTER I */ \
976 	    UNI(0x6a, 0x0419);	/* CYRILLIC CAPITAL LETTER SHORT I */ \
977 	    UNI(0x6b, 0x041a);	/* CYRILLIC CAPITAL LETTER KA */ \
978 	    UNI(0x6c, 0x041b);	/* CYRILLIC CAPITAL LETTER EL */ \
979 	    UNI(0x6d, 0x041c);	/* CYRILLIC CAPITAL LETTER EM */ \
980 	    UNI(0x6e, 0x041d);	/* CYRILLIC CAPITAL LETTER EN */ \
981 	    UNI(0x6f, 0x041e);	/* CYRILLIC CAPITAL LETTER O */ \
982 	    UNI(0x70, 0x041f);	/* CYRILLIC CAPITAL LETTER PE */ \
983 	    UNI(0x71, 0x042f);	/* CYRILLIC CAPITAL LETTER YA */ \
984 	    UNI(0x72, 0x0420);	/* CYRILLIC CAPITAL LETTER ER */ \
985 	    UNI(0x73, 0x0421);	/* CYRILLIC CAPITAL LETTER ES */ \
986 	    UNI(0x74, 0x0422);	/* CYRILLIC CAPITAL LETTER TE */ \
987 	    UNI(0x75, 0x0423);	/* CYRILLIC CAPITAL LETTER U */ \
988 	    UNI(0x76, 0x0416);	/* CYRILLIC CAPITAL LETTER ZHE */ \
989 	    UNI(0x77, 0x0412);	/* CYRILLIC CAPITAL LETTER VE */ \
990 	    UNI(0x78, 0x042c);	/* CYRILLIC CAPITAL LETTER SOFT SIGN */ \
991 	    UNI(0x79, 0x042b);	/* CYRILLIC CAPITAL LETTER YERU */ \
992 	    UNI(0x7a, 0x0417);	/* CYRILLIC CAPITAL LETTER ZE */ \
993 	    UNI(0x7b, 0x0428);	/* CYRILLIC CAPITAL LETTER SHA */ \
994 	    UNI(0x7c, 0x042d);	/* CYRILLIC CAPITAL LETTER E */ \
995 	    UNI(0x7d, 0x0429);	/* CYRILLIC CAPITAL LETTER SHCHA */ \
996 	    UNI(0x7e, 0x0427);	/* CYRILLIC CAPITAL LETTER CHE */ \
997 	    XXX(0x7f, UNDEF); \
998 	    \
999 	} \
1000 	end_CODEPAGE()
1001 	/* figure A-24 "DEC Greek Supplemental Character Set" */
1002 #define map_DEC_Greek_Supp(code)	\
1003 	begin_CODEPAGE(); \
1004 	switch (code) { \
1005 	    MAP(0x20, 0x00a0);	/* NO-BREAK SPACE */ \
1006 	    UNI(0x21, 0x00a1);	/* LEFT SINGLE QUOTATION MARK */ \
1007 	    UNI(0x22, 0x00a2);	/* RIGHT SINGLE QUOTATION MARK */ \
1008 	    UNI(0x23, 0x00a3);	/* POUND SIGN */ \
1009 	    XXX(0x24, UNDEF);	/* EURO SIGN */ \
1010 	    UNI(0x25, 0x00a5);	/* YEN SIGN */ \
1011 	    XXX(0x26, UNDEF);	/* BROKEN BAR */ \
1012 	    UNI(0x27, 0x00a7);	/* SECTION SIGN */ \
1013 	    UNI(0x28, 0x00a4);	/* CURRENCY SIGN */ \
1014 	    UNI(0x29, 0x00a9);	/* COPYRIGHT SIGN */ \
1015 	    UNI(0x2a, 0x00aa);	/* FEMININE ORDINAL INDICATOR */ \
1016 	    UNI(0x2b, 0x00ab);	/* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
1017 	    XXX(0x2c, UNDEF);	/* reserved */ \
1018 	    XXX(0x2d, UNDEF);	/* reserved */ \
1019 	    XXX(0x2e, UNDEF);	/* reserved */ \
1020 	    XXX(0x2f, UNDEF);	/* reserved */ \
1021 	    UNI(0x30, 0x00b0);	/* DEGREE SIGN */ \
1022 	    UNI(0x31, 0x00b1);	/* PLUS-MINUS SIGN */ \
1023 	    UNI(0x32, 0x00b2);	/* SUPERSCRIPT TWO */ \
1024 	    UNI(0x33, 0x00b3);	/* SUPERSCRIPT THREE */ \
1025 	    XXX(0x34, UNDEF);	/* reserved */ \
1026 	    UNI(0x35, 0x00b5);	/* MICRO SIGN */ \
1027 	    UNI(0x36, 0x00b6);	/* PILCROW SIGN */ \
1028 	    UNI(0x37, 0x00b7);	/* MIDDLE DOT */ \
1029 	    XXX(0x38, UNDEF);	/* reserved */ \
1030 	    UNI(0x39, 0x00b9);	/* SUPERSCRIPT ONE */ \
1031 	    UNI(0x3a, 0x00ba);	/* MASCULINE ORDINAL INDICATOR */ \
1032 	    UNI(0x3b, 0x00bb);	/* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
1033 	    UNI(0x3c, 0x00bc);	/* VULGAR FRACTION ONE QUARTER */ \
1034 	    UNI(0x3d, 0x00bd);	/* VULGAR FRACTION ONE HALF */ \
1035 	    XXX(0x3e, UNDEF);	/* reserved */ \
1036 	    UNI(0x3f, 0x00BF);  /* INVERTED QUESTION MARK */ \
1037 	    UNI(0x40, 0x03ca);	/* GREEK SMALL LETTER IOTA WITH DIALYTIKA */ \
1038 	    UNI(0x41, 0x0391);	/* GREEK CAPITAL LETTER ALPHA */ \
1039 	    UNI(0x42, 0x0392);	/* GREEK CAPITAL LETTER BETA */ \
1040 	    UNI(0x43, 0x0393);	/* GREEK CAPITAL LETTER GAMMA */ \
1041 	    UNI(0x44, 0x0394);	/* GREEK CAPITAL LETTER DELTA */ \
1042 	    UNI(0x45, 0x0395);	/* GREEK CAPITAL LETTER EPSILON */ \
1043 	    UNI(0x46, 0x0396);	/* GREEK CAPITAL LETTER ZETA */ \
1044 	    UNI(0x47, 0x0397);	/* GREEK CAPITAL LETTER ETA */ \
1045 	    UNI(0x48, 0x0398);	/* GREEK CAPITAL LETTER THETA */ \
1046 	    UNI(0x49, 0x0399);	/* GREEK CAPITAL LETTER IOTA */ \
1047 	    UNI(0x4a, 0x039a);	/* GREEK CAPITAL LETTER KAPPA */ \
1048 	    UNI(0x4b, 0x039b);	/* GREEK CAPITAL LETTER LAMDA */ \
1049 	    UNI(0x4c, 0x039c);	/* GREEK CAPITAL LETTER MU */ \
1050 	    UNI(0x4d, 0x039d);	/* GREEK CAPITAL LETTER NU */ \
1051 	    UNI(0x4e, 0x039e);	/* GREEK CAPITAL LETTER XI */ \
1052 	    UNI(0x4f, 0x039f);	/* GREEK CAPITAL LETTER OMICRON */ \
1053 	    XXX(0x50, UNDEF);	/* reserved */ \
1054 	    UNI(0x51, 0x03a0);	/* GREEK CAPITAL LETTER PI */ \
1055 	    UNI(0x52, 0x03a1);	/* GREEK CAPITAL LETTER RHO */ \
1056 	    UNI(0x53, 0x03a3);	/* GREEK CAPITAL LETTER SIGMA */ \
1057 	    UNI(0x54, 0x03a4);	/* GREEK CAPITAL LETTER TAU */ \
1058 	    UNI(0x55, 0x03a5);	/* GREEK CAPITAL LETTER UPSILON */ \
1059 	    UNI(0x56, 0x03a6);	/* GREEK CAPITAL LETTER PHI */ \
1060 	    UNI(0x57, 0x03a7);	/* GREEK CAPITAL LETTER CHI */ \
1061 	    UNI(0x58, 0x03a8);	/* GREEK CAPITAL LETTER PSI */ \
1062 	    UNI(0x59, 0x03a9);	/* GREEK CAPITAL LETTER OMEGA */ \
1063 	    UNI(0x5a, 0x03ac);	/* GREEK SMALL LETTER ALPHA WITH TONOS */ \
1064 	    UNI(0x5b, 0x03ad);	/* GREEK SMALL LETTER EPSILON WITH TONOS */ \
1065 	    UNI(0x5c, 0x03ae);	/* GREEK SMALL LETTER ETA WITH TONOS */ \
1066 	    UNI(0x5d, 0x03af);	/* GREEK SMALL LETTER IOTA WITH TONOS */ \
1067 	    XXX(0x5e, UNDEF);	/* reserved */ \
1068 	    UNI(0x5f, 0x03cc);	/* GREEK SMALL LETTER OMICRON WITH TONOS */ \
1069 	    UNI(0x60, 0x03cb);	/* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ \
1070 	    UNI(0x61, 0x03b1);	/* GREEK SMALL LETTER ALPHA */ \
1071 	    UNI(0x62, 0x03b2);	/* GREEK SMALL LETTER BETA */ \
1072 	    UNI(0x63, 0x03b3);	/* GREEK SMALL LETTER GAMMA */ \
1073 	    UNI(0x64, 0x03b4);	/* GREEK SMALL LETTER DELTA */ \
1074 	    UNI(0x65, 0x03b5);	/* GREEK SMALL LETTER EPSILON */ \
1075 	    UNI(0x66, 0x03b6);	/* GREEK SMALL LETTER ZETA */ \
1076 	    UNI(0x67, 0x03b7);	/* GREEK SMALL LETTER ETA */ \
1077 	    UNI(0x68, 0x03b8);	/* GREEK SMALL LETTER THETA */ \
1078 	    UNI(0x69, 0x03b9);	/* GREEK SMALL LETTER IOTA */ \
1079 	    UNI(0x6a, 0x03ba);	/* GREEK SMALL LETTER KAPPA */ \
1080 	    UNI(0x6b, 0x03bb);	/* GREEK SMALL LETTER LAMDA */ \
1081 	    UNI(0x6c, 0x03bc);	/* GREEK SMALL LETTER MU */ \
1082 	    UNI(0x6d, 0x03bd);	/* GREEK SMALL LETTER NU */ \
1083 	    UNI(0x6e, 0x03be);	/* GREEK SMALL LETTER XI */ \
1084 	    UNI(0x6f, 0x03bf);	/* GREEK SMALL LETTER OMICRON */ \
1085 	    XXX(0x70, UNDEF);	/* reserved */ \
1086 	    UNI(0x71, 0x03c0);	/* GREEK SMALL LETTER PI */ \
1087 	    UNI(0x72, 0x03c1);	/* GREEK SMALL LETTER RHO */ \
1088 	    UNI(0x73, 0x03c3);	/* GREEK SMALL LETTER SIGMA */ \
1089 	    UNI(0x74, 0x03c4);	/* GREEK SMALL LETTER TAU */ \
1090 	    UNI(0x75, 0x03c5);	/* GREEK SMALL LETTER UPSILON */ \
1091 	    UNI(0x76, 0x03c6);	/* GREEK SMALL LETTER PHI */ \
1092 	    UNI(0x77, 0x03c7);	/* GREEK SMALL LETTER CHI */ \
1093 	    UNI(0x78, 0x03c8);	/* GREEK SMALL LETTER PSI */ \
1094 	    UNI(0x79, 0x03c9);	/* GREEK SMALL LETTER OMEGA */ \
1095 	    UNI(0x7a, 0x03c2);	/* GREEK SMALL LETTER FINAL SIGMA */ \
1096 	    UNI(0x7b, 0x03cd);	/* GREEK SMALL LETTER UPSILON WITH TONOS */ \
1097 	    UNI(0x7c, 0x03ce);	/* GREEK SMALL LETTER OMEGA WITH TONOS */ \
1098 	    UNI(0x7d, 0x0384);	/* GREEK TONOS */ \
1099 	    XXX(0x7e, UNDEF);	/* reserved */ \
1100 	} \
1101 	end_CODEPAGE()
1102 	/* figure A-22 "DEC Hebrew Supplemental Character Set" */
1103 #define map_DEC_Hebrew_Supp(code) \
1104 	begin_CODEPAGE(); \
1105 	switch (code) { \
1106 	    UNI(0x21, 0x00a1);	/* INVERTED EXCLAMATION MARK */ \
1107 	    UNI(0x22, 0x00a2);	/* CENT SIGN */ \
1108 	    UNI(0x23, 0x00a3);	/* POUND SIGN */ \
1109 	    XXX(0x24, UNDEF);	/* CURRENCY SIGN */ \
1110 	    UNI(0x25, 0x00a5);	/* YEN SIGN */ \
1111 	    XXX(0x26, UNDEF);	/* BROKEN BAR */ \
1112 	    UNI(0x27, 0x00a7);	/* SECTION SIGN */ \
1113 	    UNI(0x28, 0x00a8);	/* DIAERESIS */ \
1114 	    UNI(0x29, 0x00a9);	/* COPYRIGHT SIGN */ \
1115 	    UNI(0x2a, 0x00d7);	/* MULTIPLICATION SIGN */ \
1116 	    UNI(0x2b, 0x00ab);	/* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
1117 	    XXX(0x2c, UNDEF);	/* NOT SIGN */ \
1118 	    XXX(0x2d, UNDEF);	/* SOFT HYPHEN */ \
1119 	    XXX(0x2e, UNDEF);	/* REGISTERED SIGN */ \
1120 	    XXX(0x2f, UNDEF);	/* MACRON */ \
1121 	    UNI(0x30, 0x00b0);	/* DEGREE SIGN */ \
1122 	    UNI(0x31, 0x00b1);	/* PLUS-MINUS SIGN */ \
1123 	    UNI(0x32, 0x00b2);	/* SUPERSCRIPT TWO */ \
1124 	    UNI(0x33, 0x00b3);	/* SUPERSCRIPT THREE */ \
1125 	    XXX(0x34, UNDEF);	/* ACUTE ACCENT */ \
1126 	    UNI(0x35, 0x00b5);	/* MICRO SIGN */ \
1127 	    UNI(0x36, 0x00b6);	/* PILCROW SIGN */ \
1128 	    UNI(0x37, 0x00b7);	/* MIDDLE DOT */ \
1129 	    XXX(0x38, UNDEF);	/* CEDILLA */ \
1130 	    UNI(0x39, 0x00b9);	/* SUPERSCRIPT ONE */ \
1131 	    UNI(0x3a, 0x00f7);	/* DIVISION SIGN */ \
1132 	    UNI(0x3b, 0x00bb);	/* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
1133 	    UNI(0x3c, 0x00bc);	/* VULGAR FRACTION ONE QUARTER */ \
1134 	    UNI(0x3d, 0x00bd);	/* VULGAR FRACTION ONE HALF */ \
1135 	    XXX(0x3e, UNDEF);	/* VULGAR FRACTION THREE QUARTERS */ \
1136 	    UNI(0x3f, 0x00bf);	/* INVERTED QUESTION MARK */ \
1137 	    XXX(0x40, UNDEF);	/* reserved */ \
1138 	    XXX(0x41, UNDEF);	/* reserved */ \
1139 	    XXX(0x42, UNDEF);	/* reserved */ \
1140 	    XXX(0x43, UNDEF);	/* reserved */ \
1141 	    XXX(0x44, UNDEF);	/* reserved */ \
1142 	    XXX(0x45, UNDEF);	/* reserved */ \
1143 	    XXX(0x46, UNDEF);	/* reserved */ \
1144 	    XXX(0x47, UNDEF);	/* reserved */ \
1145 	    XXX(0x48, UNDEF);	/* reserved */ \
1146 	    XXX(0x49, UNDEF);	/* reserved */ \
1147 	    XXX(0x4a, UNDEF);	/* reserved */ \
1148 	    XXX(0x4b, UNDEF);	/* reserved */ \
1149 	    XXX(0x4c, UNDEF);	/* reserved */ \
1150 	    XXX(0x4d, UNDEF);	/* reserved */ \
1151 	    XXX(0x4e, UNDEF);	/* reserved */ \
1152 	    XXX(0x4f, UNDEF);	/* reserved */ \
1153 	    XXX(0x50, UNDEF);	/* reserved */ \
1154 	    XXX(0x51, UNDEF);	/* reserved */ \
1155 	    XXX(0x52, UNDEF);	/* reserved */ \
1156 	    XXX(0x53, UNDEF);	/* reserved */ \
1157 	    XXX(0x54, UNDEF);	/* reserved */ \
1158 	    XXX(0x55, UNDEF);	/* reserved */ \
1159 	    XXX(0x56, UNDEF);	/* reserved */ \
1160 	    XXX(0x57, UNDEF);	/* reserved */ \
1161 	    XXX(0x58, UNDEF);	/* reserved */ \
1162 	    XXX(0x59, UNDEF);	/* reserved */ \
1163 	    XXX(0x5a, UNDEF);	/* reserved */ \
1164 	    XXX(0x5b, UNDEF);	/* reserved */ \
1165 	    XXX(0x5c, UNDEF);	/* reserved */ \
1166 	    XXX(0x5d, UNDEF);	/* reserved */ \
1167 	    XXX(0x5e, UNDEF);	/* reserved */ \
1168 	    XXX(0x5f, UNDEF);	/* reserved */ \
1169 	    UNI(0x60, 0x05d0);	/* HEBREW LETTER ALEF */ \
1170 	    UNI(0x61, 0x05d1);	/* HEBREW LETTER BET */ \
1171 	    UNI(0x62, 0x05d2);	/* HEBREW LETTER GIMEL */ \
1172 	    UNI(0x63, 0x05d3);	/* HEBREW LETTER DALET */ \
1173 	    UNI(0x64, 0x05d4);	/* HEBREW LETTER HE */ \
1174 	    UNI(0x65, 0x05d5);	/* HEBREW LETTER VAV */ \
1175 	    UNI(0x66, 0x05d6);	/* HEBREW LETTER ZAYIN */ \
1176 	    UNI(0x67, 0x05d7);	/* HEBREW LETTER HET */ \
1177 	    UNI(0x68, 0x05d8);	/* HEBREW LETTER TET */ \
1178 	    UNI(0x69, 0x05d9);	/* HEBREW LETTER YOD */ \
1179 	    UNI(0x6a, 0x05da);	/* HEBREW LETTER FINAL KAF */ \
1180 	    UNI(0x6b, 0x05db);	/* HEBREW LETTER KAF */ \
1181 	    UNI(0x6c, 0x05dc);	/* HEBREW LETTER LAMED */ \
1182 	    UNI(0x6d, 0x05dd);	/* HEBREW LETTER FINAL MEM */ \
1183 	    UNI(0x6e, 0x05de);	/* HEBREW LETTER MEM */ \
1184 	    UNI(0x6f, 0x05df);	/* HEBREW LETTER FINAL NUN */ \
1185 	    UNI(0x70, 0x05e0);	/* HEBREW LETTER NUN */ \
1186 	    UNI(0x71, 0x05e1);	/* HEBREW LETTER SAMEKH */ \
1187 	    UNI(0x72, 0x05e2);	/* HEBREW LETTER AYIN */ \
1188 	    UNI(0x73, 0x05e3);	/* HEBREW LETTER FINAL PE */ \
1189 	    UNI(0x74, 0x05e4);	/* HEBREW LETTER PE */ \
1190 	    UNI(0x75, 0x05e5);	/* HEBREW LETTER FINAL TSADI */ \
1191 	    UNI(0x76, 0x05e6);	/* HEBREW LETTER TSADI */ \
1192 	    UNI(0x77, 0x05e7);	/* HEBREW LETTER QOF */ \
1193 	    UNI(0x78, 0x05e8);	/* HEBREW LETTER RESH */ \
1194 	    UNI(0x79, 0x05e9);	/* HEBREW LETTER SHIN */ \
1195 	    UNI(0x7a, 0x05ea);	/* HEBREW LETTER TAV */ \
1196 	    XXX(0x7b, UNDEF);	/* reserved */ \
1197 	    XXX(0x7c, UNDEF);	/* reserved */ \
1198 	    XXX(0x7d, UNDEF);	/* reserved */ \
1199 	    XXX(0x7e, UNDEF);	/* reserved */ \
1200 	} \
1201 	end_CODEPAGE()
1202 	/* figure A-27 "DEC 8-Bit Turkish Supplemental Character Set" */
1203 #define map_DEC_Turkish_Supp(code) \
1204 	begin_CODEPAGE(); \
1205 	switch (code) { \
1206 	    UNI(0x21, 0x00A1);	/* INVERTED EXCLAMATION MARK */ \
1207 	    UNI(0x22, 0x00A2);	/* CENT SIGN */ \
1208 	    UNI(0x23, 0x00A3);	/* POUND SIGN */ \
1209 	    XXX(0x24, UNDEF);	/* reserved */ \
1210 	    UNI(0x25, 0x00A5);	/* YEN SIGN */ \
1211 	    XXX(0x26, UNDEF);	/* reserved */ \
1212 	    UNI(0x27, 0x00A7);	/* SECTION SIGN */ \
1213 	    UNI(0x28, 0x00A8);	/* DIAERESIS */ \
1214 	    UNI(0x29, 0x00A9);	/* COPYRIGHT SIGN */ \
1215 	    UNI(0x2A, 0x00AA);	/* FEMININE ORDINAL INDICATOR */ \
1216 	    UNI(0x2B, 0x00AB);	/* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
1217 	    XXX(0x2C, UNDEF);	/* reserved */ \
1218 	    XXX(0x2D, UNDEF);	/* reserved */ \
1219 	    UNI(0x2E, 0x0130);	/* LATIN CAPITAL LETTER I WITH DOT ABOVE */ \
1220 	    XXX(0x2F, UNDEF);	/* reserved */ \
1221 	    UNI(0x30, 0x00B0);	/* DEGREE SIGN */ \
1222 	    UNI(0x31, 0x00B1);	/* PLUS-MINUS SIGN */ \
1223 	    UNI(0x32, 0x00B2);	/* SUPERSCRIPT TWO */ \
1224 	    UNI(0x33, 0x00B3);	/* SUPERSCRIPT THREE */ \
1225 	    XXX(0x34, UNDEF);	/* reserved */ \
1226 	    UNI(0x35, 0x00B5);	/* MICRO SIGN */ \
1227 	    UNI(0x36, 0x00B6);	/* PILCROW SIGN */ \
1228 	    UNI(0x37, 0x00B7);	/* MIDDLE DOT */ \
1229 	    XXX(0x38, UNDEF);	/* reserved */ \
1230 	    UNI(0x39, 0x00B9);	/* SUPERSCRIPT ONE */ \
1231 	    UNI(0x3A, 0x00BA);	/* MASCULINE ORDINAL INDICATOR */ \
1232 	    UNI(0x3B, 0x00BB);	/* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \
1233 	    UNI(0x3C, 0x00BC);	/* VULGAR FRACTION ONE QUARTER */ \
1234 	    UNI(0x3D, 0x00BD);	/* VULGAR FRACTION ONE HALF */ \
1235 	    UNI(0x3E, 0x0131);	/* LATIN SMALL LETTER DOTLESS I */ \
1236 	    UNI(0x3F, 0x00BF);	/* INVERTED QUESTION MARK */ \
1237 	    UNI(0x40, 0x00C0);	/* LATIN CAPITAL LETTER A WITH GRAVE */ \
1238 	    UNI(0x41, 0x00C1);	/* LATIN CAPITAL LETTER A WITH ACUTE */ \
1239 	    UNI(0x42, 0x00C2);	/* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ \
1240 	    UNI(0x43, 0x00C3);	/* LATIN CAPITAL LETTER A WITH TILDE */ \
1241 	    UNI(0x44, 0x00C4);	/* LATIN CAPITAL LETTER A WITH DIAERESIS */ \
1242 	    UNI(0x45, 0x00C5);	/* LATIN CAPITAL LETTER A WITH RING ABOVE */ \
1243 	    UNI(0x46, 0x00C6);	/* LATIN CAPITAL LETTER AE */ \
1244 	    UNI(0x47, 0x00C7);	/* LATIN CAPITAL LETTER C WITH CEDILLA */ \
1245 	    UNI(0x48, 0x00C8);	/* LATIN CAPITAL LETTER E WITH GRAVE */ \
1246 	    UNI(0x49, 0x00C9);	/* LATIN CAPITAL LETTER E WITH ACUTE */ \
1247 	    UNI(0x4A, 0x00CA);	/* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ \
1248 	    UNI(0x4B, 0x00CB);	/* LATIN CAPITAL LETTER E WITH DIAERESIS */ \
1249 	    UNI(0x4C, 0x00CC);	/* LATIN CAPITAL LETTER I WITH GRAVE */ \
1250 	    UNI(0x4D, 0x00CD);	/* LATIN CAPITAL LETTER I WITH ACUTE */ \
1251 	    UNI(0x4E, 0x00CE);	/* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ \
1252 	    UNI(0x4F, 0x00CF);	/* LATIN CAPITAL LETTER I WITH DIAERESIS */ \
1253 	    UNI(0x50, 0x011E);	/* LATIN CAPITAL LETTER G WITH BREVE */ \
1254 	    UNI(0x51, 0x00D1);	/* LATIN CAPITAL LETTER N WITH TILDE */ \
1255 	    UNI(0x52, 0x00D2);	/* LATIN CAPITAL LETTER O WITH GRAVE */ \
1256 	    UNI(0x53, 0x00D3);	/* LATIN CAPITAL LETTER O WITH ACUTE */ \
1257 	    UNI(0x54, 0x00D4);	/* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ \
1258 	    UNI(0x55, 0x00D5);	/* LATIN CAPITAL LETTER O WITH TILDE */ \
1259 	    UNI(0x56, 0x00D6);	/* LATIN CAPITAL LETTER O WITH DIAERESIS */ \
1260 	    UNI(0x57, 0x0152);	/* LATIN CAPITAL LIGATURE OE */ \
1261 	    UNI(0x58, 0x00D8);	/* LATIN CAPITAL LETTER O WITH STROKE */ \
1262 	    UNI(0x59, 0x00D9);	/* LATIN CAPITAL LETTER U WITH GRAVE */ \
1263 	    UNI(0x5A, 0x00DA);	/* LATIN CAPITAL LETTER U WITH ACUTE */ \
1264 	    UNI(0x5B, 0x00DB);	/* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ \
1265 	    UNI(0x5C, 0x00DC);	/* LATIN CAPITAL LETTER U WITH DIAERESIS */ \
1266 	    UNI(0x5D, 0x0178);	/* LATIN CAPITAL LETTER Y WITH DIAERESIS */ \
1267 	    UNI(0x5E, 0x015E);	/* LATIN CAPITAL LETTER S WITH CEDILLA */ \
1268 	    UNI(0x5F, 0x00DF);	/* LATIN SMALL LETTER SHARP S */ \
1269 	    UNI(0x60, 0x00E0);	/* LATIN SMALL LETTER A WITH GRAVE */ \
1270 	    UNI(0x61, 0x00E1);	/* LATIN SMALL LETTER A WITH ACUTE */ \
1271 	    UNI(0x62, 0x00E2);	/* LATIN SMALL LETTER A WITH CIRCUMFLEX */ \
1272 	    UNI(0x63, 0x00E3);	/* LATIN SMALL LETTER A WITH TILDE */ \
1273 	    UNI(0x64, 0x00E4);	/* LATIN SMALL LETTER A WITH DIAERESIS */ \
1274 	    UNI(0x65, 0x00E5);	/* LATIN SMALL LETTER A WITH RING ABOVE */ \
1275 	    UNI(0x66, 0x00E6);	/* LATIN SMALL LETTER AE */ \
1276 	    UNI(0x67, 0x00E7);	/* LATIN SMALL LETTER C WITH CEDILLA */ \
1277 	    UNI(0x68, 0x00E8);	/* LATIN SMALL LETTER E WITH GRAVE */ \
1278 	    UNI(0x69, 0x00E9);	/* LATIN SMALL LETTER E WITH ACUTE */ \
1279 	    UNI(0x6A, 0x00EA);	/* LATIN SMALL LETTER E WITH CIRCUMFLEX */ \
1280 	    UNI(0x6B, 0x00EB);	/* LATIN SMALL LETTER E WITH DIAERESIS */ \
1281 	    UNI(0x6C, 0x00EC);	/* LATIN SMALL LETTER I WITH GRAVE */ \
1282 	    UNI(0x6D, 0x00ED);	/* LATIN SMALL LETTER I WITH ACUTE */ \
1283 	    UNI(0x6E, 0x00EE);	/* LATIN SMALL LETTER I WITH CIRCUMFLEX */ \
1284 	    UNI(0x6F, 0x00EF);	/* LATIN SMALL LETTER I WITH DIAERESIS */ \
1285 	    UNI(0x70, 0x011F);	/* LATIN SMALL LETTER G WITH BREVE */ \
1286 	    UNI(0x71, 0x00F1);	/* LATIN SMALL LETTER N WITH TILDE */ \
1287 	    UNI(0x72, 0x00F2);	/* LATIN SMALL LETTER O WITH GRAVE */ \
1288 	    UNI(0x73, 0x00F3);	/* LATIN SMALL LETTER O WITH ACUTE */ \
1289 	    UNI(0x74, 0x00F4);	/* LATIN SMALL LETTER O WITH CIRCUMFLEX */ \
1290 	    UNI(0x75, 0x00F5);	/* LATIN SMALL LETTER O WITH TILDE */ \
1291 	    UNI(0x76, 0x00F6);	/* LATIN SMALL LETTER O WITH DIAERESIS */ \
1292 	    UNI(0x77, 0x0153);	/* LATIN SMALL LIGATURE OE */ \
1293 	    UNI(0x78, 0x00F8);	/* LATIN SMALL LETTER O WITH STROKE */ \
1294 	    UNI(0x79, 0x00F9);	/* LATIN SMALL LETTER U WITH GRAVE */ \
1295 	    UNI(0x7A, 0x00FA);	/* LATIN SMALL LETTER U WITH ACUTE */ \
1296 	    UNI(0x7B, 0x00FB);	/* LATIN SMALL LETTER U WITH CIRCUMFLEX */ \
1297 	    UNI(0x7C, 0x00FC);	/* LATIN SMALL LETTER U WITH DIAERESIS */ \
1298 	    UNI(0x7D, 0x00FF);	/* LATIN SMALL LETTER Y WITH DIAERESIS */ \
1299 	    UNI(0x7E, 0x015F);	/* LATIN SMALL LETTER S WITH CEDILLA */ \
1300 	} \
1301 	end_CODEPAGE()
1302 	/*
1303 	 * mentioned, but not documented in VT510 manual, etc., this uses
1304 	 * the ELOT927 table from Kermit 95:
1305 	 */
1306 #define map_NRCS_Greek(code) \
1307 	switch (code) { \
1308 	    MAP(0x61, 0x0391); /* CAPITAL GREEK LETTER ALPHA */ \
1309 	    MAP(0x62, 0x0392); /* CAPITAL GREEK LETTER BETA */ \
1310 	    MAP(0x63, 0x0393); /* CAPITAL GREEK LETTER GAMMA */ \
1311 	    MAP(0x64, 0x0394); /* CAPITAL GREEK LETTER DELTA */ \
1312 	    MAP(0x65, 0x0395); /* CAPITAL GREEK LETTER EPSILON */ \
1313 	    MAP(0x66, 0x0396); /* CAPITAL GREEK LETTER ZETA */ \
1314 	    MAP(0x67, 0x0397); /* CAPITAL GREEK LETTER ETA */ \
1315 	    MAP(0x68, 0x0398); /* CAPITAL GREEK LETTER THETA */ \
1316 	    MAP(0x69, 0x0399); /* CAPITAL GREEK LETTER IOTA */ \
1317 	    MAP(0x6a, 0x039a); /* CAPITAL GREEK LETTER KAPPA */ \
1318 	    MAP(0x6b, 0x039b); /* CAPITAL GREEK LETTER LAMDA */ \
1319 	    MAP(0x6c, 0x039c); /* CAPITAL GREEK LETTER MU */ \
1320 	    MAP(0x6d, 0x039d); /* CAPITAL GREEK LETTER NU */ \
1321 	    MAP(0x6e, 0x03a7); /* CAPITAL GREEK LETTER KSI (CHI) */ \
1322 	    MAP(0x6f, 0x039f); /* CAPITAL GREEK LETTER OMICRON */ \
1323 	    MAP(0x70, 0x03a0); /* CAPITAL GREEK LETTER PI */ \
1324 	    MAP(0x71, 0x03a1); /* CAPITAL GREEK LETTER RHO */ \
1325 	    MAP(0x72, 0x03a3); /* CAPITAL GREEK LETTER SIGMA */ \
1326 	    MAP(0x73, 0x03a4); /* CAPITAL GREEK LETTER TAU */ \
1327 	    MAP(0x74, 0x03a5); /* CAPITAL GREEK LETTER UPSILON */ \
1328 	    MAP(0x75, 0x03a6); /* CAPITAL GREEK LETTER FI (PHI) */ \
1329 	    MAP(0x76, 0x039e); /* CAPITAL GREEK LETTER XI */ \
1330 	    MAP(0x77, 0x03a8); /* CAPITAL GREEK LETTER PSI */ \
1331 	    MAP(0x78, 0x03a9); /* CAPITAL GREEK LETTER OMEGA */ \
1332 	    XXX(0x79, BLANK);  /* unused */ \
1333 	    XXX(0x7a, BLANK);  /* unused */ \
1334 	}
1335 	/* figure A-21 "DEC 7-Bit Hebrew Character Set" */
1336 #define map_NRCS_Hebrew(code) \
1337 	switch (code) { \
1338 	    UNI(0x60, 0x05d0);	/* HEBREW LETTER ALEF */ \
1339 	    UNI(0x61, 0x05d1);	/* HEBREW LETTER BET */ \
1340 	    UNI(0x62, 0x05d2);	/* HEBREW LETTER GIMEL */ \
1341 	    UNI(0x63, 0x05d3);	/* HEBREW LETTER DALET */ \
1342 	    UNI(0x64, 0x05d4);	/* HEBREW LETTER HE */ \
1343 	    UNI(0x65, 0x05d5);	/* HEBREW LETTER VAV */ \
1344 	    UNI(0x66, 0x05d6);	/* HEBREW LETTER ZAYIN */ \
1345 	    UNI(0x67, 0x05d7);	/* HEBREW LETTER HET */ \
1346 	    UNI(0x68, 0x05d8);	/* HEBREW LETTER TET */ \
1347 	    UNI(0x69, 0x05d9);	/* HEBREW LETTER YOD */ \
1348 	    UNI(0x6a, 0x05da);	/* HEBREW LETTER FINAL KAF */ \
1349 	    UNI(0x6b, 0x05db);	/* HEBREW LETTER KAF */ \
1350 	    UNI(0x6c, 0x05dc);	/* HEBREW LETTER LAMED */ \
1351 	    UNI(0x6d, 0x05dd);	/* HEBREW LETTER FINAL MEM */ \
1352 	    UNI(0x6e, 0x05de);	/* HEBREW LETTER MEM */ \
1353 	    UNI(0x6f, 0x05df);	/* HEBREW LETTER FINAL NUN */ \
1354 	    UNI(0x70, 0x05e0);	/* HEBREW LETTER NUN */ \
1355 	    UNI(0x71, 0x05e1);	/* HEBREW LETTER SAMEKH */ \
1356 	    UNI(0x72, 0x05e2);	/* HEBREW LETTER AYIN */ \
1357 	    UNI(0x73, 0x05e3);	/* HEBREW LETTER FINAL PE */ \
1358 	    UNI(0x74, 0x05e4);	/* HEBREW LETTER PE */ \
1359 	    UNI(0x75, 0x05e5);	/* HEBREW LETTER FINAL TSADI */ \
1360 	    UNI(0x76, 0x05e6);	/* HEBREW LETTER TSADI */ \
1361 	    UNI(0x77, 0x05e7);	/* HEBREW LETTER QOF */ \
1362 	    UNI(0x78, 0x05e8);	/* HEBREW LETTER RESH */ \
1363 	    UNI(0x79, 0x05e9);	/* HEBREW LETTER SHIN */ \
1364 	    UNI(0x7a, 0x05ea);	/* HEBREW LETTER TAV */ \
1365 	}
1366 	/* figure A-26 "DEC 7-Bit Turkish Character Set" */
1367 #define map_NRCS_Turkish(code) \
1368 	switch (code) { \
1369 	    UNI(0x26, 0x011f);	/* LATIN SMALL LETTER G WITH BREVE */ \
1370 	    UNI(0x40, 0x0130);	/* LATIN CAPITAL LETTER I WITH DOT ABOVE */ \
1371 	    UNI(0x5b, 0x015e);	/* LATIN CAPITAL LETTER S WITH CEDILLA */ \
1372 	    UNI(0x5c, 0x00d6);	/* LATIN CAPITAL LETTER O WITH DIAERESIS */ \
1373 	    UNI(0x5d, 0x00c7);	/* LATIN CAPITAL LETTER C WITH CEDILLA */ \
1374 	    UNI(0x5e, 0x00dC);	/* LATIN CAPITAL LETTER U WITH DIAERESIS */ \
1375 	    UNI(0x60, 0x011e);	/* LATIN CAPITAL LETTER G WITH BREVE */ \
1376 	    UNI(0x7b, 0x015f);	/* LATIN SMALL LETTER S WITH CEDILLA */ \
1377 	    UNI(0x7c, 0x00f6);	/* LATIN SMALL LETTER O WITH DIAERESIS */ \
1378 	    UNI(0x7d, 0x00e7);	/* LATIN SMALL LETTER C WITH CEDILLA */ \
1379 	    UNI(0x7e, 0x00fc);	/* LATIN SMALL LETTER U WITH DIAERESIS */ \
1380 	}
1381 #else
1382 #define map_DEC_Cyrillic(code)	/* nothing */
1383 #define map_DEC_Greek_Supp(code)	/* nothing */
1384 #define map_DEC_Hebrew_Supp(code)	/* nothing */
1385 #define map_DEC_Technical(code)	/* nothing */
1386 #define map_DEC_Turkish_Supp(code)	/* nothing */
1387 #define map_ISO_Greek_Supp(code)	/* nothing */
1388 #define map_ISO_Hebrew(code)	/* nothing */
1389 #define map_ISO_Latin_2(code)	/* nothing */
1390 #define map_ISO_Latin_5(code)	/* nothing */
1391 #define map_ISO_Latin_Cyrillic(code)	/* nothing */
1392 #define map_NRCS_Greek(code)	/* nothing */
1393 #define map_NRCS_Hebrew(code)	/* nothing */
1394 #define map_NRCS_Turkish(code)	/* nothing */
1395 #endif /* OPT_WIDE_CHARS */
1396 
1397 /*
1398  * Translate an input keysym to the corresponding NRC keysym.
1399  */
1400 unsigned
xtermCharSetIn(XtermWidget xw,unsigned code,DECNRCM_codes charset)1401 xtermCharSetIn(XtermWidget xw, unsigned code, DECNRCM_codes charset)
1402 {
1403     TScreen *screen = TScreenOf(xw);
1404 #define MAP(to, from) case from: code = to; break
1405 
1406 #if OPT_WIDE_CHARS
1407 #define UNI(to, from) case from: if (screen->utf8_nrc_mode) code = to; break
1408 #else
1409 #define UNI(to, from) case from: break
1410 #endif
1411 
1412 #define XXX(to, from)		/* no defined mapping to 0..255 */
1413 
1414     TRACE(("CHARSET-IN GL=%s(G%d) GR=%s(G%d) SS%d\n\t%s\n",
1415 	   visibleScsCode(screen->gsets[screen->curgl]), screen->curgl,
1416 	   visibleScsCode(screen->gsets[screen->curgr]), screen->curgr,
1417 	   screen->curss,
1418 	   visibleUChar(code)));
1419 
1420     (void) screen;
1421     switch (charset) {
1422     case nrc_British:		/* United Kingdom set (or Latin 1)      */
1423 	if (code == XK_sterling)
1424 	    code = 0x23;
1425 	code &= 0x7f;
1426 	break;
1427 
1428     case nrc_DEC_Alt_Chars:
1429     case nrc_DEC_Alt_Graphics:
1430     case nrc_ASCII:
1431 	break;
1432 
1433     case nrc_DEC_Spec_Graphic:
1434 	break;
1435 
1436     case nrc_DEC_Supp:
1437 	map_DEC_Supp_Graphic(code, code &= 0x7f);
1438 	break;
1439 
1440     case nrc_DEC_Supp_Graphic:
1441 	map_DEC_Supp_Graphic(code, code |= 0x80);
1442 	break;
1443 
1444     case nrc_DEC_Technical:
1445 	map_DEC_Technical(code);
1446 	break;
1447 
1448     case nrc_Dutch:
1449 	map_NRCS_Dutch(code);
1450 	break;
1451 
1452     case nrc_Finnish:
1453     case nrc_Finnish2:
1454 	map_NRCS_Finnish(code);
1455 	break;
1456 
1457     case nrc_French:
1458     case nrc_French2:
1459 	map_NRCS_French(code);
1460 	break;
1461 
1462     case nrc_French_Canadian:
1463 	map_NRCS_French_Canadian(code);
1464 	break;
1465 
1466     case nrc_German:
1467 	map_NRCS_German(code);
1468 	break;
1469 
1470     case nrc_Greek:
1471 	map_NRCS_Greek(code);	/* FIXME - ELOT? */
1472 	break;
1473 
1474     case nrc_DEC_Greek_Supp:
1475 	map_DEC_Greek_Supp(code);
1476 	break;
1477 
1478     case nrc_ISO_Greek_Supp:
1479 	map_ISO_Greek_Supp(code);
1480 	break;
1481 
1482     case nrc_DEC_Hebrew_Supp:
1483 	map_DEC_Hebrew_Supp(code);
1484 	break;
1485 
1486     case nrc_Hebrew:
1487 	map_NRCS_Hebrew(code);
1488 	break;
1489 
1490     case nrc_ISO_Hebrew_Supp:
1491 	map_ISO_Hebrew(code);
1492 	break;
1493 
1494     case nrc_Italian:
1495 	map_NRCS_Italian(code);
1496 	break;
1497 
1498     case nrc_ISO_Latin_2_Supp:
1499 	map_ISO_Latin_2(code);
1500 	break;
1501 
1502     case nrc_ISO_Latin_5_Supp:
1503 	map_ISO_Latin_5(code);
1504 	break;
1505 
1506     case nrc_ISO_Latin_Cyrillic:
1507 	map_ISO_Latin_Cyrillic(code);
1508 	break;
1509 
1510     case nrc_Norwegian_Danish:
1511     case nrc_Norwegian_Danish2:
1512     case nrc_Norwegian_Danish3:
1513 	map_NRCS_Norwegian_Danish(code);
1514 	break;
1515 
1516     case nrc_Portugese:
1517 	map_NRCS_Portuguese(code);
1518 	break;
1519 
1520     case nrc_SCS_NRCS:		/* vt5xx - probably Serbo/Croatian */
1521 	/* FIXME */
1522 	break;
1523 
1524     case nrc_Spanish:
1525 	map_NRCS_Spanish(code);
1526 	break;
1527 
1528     case nrc_Swedish2:
1529     case nrc_Swedish:
1530 	map_NRCS_Swedish(code);
1531 	break;
1532 
1533     case nrc_Swiss:
1534 	map_NRCS_Swiss(code);
1535 	break;
1536 
1537     case nrc_Turkish:
1538 	map_NRCS_Turkish(code);
1539 	break;
1540 
1541     case nrc_DEC_Turkish_Supp:
1542 	map_DEC_Turkish_Supp(code);
1543 	break;
1544 
1545     case nrc_DEC_Cyrillic:
1546 	map_DEC_Cyrillic(code);
1547 	break;
1548 
1549     case nrc_ISO_Latin_1_Supp:
1550     case nrc_British_Latin_1:
1551     case nrc_Russian:
1552     case nrc_French_Canadian2:
1553     case nrc_Unknown:
1554     default:			/* any character sets we don't recognize */
1555 	break;
1556     }
1557     code &= 0x7f;		/* NRC in any case is 7-bit */
1558     TRACE(("->\t%s\n",
1559 	   visibleUChar(code)));
1560     return code;
1561 #undef MAP
1562 #undef UNI
1563 #undef XXX
1564 }
1565 
1566 /*
1567  * Translate a string to the display form.  This assumes the font has the
1568  * DEC graphic characters in cells 0-31, and otherwise is ISO-8859-1.
1569  */
1570 int
xtermCharSetOut(XtermWidget xw,IChar * buf,IChar * ptr,DECNRCM_codes leftset)1571 xtermCharSetOut(XtermWidget xw, IChar *buf, IChar *ptr, DECNRCM_codes leftset)
1572 {
1573     IChar *s;
1574     TScreen *screen = TScreenOf(xw);
1575     int count = 0;
1576     DECNRCM_codes rightset = screen->gsets[(int) (screen->curgr)];
1577 
1578 #define MAP(from, to) case from: chr = to; break
1579 
1580 #if OPT_WIDE_CHARS
1581 #define UNI(from, to) case from: if (screen->utf8_nrc_mode) chr = to; break
1582 #define XXX(from, to) UNI(from, to)
1583 #else
1584 #define UNI(old, new) chr = old; break
1585 #define XXX(from, to)		/* nothing */
1586 #endif
1587 
1588     TRACE(("CHARSET-OUT GL=%s(G%d) GR=%s(G%d) SS%d\n\t%s\n",
1589 	   visibleScsCode(leftset), screen->curgl,
1590 	   visibleScsCode(rightset), screen->curgr,
1591 	   screen->curss,
1592 	   visibleIChars(buf, (unsigned) (ptr - buf))));
1593 
1594     for (s = buf; s < ptr; ++s) {
1595 	int eight = CharOf(E2A(*s));
1596 	int seven = eight & 0x7f;
1597 	DECNRCM_codes cs = (eight >= 128) ? rightset : leftset;
1598 	int chr = eight;
1599 
1600 	count++;
1601 #if OPT_WIDE_CHARS
1602 	/*
1603 	 * This is only partly right - prevent inadvertent remapping of
1604 	 * the replacement character and other non-8bit codes into bogus
1605 	 * 8bit codes.
1606 	 */
1607 	if (screen->utf8_mode || screen->utf8_nrc_mode) {
1608 	    if (*s > 255)
1609 		continue;
1610 	}
1611 #endif
1612 	if (*s < 32)
1613 	    continue;
1614 
1615 	switch (cs) {
1616 	case nrc_ISO_Latin_1_Supp:
1617 	    /* FALLTHRU */
1618 	case nrc_British_Latin_1:
1619 	    /* FALLTHRU */
1620 	case nrc_British:	/* United Kingdom set (or Latin 1)      */
1621 	    if ((xw->flags & NATIONAL)
1622 		|| (screen->vtXX_level <= 1)) {
1623 		if ((xw->flags & NATIONAL)) {
1624 		    chr = seven;
1625 		}
1626 		if (chr == 0x23) {
1627 		    chr = XTERM_POUND;
1628 #if OPT_WIDE_CHARS
1629 		    if (screen->utf8_nrc_mode) {
1630 			chr = 0xa3;
1631 		    }
1632 #endif
1633 		}
1634 	    } else {
1635 		chr = (seven | 0x80);
1636 	    }
1637 	    break;
1638 
1639 	case nrc_DEC_Alt_Chars:
1640 	case nrc_DEC_Alt_Graphics:
1641 	case nrc_ASCII:
1642 	    break;
1643 
1644 	case nrc_DEC_Spec_Graphic:
1645 	    if (seven > 0x5f && seven <= 0x7e) {
1646 #if OPT_WIDE_CHARS
1647 		if (screen->utf8_mode || screen->utf8_nrc_mode)
1648 		    chr = (int) dec2ucs(screen, (unsigned) (seven - 0x5f));
1649 		else
1650 #endif
1651 		    chr = seven - 0x5f;
1652 	    } else if (chr == 0x5f) {
1653 		chr = 0;
1654 	    } else {
1655 		chr = seven;
1656 	    }
1657 	    break;
1658 
1659 	case nrc_DEC_Supp:
1660 	    map_DEC_Supp_Graphic(chr = seven, chr |= 0x80);
1661 	    break;
1662 
1663 	case nrc_DEC_Supp_Graphic:
1664 	    map_DEC_Supp_Graphic(chr = seven, chr |= 0x80);
1665 	    break;
1666 
1667 	case nrc_DEC_Technical:
1668 	    map_DEC_Technical(chr = seven);
1669 	    break;
1670 
1671 	case nrc_Dutch:
1672 	    map_NRCS_Dutch(chr = seven);
1673 	    break;
1674 
1675 	case nrc_Finnish:
1676 	case nrc_Finnish2:
1677 	    map_NRCS_Finnish(chr = seven);
1678 	    break;
1679 
1680 	case nrc_French:
1681 	case nrc_French2:
1682 	    map_NRCS_French(chr = seven);
1683 	    break;
1684 
1685 	case nrc_French_Canadian:
1686 	case nrc_French_Canadian2:
1687 	    map_NRCS_French_Canadian(chr = seven);
1688 	    break;
1689 
1690 	case nrc_German:
1691 	    map_NRCS_German(chr = seven);
1692 	    break;
1693 
1694 	case nrc_Greek:
1695 	    map_NRCS_Greek(chr = seven);	/* FIXME - ELOT? */
1696 	    break;
1697 
1698 	case nrc_DEC_Greek_Supp:
1699 	    map_DEC_Greek_Supp(chr = seven);
1700 	    break;
1701 
1702 	case nrc_ISO_Greek_Supp:
1703 	    map_ISO_Greek_Supp(chr = seven);
1704 	    break;
1705 
1706 	case nrc_DEC_Hebrew_Supp:
1707 	    map_DEC_Hebrew_Supp(chr = seven);
1708 	    break;
1709 
1710 	case nrc_Hebrew:
1711 	    map_NRCS_Hebrew(chr = seven);
1712 	    break;
1713 
1714 	case nrc_ISO_Hebrew_Supp:
1715 	    map_ISO_Hebrew(chr = seven);
1716 	    break;
1717 
1718 	case nrc_Italian:
1719 	    map_NRCS_Italian(chr = seven);
1720 	    break;
1721 
1722 	case nrc_ISO_Latin_2_Supp:
1723 	    map_ISO_Latin_2(chr = seven);
1724 	    break;
1725 
1726 	case nrc_ISO_Latin_5_Supp:
1727 	    map_ISO_Latin_5(chr = seven);
1728 	    break;
1729 
1730 	case nrc_ISO_Latin_Cyrillic:
1731 	    map_ISO_Latin_Cyrillic(chr = seven);
1732 	    break;
1733 
1734 	case nrc_Norwegian_Danish:
1735 	case nrc_Norwegian_Danish2:
1736 	case nrc_Norwegian_Danish3:
1737 	    map_NRCS_Norwegian_Danish(chr = seven);
1738 	    break;
1739 
1740 	case nrc_Portugese:
1741 	    map_NRCS_Portuguese(chr = seven);
1742 	    break;
1743 
1744 	case nrc_SCS_NRCS:	/* vt5xx - probably Serbo/Croatian */
1745 	    /* FIXME */
1746 	    break;
1747 
1748 	case nrc_Spanish:
1749 	    map_NRCS_Spanish(chr = seven);
1750 	    break;
1751 
1752 	case nrc_Swedish2:
1753 	case nrc_Swedish:
1754 	    map_NRCS_Swedish(chr = seven);
1755 	    break;
1756 
1757 	case nrc_Swiss:
1758 	    map_NRCS_Swiss(chr = seven);
1759 	    break;
1760 
1761 	case nrc_Turkish:
1762 	    map_NRCS_Turkish(chr = seven);
1763 	    break;
1764 
1765 	case nrc_DEC_Turkish_Supp:
1766 	    map_DEC_Turkish_Supp(chr = seven);
1767 	    break;
1768 
1769 	case nrc_DEC_Cyrillic:
1770 	    map_DEC_Cyrillic(chr = seven);
1771 	    break;
1772 
1773 	case nrc_Russian:
1774 	case nrc_Unknown:
1775 	default:		/* any character sets we don't recognize */
1776 	    count--;
1777 	    break;
1778 	}
1779 	/*
1780 	 * The state machine already treated DEL as a nonprinting and
1781 	 * nonspacing character.  If we have DEL now, remove it.
1782 	 */
1783 	if (chr == ANSI_DEL) {
1784 	    IChar *s1;
1785 	    --ptr;
1786 	    for (s1 = s; s1 < ptr; ++s1) {
1787 		s1[0] = s1[1];
1788 	    }
1789 	} else {
1790 	    *s = (IChar) A2E(chr);
1791 	}
1792     }
1793     TRACE(("%d\t%s\n",
1794 	   count,
1795 	   visibleIChars(buf, (unsigned) (ptr - buf))));
1796     return count;
1797 #undef MAP
1798 #undef UNI
1799 #undef XXX
1800 }
1801