"Fossies" - the Fresh Open Source Software Archive

Member "xterm-379/charsets.c" (25 Dec 2020, 76844 Bytes) of package /linux/misc/xterm-379.tgz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "charsets.c" see the Fossies "Dox" file reference documentation.

    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
 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
 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 }