charsets.c revision 5307cd1a
1/* $XTermId: charsets.c,v 1.112 2020/12/24 22:07:02 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 */
1400unsigned
1401xtermCharSetIn(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 */
1570int
1571xtermCharSetOut(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