Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/* vi:set ts=8 sts=4 sw=4:
 *
 * VIM - Vi IMproved    by Bram Moolenaar
 *
 * Do ":help uganda"  in Vim to read copying and usage conditions.
 * Do ":help credits" in Vim to see a list of people who contributed.
 * See README.txt for an overview of the Vim source code.
 */

/*
 * digraph.c: code for digraphs
 */

#include "vim.h"

#if defined(FEAT_DIGRAPHS) || defined(PROTO)

#ifdef FEAT_MBYTE
typedef int result_T;
#else
typedef char_u result_T;
#endif

typedef struct digraph
{
    char_u      char1;
    char_u      char2;
    result_T    result;
} digr_T;

static int getexactdigraph __ARGS((int, int, int));
static void printdigraph __ARGS((digr_T *));

/* digraphs added by the user */
static garray_T user_digraphs = {0, 0, sizeof(digr_T), 10, NULL};

/*
 * Note: Characters marked with XX are not included literally, because some
 * compilers cannot handle them (Amiga SAS/C is the most picky one).
 */
static digr_T digraphdefault[] =
#if defined(MSDOS) || defined(OS2)
        /*
         * MSDOS digraphs.
         */
       {{'C', ',', 128},        /* ~@ XX */
        {'u', '"', 129},        /*  */
        {'e', '\'', 130},       /* ‚ */
        {'a', '^', 131},        /* ƒ */
        {'a', '"', 132},        /* „ */
        {'a', '`', 133},        /* Â… */
        {'a', '@', 134},        /* † */
        {'c', ',', 135},        /* ~G XX */
        {'e', '^', 136},        /* ~H XX */
        {'e', '"', 137},        /* ‰ */
        {'e', '`', 138},        /* Š */
        {'i', '"', 139},        /* ‹ */
        {'i', '^', 140},        /* Œ */
        {'i', '`', 141},        /*  */
        {'A', '"', 142},        /* ~N XX */
        {'A', '@', 143},        /*  */
        {'E', '\'', 144},       /*  */
        {'a', 'e', 145},        /* ‘ */
        {'A', 'E', 146},        /* Â’ */
        {'o', '^', 147},        /* “ */
        {'o', '"', 148},        /* ” */
        {'o', '`', 149},        /* • */
        {'u', '^', 150},        /* – */
        {'u', '`', 151},        /* — */
        {'y', '"', 152},        /* ˜ */
        {'O', '"', 153},        /* ™ */
        {'U', '"', 154},        /* š */
        {'c', '|', 155},        /* › */
        {'$', '$', 156},        /* œ */
        {'Y', '-', 157},        /* ~] XX */
        {'P', 't', 158},        /* ž */
        {'f', 'f', 159},        /* Ÿ */
        {'a', '\'', 160},       /*   */
        {'i', '\'', 161},       /* ¡ */
        {'o', '\'', 162},       /* ¢ */
        {'u', '\'', 163},       /* x XX */
        {'n', '~', 164},        /* ¤ */
        {'N', '~', 165},        /* ¥ */
        {'a', 'a', 166},        /* ¦ */
        {'o', 'o', 167},        /* § */
        {'~', '?', 168},        /* ¨ */
        {'-', 'a', 169},        /* © */
        {'a', '-', 170},        /* ª */
        {'1', '2', 171},        /* « */
        {'1', '4', 172},        /* ¬ */
        {'~', '!', 173},        /* ­ */
        {'<', '<', 174},        /* ® */
        {'>', '>', 175},        /* ¯ */

        {'s', 's', 225},        /* á */
        {'j', 'u', 230},        /* æ */
        {'o', '/', 237},        /* í */
        {'+', '-', 241},        /* ñ */
        {'>', '=', 242},        /* ò */
        {'<', '=', 243},        /* ó */
        {':', '-', 246},        /* ö */
        {'~', '~', 247},        /* ÷ */
        {'~', 'o', 248},        /* ø */
        {'2', '2', 253},        /* ý */
        {NUL, NUL, NUL}
        };

#else   /* !MSDOS && !OS2 */
# ifdef __MINT__

        /*
         * ATARI digraphs
         */
       {{'C', ',', 128},        /* ~@ XX */
        {'u', '"', 129},        /*  */
        {'e', '\'', 130},       /* ‚ */
        {'a', '^', 131},        /* ƒ */
        {'a', '"', 132},        /* „ */
        {'a', '`', 133},        /* Â… */
        {'a', '@', 134},        /* † */
        {'c', ',', 135},        /* ~G XX */
        {'e', '^', 136},        /* ~H XX */
        {'e', '"', 137},        /* ‰ */
        {'e', '`', 138},        /* Š */
        {'i', '"', 139},        /* ‹ */
        {'i', '^', 140},        /* Œ */
        {'i', '`', 141},        /*  */
        {'A', '"', 142},        /* ÂŽ */
        {'A', '@', 143},        /*  */
        {'E', '\'', 144},       /*  */
        {'a', 'e', 145},        /* ‘ */
        {'A', 'E', 146},        /* Â’ */
        {'o', '^', 147},        /* “ */
        {'o', '"', 148},        /* ” */
        {'o', '`', 149},        /* • */
        {'u', '^', 150},        /* – */
        {'u', '`', 151},        /* — */
        {'y', '"', 152},        /* ˜ */
        {'O', '"', 153},        /* ™ */
        {'U', '"', 154},        /* š */
        {'c', '|', 155},        /* › */
        {'$', '$', 156},        /* œ */
        {'Y', '-', 157},        /* ~] XX */
        {'s', 's', 158},        /* ž */
        {'f', 'f', 159},        /* Ÿ */
        {'a', '\'', 160},       /*   */
        {'i', '\'', 161},       /* ¡ */
        {'o', '\'', 162},       /* ¢ */
        {'u', '\'', 163},       /* £ */
        {'n', '~', 164},        /* ¤ */
        {'N', '~', 165},        /* ¥ */
        {'a', 'a', 166},        /* ¦ */
        {'o', 'o', 167},        /* § */
        {'~', '?', 168},        /* ¨ */
        {'-', 'a', 169},        /* © */
        {'a', '-', 170},        /* ª */
        {'1', '2', 171},        /* « */
        {'1', '4', 172},        /* ¬ */
        {'~', '!', 173},        /* ­ */
        {'<', '<', 174},        /* ® */
        {'>', '>', 175},        /* ¯ */
        {'j', 'u', 230},        /* æ */
        {'o', '/', 237},        /* í */
        {'+', '-', 241},        /* ñ */
        {'>', '=', 242},        /* ò */
        {'<', '=', 243},        /* ó */
        {':', '-', 246},        /* ö */
        {'~', '~', 247},        /* ÷ */
        {'~', 'o', 248},        /* ø */
        {'2', '2', 253},        /* ý */
        {NUL, NUL, NUL}
        };

# else  /* !__MINT__ */
#  ifdef HPUX_DIGRAPHS

        /*
         * different HPUX digraphs
         */
       {{'A', '`', 161},        /* ¡ */
        {'A', '^', 162},        /* ¢ */
        {'E', '`', 163},        /* £ */
        {'E', '^', 164},        /* ¤ */
        {'E', '"', 165},        /* ¥ */
        {'I', '^', 166},        /* ¦ */
        {'I', '"', 167},        /* § */
        {'\'', '\'', 168},      /* ¨ */
        {'`', '`', 169},        /* © */
        {'^', '^', 170},        /* ª */
        {'"', '"', 171},        /* « */
        {'~', '~', 172},        /* ¬ */
        {'U', '`', 173},        /* ­ */
        {'U', '^', 174},        /* ® */
        {'L', '=', 175},        /* ¯ */
        {'~', '_', 176},        /* ° */
        {'Y', '\'', 177},       /* ± */
        {'y', '\'', 178},       /* ² */
        {'~', 'o', 179},        /* ³ */
        {'C', ',', 180},        /* ´ */
        {'c', ',', 181},        /* µ */
        {'N', '~', 182},        /* ¶ */
        {'n', '~', 183},        /* · */
        {'~', '!', 184},        /* ¸ */
        {'~', '?', 185},        /* ¹ */
        {'o', 'x', 186},        /* º */
        {'L', '-', 187},        /* » */
        {'Y', '=', 188},        /* ¼ */
        {'p', 'p', 189},        /* ½ */
        {'f', 'l', 190},        /* ¾ */
        {'c', '|', 191},        /* ¿ */
        {'a', '^', 192},        /* À */
        {'e', '^', 193},        /* Á */
        {'o', '^', 194},        /* Â */
        {'u', '^', 195},        /* Ã */
        {'a', '\'', 196},       /* Ä */
        {'e', '\'', 197},       /* Å */
        {'o', '\'', 198},       /* Æ */
        {'u', '\'', 199},       /* Ç */
        {'a', '`', 200},        /* È */
        {'e', '`', 201},        /* É */
        {'o', '`', 202},        /* Ê */
        {'u', '`', 203},        /* Ë */
        {'a', '"', 204},        /* Ì */
        {'e', '"', 205},        /* Í */
        {'o', '"', 206},        /* Î */
        {'u', '"', 207},        /* Ï */
        {'A', 'o', 208},        /* Ð */
        {'i', '^', 209},        /* Ñ */
        {'O', '/', 210},        /* Ò */
        {'A', 'E', 211},        /* Ó */
        {'a', 'o', 212},        /* Ô */
        {'i', '\'', 213},       /* Õ */
        {'o', '/', 214},        /* Ö */
        {'a', 'e', 215},        /* × */
        {'A', '"', 216},        /* Ø */
        {'i', '`', 217},        /* Ù */
        {'O', '"', 218},        /* Ú */
        {'U', '"', 219},        /* Û */
        {'E', '\'', 220},       /* Ü */
        {'i', '"', 221},        /* Ý */
        {'s', 's', 222},        /* Þ */
        {'O', '^', 223},        /* ß */
        {'A', '\'', 224},       /* à */
        {'A', '~', 225},        /* á */
        {'a', '~', 226},        /* â */
        {'D', '-', 227},        /* ã */
        {'d', '-', 228},        /* ä */
        {'I', '\'', 229},       /* å */
        {'I', '`', 230},        /* æ */
        {'O', '\'', 231},       /* ç */
        {'O', '`', 232},        /* è */
        {'O', '~', 233},        /* é */
        {'o', '~', 234},        /* ê */
        {'S', '~', 235},        /* ë */
        {'s', '~', 236},        /* ì */
        {'U', '\'', 237},       /* í */
        {'Y', '"', 238},        /* î */
        {'y', '"', 239},        /* ï */
        {'p', '-', 240},        /* ð */
        {'p', '~', 241},        /* ñ */
        {'~', '.', 242},        /* ò */
        {'j', 'u', 243},        /* ó */
        {'P', 'p', 244},        /* ô */
        {'3', '4', 245},        /* õ */
        {'-', '-', 246},        /* ö */
        {'1', '4', 247},        /* ÷ */
        {'1', '2', 248},        /* ø */
        {'a', '_', 249},        /* ù */
        {'o', '_', 250},        /* ú */
        {'<', '<', 251},        /* û */
        {'x', 'x', 252},        /* ü */
        {'>', '>', 253},        /* ý */
        {'+', '-', 254},        /* þ */
        {'n', 'u', 255},        /* x XX */
        {NUL, NUL, NUL}
        };

#  else /* !HPUX_DIGRAPHS */

#   ifdef EBCDIC

        /*
         * EBCDIC - ISO digraphs
         * TODO: EBCDIC Table is Code-Page 1047
         */
       {{'a', '^',    66},      /* â */
        {'a', '"',    67},      /* ä */
        {'a', '`',    68},      /* à */
        {'a', '\'',   69},      /* á */
        {'a', '~',    70},      /* ã */
        {'a', '@',    71},      /* å */
        {'a', 'a',    71},      /* å */
        {'c', ',',    72},      /* ç */
        {'n', '~',    73},      /* ñ */
        {'c', '|',    74},      /* ¢ */
        {'e', '\'',   81},      /* é */
        {'e', '^',    82},      /* ê */
        {'e', '"',    83},      /* ë */
        {'e', '`',    84},      /* è */
        {'i', '\'',   85},      /* í */
        {'i', '^',    86},      /* î */
        {'i', '"',    87},      /* ï */
        {'i', '`',    88},      /* ì */
        {'s', 's',    89},      /* ß */
        {'A', '^',    98},      /* Â */
        {'A', '"',    99},      /* Ä */
        {'A', '`',   100},      /* À */
        {'A', '\'',  101},      /* Á */
        {'A', '~',   102},      /* Ã */
        {'A', '@',   103},      /* Å */
        {'A', 'A',   103},      /* Å */
        {'C', ',',   104},      /* Ç */
        {'N', '~',   105},      /* Ñ */
        {'|', '|',   106},      /* ¦ */
        {'o', '/',   112},      /* ø */
        {'E', '\'',  113},      /* É */
        {'E', '^',   114},      /* Ê */
        {'E', '"',   115},      /* Ë */
        {'E', '`',   116},      /* È */
        {'I', '\'',  117},      /* Í */
        {'I', '^',   118},      /* Î */
        {'I', '"',   119},      /* Ï */
        {'I', '`',   120},      /* Ì */
        {'O', '/',   128},      /* 0/ XX */
        {'<', '<',   138},      /* « */
        {'>', '>',   139},      /* » */
        {'d', '-',   140},      /* ð */
        {'y', '\'',  141},      /* ý */
        {'i', 'p',   142},      /* þ */
        {'+', '-',   143},      /* ± */
        {'~', 'o',   144},      /* ° */
        {'a', '-',   154},      /* ª */
        {'o', '-',   155},      /* º */
        {'a', 'e',   156},      /* æ */
        {',', ',',   157},      /* , XX */
        {'A', 'E',   158},      /* Æ */
        {'o', 'x',   159},      /* ¤ - currency symbol in ISO 8859-1 */
        {'e', '=',   159},      /* ¤ - euro symbol in ISO 8859-15 */
        {'E', 'u',   159},      /* ¤ - euro symbol in ISO 8859-15 */
        {'j', 'u',   160},      /* µ */
        {'y', '"',   167},      /* x XX */
        {'~', '!',   170},      /* ¡ */
        {'~', '?',   171},      /* ¿ */
        {'D', '-',   172},      /* Ð */
        {'I', 'p',   174},      /* Þ */
        {'r', 'O',   175},      /* ® */
        {'-', ',',   176},      /* ¬ */
        {'$', '$',   177},      /* £ */
        {'Y', '-',   178},      /* ¥ */
        {'~', '.',   179},      /* · */
        {'c', 'O',   180},      /* © */
        {'p', 'a',   181},      /* § */
        {'p', 'p',   182},      /* ¶ */
        {'1', '4',   183},      /* ¼ */
        {'1', '2',   184},      /* ½ */
        {'3', '4',   185},      /* ¾ */
        {'Y', '\'',  186},      /* Ý */
        {'"', '"',   187},      /* ¨ */
        {'-', '=',   188},      /* ¯ */
        {'\'', '\'', 190},      /* ´ */
        {'O', 'E',   191},      /* × - OE in ISO 8859-15 */
        {'/', '\\',  191},      /* × - multiplication symbol in ISO 8859-1 */
        {'-', '-',   202},      /* ­ */
        {'o', '^',   203},      /* ô */
        {'o', '"',   204},      /* ö */
        {'o', '`',   205},      /* ò */
        {'o', '\'',  206},      /* ó */
        {'o', '~',   207},      /* õ */
        {'1', '1',   218},      /* ¹ */
        {'u', '^',   219},      /* û */
        {'u', '"',   220},      /* ü */
        {'u', '`',   221},      /* ù */
        {'u', '\'',  222},      /* ú */
        {':', '-',   225},      /* ÷ - division symbol in ISO 8859-1 */
        {'o', 'e',   225},      /* ÷ - oe in ISO 8859-15 */
        {'2', '2',   234},      /* ² */
        {'O', '^',   235},      /* Ô */
        {'O', '"',   236},      /* Ö */
        {'O', '`',   237},      /* Ò */
        {'O', '\'',  238},      /* Ó */
        {'O', '~',   239},      /* Õ */
        {'3', '3',   250},      /* ³ */
        {'U', '^',   251},      /* Û */
        {'U', '"',   252},      /* Ü */
        {'U', '`',   253},      /* Ù */
        {'U', '\'',  254},      /* Ú */
        {NUL, NUL, NUL}
        };

#   else
#    if defined(MACOS) && !defined(FEAT_MBYTE)

        /*
         * Macintosh digraphs
         */
       {{'a', 't', 64},         /* @ */
        {'A', '"', 128},        /* ~@ XX */
        {'A', 'o', 129},        /* Å */
        {'C', ',', 130},        /* Ç */
        {'E', '\'', 131},       /* É */
        {'N', '~', 132},        /* Ñ */
        {'O', '"', 133},        /* Ö */
        {'U', '"', 134},        /* Ü */
        {'a', '\'', 135},       /* ~G XX */
        {'a', '`', 136},        /* ~H XX */
        {'a', '^', 137},        /* â */
        {'a', '"', 138},        /* ä */
        {'a', '~', 139},        /* ã */
        {'a', 'o', 140},        /* å */
        {'c', ',', 141},        /* ç */
        {'e', '\'', 142},       /* é */
        {'e', '`', 143},        /* è */
        {'e', '^', 144},        /* ê */
        {'e', '"', 145},        /* ë */
        {'i', '\'', 146},       /* í */
        {'i', '`', 147},        /* ì */
        {'i', '^', 148},        /* î */
        {'i', '"', 149},        /* ï */
        {'n', '~', 150},        /* ñ */
        {'o', '\'', 151},       /* ó */
        {'o', '`', 152},        /* ò */
        {'o', '^', 153},        /* ô */
        {'o', '"', 154},        /* ö */
        {'o', '~', 155},        /* o */
        {'u', '\'', 156},       /* ú */
        {'u', '`', 157},        /* ~] XX */
        {'u', '^', 158},        /* û */
        {'u', '"', 159},        /* ü */
        {'+', '_', 160},        /* Ý */
        {'~', 'o', 161},        /* ° */
        {'c', '|', 162},        /* ¢ */
        {'$', '$', 163},        /* £ */
        {'p', 'a', 164},        /* § */
        {'.', '.', 165},        /* * */
        {'P', 'P', 166},        /* ¶ */
        {'s', 's', 167},        /* ß */
        {'r', 'O', 168},        /* ® */
        {'c', 'O', 169},        /* © */
        {'T', 'M', 170},        /*  */
        {'=', '/', 173},        /* ‚ */
        {'A', 'E', 174},        /* Æ */
        {'O', '/', 175},        /* Ø */
        {'0', '0', 176},        /* ƒ */
        {'+', '-', 177},        /* ± */
        {'<', '=', 178},        /* ¾ */
        {'>', '=', 179},        /* „ */
        {'Y', '-', 180},        /* ¥ */
        {'j', 'u', 181},        /* µ */
        {'m', 'u', 181},        /* µ */
        {'d', 'd', 182},        /*  */
        {'S', 'S', 183},        /* Â… */
        {'S', 'I', 183},        /* Â… */
        {'P', 'I', 184},        /* ½ */
        {'p', 'i', 185},        /* ¼ */
        {'I', 'I', 186},        /* † */
        {'a', '-', 187},        /* » */
        {'o', '-', 188},        /* º */
        {'O', 'M', 189},        /* ½ */
        {'a', 'e', 190},        /* æ */
        {'o', '/', 191},        /* ø */
        {'~', '?', 192},        /* ¿ */
        {'~', '!', 193},        /* ¡ */
        {'-', ',', 194},        /* ¬ */
        {'v', '-', 195},        /* ~H XX */
        {'f', '-', 196},        /* Ÿ */
        {'~', '~', 197},        /* ‰ */
        {'D', 'E', 198},        /*  */
        {'<', '<', 199},        /* « */
        {'>', '>', 200},        /* » */
        {'.', ':', 201},        /* Š */
        {'A', '`', 203},        /* À */
        {'A', '~', 204},        /* Ã */
        {'O', '~', 205},        /* Õ */
        {'O', 'E', 206},        /* ‘ */
        {'o', 'e', 207},        /* ¦ */
        {'-', '.', 208},        /* - */
        {'-', '-', 209},        /* - */
        {'`', '`', 210},        /* " */
        {'\'', '\'', 211},      /* " */
        {'`', ' ', 212},        /* ' */
        {'\'', ' ', 213},       /* ' */
        {'-', ':', 214},        /* ÷ */
        {'D', 'I', 215},        /* × */
        {'y', ':', 216},        /* ÿ */
        {'Y', ':', 217},        /*  */
        {'/', '/', 218},        /* ÂŽ */
        {'E', '=', 219},        /* ¤ Euro System >=8.5 */
        {'o', 'x', 219},        /* ¤ Currency System <=8.1*/
        {'<', ' ', 220},        /* Ð */
        {'>', ' ', 221},        /* ð */
        {'f', 'i', 222},        /* Þ */
        {'f', 'l', 223},        /* þ */
        {'+', '+', 224},        /* ý */
        {'~', '.', 225},        /* · */
        {',', ' ', 226},        /* Â’ */
        {',', ',', 227},        /* “ */
        {'%', '.', 228},        /* ” */
        {'%', '0', 228},        /* ” */
        {'A', '^', 229},        /* Â */
        {'E', '^', 230},        /* Ê */
        {'A', '\'', 231},       /* Á */
        {'E', '"', 232},        /* Ë */
        {'E', '`', 233},        /* È */
        {'I', '\'', 234},       /* Í */
        {'I', '^', 235},        /* Î */
        {'I', '"', 236},        /* Ï */
        {'I', '`', 237},        /* Ì */
        {'O', '\'', 238},       /* Ó */
        {'O', '^', 239},        /* Ô */
        {'A', 'P', 240},        /* • */
        {'O', '`', 241},        /* Ò */
        {'U', '\'', 242},       /* Ú */
        {'U', '^', 243},        /* Û */
        {'U', '`', 244},        /* Ù */
        {'i', '.', 245},        /* ž */
        {NUL, NUL, NUL}
        };

#    else       /* !MACOS */

#     ifdef OLD_DIGRAPHS

        /*
         * digraphs compatible with Vim 5.x
         */
       {{'~', '!', 161},        /* ¡ */
        {'c', '|', 162},        /* ¢ */
        {'$', '$', 163},        /* £ */
        {'o', 'x', 164},        /* ¤ - currency symbol in ISO 8859-1 */
        {'e', '=', 164},        /* ¤ - euro symbol in ISO 8859-15 */
        {'Y', '-', 165},        /* ¥ */
        {'|', '|', 166},        /* ¦ */
        {'p', 'a', 167},        /* § */
        {'"', '"', 168},        /* ¨ */
        {'c', 'O', 169},        /* © */
        {'a', '-', 170},        /* ª */
        {'<', '<', 171},        /* « */
        {'-', ',', 172},        /* ¬ */
        {'-', '-', 173},        /* ­ */
        {'r', 'O', 174},        /* ® */
        {'-', '=', 175},        /* ¯ */
        {'~', 'o', 176},        /* ° */
        {'+', '-', 177},        /* ± */
        {'2', '2', 178},        /* ² */
        {'3', '3', 179},        /* ³ */
        {'\'', '\'', 180},      /* ´ */
        {'j', 'u', 181},        /* µ */
        {'p', 'p', 182},        /* ¶ */
        {'~', '.', 183},        /* · */
        {',', ',', 184},        /* ¸ */
        {'1', '1', 185},        /* ¹ */
        {'o', '-', 186},        /* º */
        {'>', '>', 187},        /* » */
        {'1', '4', 188},        /* ¼ */
        {'1', '2', 189},        /* ½ */
        {'3', '4', 190},        /* ¾ */
        {'~', '?', 191},        /* ¿ */
        {'A', '`', 192},        /* À */
        {'A', '\'', 193},       /* Á */
        {'A', '^', 194},        /* Â */
        {'A', '~', 195},        /* Ã */
        {'A', '"', 196},        /* Ä */
        {'A', '@', 197},        /* Å */
        {'A', 'A', 197},        /* Å */
        {'A', 'E', 198},        /* Æ */
        {'C', ',', 199},        /* Ç */
        {'E', '`', 200},        /* È */
        {'E', '\'', 201},       /* É */
        {'E', '^', 202},        /* Ê */
        {'E', '"', 203},        /* Ë */
        {'I', '`', 204},        /* Ì */
        {'I', '\'', 205},       /* Í */
        {'I', '^', 206},        /* Î */
        {'I', '"', 207},        /* Ï */
        {'D', '-', 208},        /* Ð */
        {'N', '~', 209},        /* Ñ */
        {'O', '`', 210},        /* Ò */
        {'O', '\'', 211},       /* Ó */
        {'O', '^', 212},        /* Ô */
        {'O', '~', 213},        /* Õ */
        {'O', '"', 214},        /* Ö */
        {'/', '\\', 215},       /* × - multiplication symbol in ISO 8859-1 */
        {'O', 'E', 215},        /* × - OE in ISO 8859-15 */
        {'O', '/', 216},        /* Ø */
        {'U', '`', 217},        /* Ù */
        {'U', '\'', 218},       /* Ú */
        {'U', '^', 219},        /* Û */
        {'U', '"', 220},        /* Ü */
        {'Y', '\'', 221},       /* Ý */
        {'I', 'p', 222},        /* Þ */
        {'s', 's', 223},        /* ß */
        {'a', '`', 224},        /* à */
        {'a', '\'', 225},       /* á */
        {'a', '^', 226},        /* â */
        {'a', '~', 227},        /* ã */
        {'a', '"', 228},        /* ä */
        {'a', '@', 229},        /* å */
        {'a', 'a', 229},        /* å */
        {'a', 'e', 230},        /* æ */
        {'c', ',', 231},        /* ç */
        {'e', '`', 232},        /* è */
        {'e', '\'', 233},       /* é */
        {'e', '^', 234},        /* ê */
        {'e', '"', 235},        /* ë */
        {'i', '`', 236},        /* ì */
        {'i', '\'', 237},       /* í */
        {'i', '^', 238},        /* î */
        {'i', '"', 239},        /* ï */
        {'d', '-', 240},        /* ð */
        {'n', '~', 241},        /* ñ */
        {'o', '`', 242},        /* ò */
        {'o', '\'', 243},       /* ó */
        {'o', '^', 244},        /* ô */
        {'o', '~', 245},        /* õ */
        {'o', '"', 246},        /* ö */
        {':', '-', 247},        /* ÷ - division symbol in ISO 8859-1 */
        {'o', 'e', 247},        /* ÷ - oe in ISO 8859-15 */
        {'o', '/', 248},        /* ø */
        {'u', '`', 249},        /* ù */
        {'u', '\'', 250},       /* ú */
        {'u', '^', 251},        /* û */
        {'u', '"', 252},        /* ü */
        {'y', '\'', 253},       /* ý */
        {'i', 'p', 254},        /* þ */
        {'y', '"', 255},        /* x XX */
        {NUL, NUL, NUL}
        };
#     else /* OLD_DIGRAPHS */

        /*
         * digraphs for Unicode from RFC1345
         * (also work for ISO-8859-1 aka latin1)
         */
       {
        {'N', 'U', 0x0a},       /* LF for NUL */
        {'S', 'H', 0x01},
        {'S', 'X', 0x02},
        {'E', 'X', 0x03},
        {'E', 'T', 0x04},
        {'E', 'Q', 0x05},
        {'A', 'K', 0x06},
        {'B', 'L', 0x07},
        {'B', 'S', 0x08},
        {'H', 'T', 0x09},
        {'L', 'F', 0x0a},
        {'V', 'T', 0x0b},
        {'F', 'F', 0x0c},
        {'C', 'R', 0x0d},
        {'S', 'O', 0x0e},
        {'S', 'I', 0x0f},
        {'D', 'L', 0x10},
        {'D', '1', 0x11},
        {'D', '2', 0x12},
        {'D', '3', 0x13},
        {'D', '4', 0x14},
        {'N', 'K', 0x15},
        {'S', 'Y', 0x16},
        {'E', 'B', 0x17},
        {'C', 'N', 0x18},
        {'E', 'M', 0x19},
        {'S', 'B', 0x1a},
        {'E', 'C', 0x1b},
        {'F', 'S', 0x1c},
        {'G', 'S', 0x1d},
        {'R', 'S', 0x1e},
        {'U', 'S', 0x1f},
        {'S', 'P', 0x20},
        {'N', 'b', 0x23},
        {'D', 'O', 0x24},
        {'A', 't', 0x40},
        {'<', '(', 0x5b},
        {'/', '/', 0x5c},
        {')', '>', 0x5d},
        {'\'', '>', 0x5e},
        {'\'', '!', 0x60},
        {'(', '!', 0x7b},
        {'!', '!', 0x7c},
        {'!', ')', 0x7d},
        {'\'', '?', 0x7e},
        {'D', 'T', 0x7f},
        {'P', 'A', 0x80},
        {'H', 'O', 0x81},
        {'B', 'H', 0x82},
        {'N', 'H', 0x83},
        {'I', 'N', 0x84},
        {'N', 'L', 0x85},
        {'S', 'A', 0x86},
        {'E', 'S', 0x87},
        {'H', 'S', 0x88},
        {'H', 'J', 0x89},
        {'V', 'S', 0x8a},
        {'P', 'D', 0x8b},
        {'P', 'U', 0x8c},
        {'R', 'I', 0x8d},
        {'S', '2', 0x8e},
        {'S', '3', 0x8f},
        {'D', 'C', 0x90},
        {'P', '1', 0x91},
        {'P', '2', 0x92},
        {'T', 'S', 0x93},
        {'C', 'C', 0x94},
        {'M', 'W', 0x95},
        {'S', 'G', 0x96},
        {'E', 'G', 0x97},
        {'S', 'S', 0x98},
        {'G', 'C', 0x99},
        {'S', 'C', 0x9a},
        {'C', 'I', 0x9b},
        {'S', 'T', 0x9c},
        {'O', 'C', 0x9d},
        {'P', 'M', 0x9e},
        {'A', 'C', 0x9f},
        {'N', 'S', 0xa0},
        {'!', 'I', 0xa1},
        {'C', 't', 0xa2},
        {'P', 'd', 0xa3},
        {'C', 'u', 0xa4},
        {'Y', 'e', 0xa5},
        {'B', 'B', 0xa6},
        {'S', 'E', 0xa7},
        {'\'', ':', 0xa8},
        {'C', 'o', 0xa9},
        {'-', 'a', 0xaa},
        {'<', '<', 0xab},
        {'N', 'O', 0xac},
        {'-', '-', 0xad},
        {'R', 'g', 0xae},
        {'\'', 'm', 0xaf},
        {'D', 'G', 0xb0},
        {'+', '-', 0xb1},
        {'2', 'S', 0xb2},
        {'3', 'S', 0xb3},
        {'\'', '\'', 0xb4},
        {'M', 'y', 0xb5},
        {'P', 'I', 0xb6},
        {'.', 'M', 0xb7},
        {'\'', ',', 0xb8},
        {'1', 'S', 0xb9},
        {'-', 'o', 0xba},
        {'>', '>', 0xbb},
        {'1', '4', 0xbc},
        {'1', '2', 0xbd},
        {'3', '4', 0xbe},
        {'?', 'I', 0xbf},
        {'A', '!', 0xc0},
        {'A', '\'', 0xc1},
        {'A', '>', 0xc2},
        {'A', '?', 0xc3},
        {'A', ':', 0xc4},
        {'A', 'A', 0xc5},
        {'A', 'E', 0xc6},
        {'C', ',', 0xc7},
        {'E', '!', 0xc8},
        {'E', '\'', 0xc9},
        {'E', '>', 0xca},
        {'E', ':', 0xcb},
        {'I', '!', 0xcc},
        {'I', '\'', 0xcd},
        {'I', '>', 0xce},
        {'I', ':', 0xcf},
        {'D', '-', 0xd0},
        {'N', '?', 0xd1},
        {'O', '!', 0xd2},
        {'O', '\'', 0xd3},
        {'O', '>', 0xd4},
        {'O', '?', 0xd5},
        {'O', ':', 0xd6},
        {'*', 'X', 0xd7},
        {'O', '/', 0xd8},
        {'U', '!', 0xd9},
        {'U', '\'', 0xda},
        {'U', '>', 0xdb},
        {'U', ':', 0xdc},
        {'Y', '\'', 0xdd},
        {'T', 'H', 0xde},
        {'s', 's', 0xdf},
        {'a', '!', 0xe0},
        {'a', '\'', 0xe1},
        {'a', '>', 0xe2},
        {'a', '?', 0xe3},
        {'a', ':', 0xe4},
        {'a', 'a', 0xe5},
        {'a', 'e', 0xe6},
        {'c', ',', 0xe7},
        {'e', '!', 0xe8},
        {'e', '\'', 0xe9},
        {'e', '>', 0xea},
        {'e', ':', 0xeb},
        {'i', '!', 0xec},
        {'i', '\'', 0xed},
        {'i', '>', 0xee},
        {'i', ':', 0xef},
        {'d', '-', 0xf0},
        {'n', '?', 0xf1},
        {'o', '!', 0xf2},
        {'o', '\'', 0xf3},
        {'o', '>', 0xf4},
        {'o', '?', 0xf5},
        {'o', ':', 0xf6},
        {'-', ':', 0xf7},
        {'o', '/', 0xf8},
        {'u', '!', 0xf9},
        {'u', '\'', 0xfa},
        {'u', '>', 0xfb},
        {'u', ':', 0xfc},
        {'y', '\'', 0xfd},
        {'t', 'h', 0xfe},
        {'y', ':', 0xff},

#      ifdef FEAT_MBYTE
#       define USE_UNICODE_DIGRAPHS

        {'A', '-', 0x0100},
        {'a', '-', 0x0101},
        {'A', '(', 0x0102},
        {'a', '(', 0x0103},
        {'A', ';', 0x0104},
        {'a', ';', 0x0105},
        {'C', '\'', 0x0106},
        {'c', '\'', 0x0107},
        {'C', '>', 0x0108},
        {'c', '>', 0x0109},
        {'C', '.', 0x010a},
        {'c', '.', 0x010b},
        {'C', '<', 0x010c},
        {'c', '<', 0x010d},
        {'D', '<', 0x010e},
        {'d', '<', 0x010f},
        {'D', '/', 0x0110},
        {'d', '/', 0x0111},
        {'E', '-', 0x0112},
        {'e', '-', 0x0113},
        {'E', '(', 0x0114},
        {'e', '(', 0x0115},
        {'E', '.', 0x0116},
        {'e', '.', 0x0117},
        {'E', ';', 0x0118},
        {'e', ';', 0x0119},
        {'E', '<', 0x011a},
        {'e', '<', 0x011b},
        {'G', '>', 0x011c},
        {'g', '>', 0x011d},
        {'G', '(', 0x011e},
        {'g', '(', 0x011f},
        {'G', '.', 0x0120},
        {'g', '.', 0x0121},
        {'G', ',', 0x0122},
        {'g', ',', 0x0123},
        {'H', '>', 0x0124},
        {'h', '>', 0x0125},
        {'H', '/', 0x0126},
        {'h', '/', 0x0127},
        {'I', '?', 0x0128},
        {'i', '?', 0x0129},
        {'I', '-', 0x012a},
        {'i', '-', 0x012b},
        {'I', '(', 0x012c},
        {'i', '(', 0x012d},
        {'I', ';', 0x012e},
        {'i', ';', 0x012f},
        {'I', '.', 0x0130},
        {'i', '.', 0x0131},
        {'I', 'J', 0x0132},
        {'i', 'j', 0x0133},
        {'J', '>', 0x0134},
        {'j', '>', 0x0135},
        {'K', ',', 0x0136},
        {'k', ',', 0x0137},
        {'k', 'k', 0x0138},
        {'L', '\'', 0x0139},
        {'l', '\'', 0x013a},
        {'L', ',', 0x013b},
        {'l', ',', 0x013c},
        {'L', '<', 0x013d},
        {'l', '<', 0x013e},
        {'L', '.', 0x013f},
        {'l', '.', 0x0140},
        {'L', '/', 0x0141},
        {'l', '/', 0x0142},
        {'N', '\'', 0x0143},
        {'n', '\'', 0x0144},
        {'N', ',', 0x0145},
        {'n', ',', 0x0146},
        {'N', '<', 0x0147},
        {'n', '<', 0x0148},
        {'\'', 'n', 0x0149},
        {'N', 'G', 0x014a},
        {'n', 'g', 0x014b},
        {'O', '-', 0x014c},
        {'o', '-', 0x014d},
        {'O', '(', 0x014e},
        {'o', '(', 0x014f},
        {'O', '"', 0x0150},
        {'o', '"', 0x0151},
        {'O', 'E', 0x0152},
        {'o', 'e', 0x0153},
        {'R', '\'', 0x0154},
        {'r', '\'', 0x0155},
        {'R', ',', 0x0156},
        {'r', ',', 0x0157},
        {'R', '<', 0x0158},
        {'r', '<', 0x0159},
        {'S', '\'', 0x015a},
        {'s', '\'', 0x015b},
        {'S', '>', 0x015c},
        {'s', '>', 0x015d},
        {'S', ',', 0x015e},
        {'s', ',', 0x015f},
        {'S', '<', 0x0160},
        {'s', '<', 0x0161},
        {'T', ',', 0x0162},
        {'t', ',', 0x0163},
        {'T', '<', 0x0164},
        {'t', '<', 0x0165},
        {'T', '/', 0x0166},
        {'t', '/', 0x0167},
        {'U', '?', 0x0168},
        {'u', '?', 0x0169},
        {'U', '-', 0x016a},
        {'u', '-', 0x016b},
        {'U', '(', 0x016c},
        {'u', '(', 0x016d},
        {'U', '0', 0x016e},
        {'u', '0', 0x016f},
        {'U', '"', 0x0170},
        {'u', '"', 0x0171},
        {'U', ';', 0x0172},
        {'u', ';', 0x0173},
        {'W', '>', 0x0174},
        {'w', '>', 0x0175},
        {'Y', '>', 0x0176},
        {'y', '>', 0x0177},
        {'Y', ':', 0x0178},
        {'Z', '\'', 0x0179},
        {'z', '\'', 0x017a},
        {'Z', '.', 0x017b},
        {'z', '.', 0x017c},
        {'Z', '<', 0x017d},
        {'z', '<', 0x017e},
        {'O', '9', 0x01a0},
        {'o', '9', 0x01a1},
        {'O', 'I', 0x01a2},
        {'o', 'i', 0x01a3},
        {'y', 'r', 0x01a6},
        {'U', '9', 0x01af},
        {'u', '9', 0x01b0},
        {'Z', '/', 0x01b5},
        {'z', '/', 0x01b6},
        {'E', 'D', 0x01b7},
        {'A', '<', 0x01cd},
        {'a', '<', 0x01ce},
        {'I', '<', 0x01cf},
        {'i', '<', 0x01d0},
        {'O', '<', 0x01d1},
        {'o', '<', 0x01d2},
        {'U', '<', 0x01d3},
        {'u', '<', 0x01d4},
        {'A', '1', 0x01de},
        {'a', '1', 0x01df},
        {'A', '7', 0x01e0},
        {'a', '7', 0x01e1},
        {'A', '3', 0x01e2},
        {'a', '3', 0x01e3},
        {'G', '/', 0x01e4},
        {'g', '/', 0x01e5},
        {'G', '<', 0x01e6},
        {'g', '<', 0x01e7},
        {'K', '<', 0x01e8},
        {'k', '<', 0x01e9},
        {'O', ';', 0x01ea},
        {'o', ';', 0x01eb},
        {'O', '1', 0x01ec},
        {'o', '1', 0x01ed},
        {'E', 'Z', 0x01ee},
        {'e', 'z', 0x01ef},
        {'j', '<', 0x01f0},
        {'G', '\'', 0x01f4},
        {'g', '\'', 0x01f5},
        {';', 'S', 0x02bf},
        {'\'', '<', 0x02c7},
        {'\'', '(', 0x02d8},
        {'\'', '.', 0x02d9},
        {'\'', '0', 0x02da},
        {'\'', ';', 0x02db},
        {'\'', '"', 0x02dd},
        {'A', '%', 0x0386},
        {'E', '%', 0x0388},
        {'Y', '%', 0x0389},
        {'I', '%', 0x038a},
        {'O', '%', 0x038c},
        {'U', '%', 0x038e},
        {'W', '%', 0x038f},
        {'i', '3', 0x0390},
        {'A', '*', 0x0391},
        {'B', '*', 0x0392},
        {'G', '*', 0x0393},
        {'D', '*', 0x0394},
        {'E', '*', 0x0395},
        {'Z', '*', 0x0396},
        {'Y', '*', 0x0397},
        {'H', '*', 0x0398},
        {'I', '*', 0x0399},
        {'K', '*', 0x039a},
        {'L', '*', 0x039b},
        {'M', '*', 0x039c},
        {'N', '*', 0x039d},
        {'C', '*', 0x039e},
        {'O', '*', 0x039f},
        {'P', '*', 0x03a0},
        {'R', '*', 0x03a1},
        {'S', '*', 0x03a3},
        {'T', '*', 0x03a4},
        {'U', '*', 0x03a5},
        {'F', '*', 0x03a6},
        {'X', '*', 0x03a7},
        {'Q', '*', 0x03a8},
        {'W', '*', 0x03a9},
        {'J', '*', 0x03aa},
        {'V', '*', 0x03ab},
        {'a', '%', 0x03ac},
        {'e', '%', 0x03ad},
        {'y', '%', 0x03ae},
        {'i', '%', 0x03af},
        {'u', '3', 0x03b0},
        {'a', '*', 0x03b1},
        {'b', '*', 0x03b2},
        {'g', '*', 0x03b3},
        {'d', '*', 0x03b4},
        {'e', '*', 0x03b5},
        {'z', '*', 0x03b6},
        {'y', '*', 0x03b7},
        {'h', '*', 0x03b8},
        {'i', '*', 0x03b9},
        {'k', '*', 0x03ba},
        {'l', '*', 0x03bb},
        {'m', '*', 0x03bc},
        {'n', '*', 0x03bd},
        {'c', '*', 0x03be},
        {'o', '*', 0x03bf},
        {'p', '*', 0x03c0},
        {'r', '*', 0x03c1},
        {'*', 's', 0x03c2},
        {'s', '*', 0x03c3},
        {'t', '*', 0x03c4},
        {'u', '*', 0x03c5},
        {'f', '*', 0x03c6},
        {'x', '*', 0x03c7},
        {'q', '*', 0x03c8},
        {'w', '*', 0x03c9},
        {'j', '*', 0x03ca},
        {'v', '*', 0x03cb},
        {'o', '%', 0x03cc},
        {'u', '%', 0x03cd},
        {'w', '%', 0x03ce},
        {'\'', 'G', 0x03d8},
        {',', 'G', 0x03d9},
        {'T', '3', 0x03da},
        {'t', '3', 0x03db},
        {'M', '3', 0x03dc},
        {'m', '3', 0x03dd},
        {'K', '3', 0x03de},
        {'k', '3', 0x03df},
        {'P', '3', 0x03e0},
        {'p', '3', 0x03e1},
        {'\'', '%', 0x03f4},
        {'j', '3', 0x03f5},
        {'I', 'O', 0x0401},
        {'D', '%', 0x0402},
        {'G', '%', 0x0403},
        {'I', 'E', 0x0404},
        {'D', 'S', 0x0405},
        {'I', 'I', 0x0406},
        {'Y', 'I', 0x0407},
        {'J', '%', 0x0408},
        {'L', 'J', 0x0409},
        {'N', 'J', 0x040a},
        {'T', 's', 0x040b},
        {'K', 'J', 0x040c},
        {'V', '%', 0x040e},
        {'D', 'Z', 0x040f},
        {'A', '=', 0x0410},
        {'B', '=', 0x0411},
        {'V', '=', 0x0412},
        {'G', '=', 0x0413},
        {'D', '=', 0x0414},
        {'E', '=', 0x0415},
        {'Z', '%', 0x0416},
        {'Z', '=', 0x0417},
        {'I', '=', 0x0418},
        {'J', '=', 0x0419},
        {'K', '=', 0x041a},
        {'L', '=', 0x041b},
        {'M', '=', 0x041c},
        {'N', '=', 0x041d},
        {'O', '=', 0x041e},
        {'P', '=', 0x041f},
        {'R', '=', 0x0420},
        {'S', '=', 0x0421},
        {'T', '=', 0x0422},
        {'U', '=', 0x0423},
        {'F', '=', 0x0424},
        {'H', '=', 0x0425},
        {'C', '=', 0x0426},
        {'C', '%', 0x0427},
        {'S', '%', 0x0428},
        {'S', 'c', 0x0429},
        {'=', '"', 0x042a},
        {'Y', '=', 0x042b},
        {'%', '"', 0x042c},
        {'J', 'E', 0x042d},
        {'J', 'U', 0x042e},
        {'J', 'A', 0x042f},
        {'a', '=', 0x0430},
        {'b', '=', 0x0431},
        {'v', '=', 0x0432},
        {'g', '=', 0x0433},
        {'d', '=', 0x0434},
        {'e', '=', 0x0435},
        {'z', '%', 0x0436},
        {'z', '=', 0x0437},
        {'i', '=', 0x0438},
        {'j', '=', 0x0439},
        {'k', '=', 0x043a},
        {'l', '=', 0x043b},
        {'m', '=', 0x043c},
        {'n', '=', 0x043d},
        {'o', '=', 0x043e},
        {'p', '=', 0x043f},
        {'r', '=', 0x0440},
        {'s', '=', 0x0441},
        {'t', '=', 0x0442},
        {'u', '=', 0x0443},
        {'f', '=', 0x0444},
        {'h', '=', 0x0445},
        {'c', '=', 0x0446},
        {'c', '%', 0x0447},
        {'s', '%', 0x0448},
        {'s', 'c', 0x0449},
        {'=', '\'', 0x044a},
        {'y', '=', 0x044b},
        {'%', '\'', 0x044c},
        {'j', 'e', 0x044d},
        {'j', 'u', 0x044e},
        {'j', 'a', 0x044f},
        {'i', 'o', 0x0451},
        {'d', '%', 0x0452},
        {'g', '%', 0x0453},
        {'i', 'e', 0x0454},
        {'d', 's', 0x0455},
        {'i', 'i', 0x0456},
        {'y', 'i', 0x0457},
        {'j', '%', 0x0458},
        {'l', 'j', 0x0459},
        {'n', 'j', 0x045a},
        {'t', 's', 0x045b},
        {'k', 'j', 0x045c},
        {'v', '%', 0x045e},
        {'d', 'z', 0x045f},
        {'Y', '3', 0x0462},
        {'y', '3', 0x0463},
        {'O', '3', 0x046a},
        {'o', '3', 0x046b},
        {'F', '3', 0x0472},
        {'f', '3', 0x0473},
        {'V', '3', 0x0474},
        {'v', '3', 0x0475},
        {'C', '3', 0x0480},
        {'c', '3', 0x0481},
        {'G', '3', 0x0490},
        {'g', '3', 0x0491},
        {'A', '+', 0x05d0},
        {'B', '+', 0x05d1},
        {'G', '+', 0x05d2},
        {'D', '+', 0x05d3},
        {'H', '+', 0x05d4},
        {'W', '+', 0x05d5},
        {'Z', '+', 0x05d6},
        {'X', '+', 0x05d7},
        {'T', 'j', 0x05d8},
        {'J', '+', 0x05d9},
        {'K', '%', 0x05da},
        {'K', '+', 0x05db},
        {'L', '+', 0x05dc},
        {'M', '%', 0x05dd},
        {'M', '+', 0x05de},
        {'N', '%', 0x05df},
        {'N', '+', 0x05e0},
        {'S', '+', 0x05e1},
        {'E', '+', 0x05e2},
        {'P', '%', 0x05e3},
        {'P', '+', 0x05e4},
        {'Z', 'j', 0x05e5},
        {'Z', 'J', 0x05e6},
        {'Q', '+', 0x05e7},
        {'R', '+', 0x05e8},
        {'S', 'h', 0x05e9},
        {'T', '+', 0x05ea},
        {',', '+', 0x060c},
        {';', '+', 0x061b},
        {'?', '+', 0x061f},
        {'H', '\'', 0x0621},
        {'a', 'M', 0x0622},
        {'a', 'H', 0x0623},
        {'w', 'H', 0x0624},
        {'a', 'h', 0x0625},
        {'y', 'H', 0x0626},
        {'a', '+', 0x0627},
        {'b', '+', 0x0628},
        {'t', 'm', 0x0629},
        {'t', '+', 0x062a},
        {'t', 'k', 0x062b},
        {'g', '+', 0x062c},
        {'h', 'k', 0x062d},
        {'x', '+', 0x062e},
        {'d', '+', 0x062f},
        {'d', 'k', 0x0630},
        {'r', '+', 0x0631},
        {'z', '+', 0x0632},
        {'s', '+', 0x0633},
        {'s', 'n', 0x0634},
        {'c', '+', 0x0635},
        {'d', 'd', 0x0636},
        {'t', 'j', 0x0637},
        {'z', 'H', 0x0638},
        {'e', '+', 0x0639},
        {'i', '+', 0x063a},
        {'+', '+', 0x0640},
        {'f', '+', 0x0641},
        {'q', '+', 0x0642},
        {'k', '+', 0x0643},
        {'l', '+', 0x0644},
        {'m', '+', 0x0645},
        {'n', '+', 0x0646},
        {'h', '+', 0x0647},
        {'w', '+', 0x0648},
        {'j', '+', 0x0649},
        {'y', '+', 0x064a},
        {':', '+', 0x064b},
        {'"', '+', 0x064c},
        {'=', '+', 0x064d},
        {'/', '+', 0x064e},
        {'\'', '+', 0x064f},
        {'1', '+', 0x0650},
        {'3', '+', 0x0651},
        {'0', '+', 0x0652},
        {'a', 'S', 0x0670},
        {'p', '+', 0x067e},
        {'v', '+', 0x06a4},
        {'g', 'f', 0x06af},
        {'0', 'a', 0x06f0},
        {'1', 'a', 0x06f1},
        {'2', 'a', 0x06f2},
        {'3', 'a', 0x06f3},
        {'4', 'a', 0x06f4},
        {'5', 'a', 0x06f5},
        {'6', 'a', 0x06f6},
        {'7', 'a', 0x06f7},
        {'8', 'a', 0x06f8},
        {'9', 'a', 0x06f9},
        {'B', '.', 0x1e02},
        {'b', '.', 0x1e03},
        {'B', '_', 0x1e06},
        {'b', '_', 0x1e07},
        {'D', '.', 0x1e0a},
        {'d', '.', 0x1e0b},
        {'D', '_', 0x1e0e},
        {'d', '_', 0x1e0f},
        {'D', ',', 0x1e10},
        {'d', ',', 0x1e11},
        {'F', '.', 0x1e1e},
        {'f', '.', 0x1e1f},
        {'G', '-', 0x1e20},
        {'g', '-', 0x1e21},
        {'H', '.', 0x1e22},
        {'h', '.', 0x1e23},
        {'H', ':', 0x1e26},
        {'h', ':', 0x1e27},
        {'H', ',', 0x1e28},
        {'h', ',', 0x1e29},
        {'K', '\'', 0x1e30},
        {'k', '\'', 0x1e31},
        {'K', '_', 0x1e34},
        {'k', '_', 0x1e35},
        {'L', '_', 0x1e3a},
        {'l', '_', 0x1e3b},
        {'M', '\'', 0x1e3e},
        {'m', '\'', 0x1e3f},
        {'M', '.', 0x1e40},
        {'m', '.', 0x1e41},
        {'N', '.', 0x1e44},
        {'n', '.', 0x1e45},
        {'N', '_', 0x1e48},
        {'n', '_', 0x1e49},
        {'P', '\'', 0x1e54},
        {'p', '\'', 0x1e55},
        {'P', '.', 0x1e56},
        {'p', '.', 0x1e57},
        {'R', '.', 0x1e58},
        {'r', '.', 0x1e59},
        {'R', '_', 0x1e5e},
        {'r', '_', 0x1e5f},
        {'S', '.', 0x1e60},
        {'s', '.', 0x1e61},
        {'T', '.', 0x1e6a},
        {'t', '.', 0x1e6b},
        {'T', '_', 0x1e6e},
        {'t', '_', 0x1e6f},
        {'V', '?', 0x1e7c},
        {'v', '?', 0x1e7d},
        {'W', '!', 0x1e80},
        {'w', '!', 0x1e81},
        {'W', '\'', 0x1e82},
        {'w', '\'', 0x1e83},
        {'W', ':', 0x1e84},
        {'w', ':', 0x1e85},
        {'W', '.', 0x1e86},
        {'w', '.', 0x1e87},
        {'X', '.', 0x1e8a},
        {'x', '.', 0x1e8b},
        {'X', ':', 0x1e8c},
        {'x', ':', 0x1e8d},
        {'Y', '.', 0x1e8e},
        {'y', '.', 0x1e8f},
        {'Z', '>', 0x1e90},
        {'z', '>', 0x1e91},
        {'Z', '_', 0x1e94},
        {'z', '_', 0x1e95},
        {'h', '_', 0x1e96},
        {'t', ':', 0x1e97},
        {'w', '0', 0x1e98},
        {'y', '0', 0x1e99},
        {'A', '2', 0x1ea2},
        {'a', '2', 0x1ea3},
        {'E', '2', 0x1eba},
        {'e', '2', 0x1ebb},
        {'E', '?', 0x1ebc},
        {'e', '?', 0x1ebd},
        {'I', '2', 0x1ec8},
        {'i', '2', 0x1ec9},
        {'O', '2', 0x1ece},
        {'o', '2', 0x1ecf},
        {'U', '2', 0x1ee6},
        {'u', '2', 0x1ee7},
        {'Y', '!', 0x1ef2},
        {'y', '!', 0x1ef3},
        {'Y', '2', 0x1ef6},
        {'y', '2', 0x1ef7},
        {'Y', '?', 0x1ef8},
        {'y', '?', 0x1ef9},
        {';', '\'', 0x1f00},
        {',', '\'', 0x1f01},
        {';', '!', 0x1f02},
        {',', '!', 0x1f03},
        {'?', ';', 0x1f04},
        {'?', ',', 0x1f05},
        {'!', ':', 0x1f06},
        {'?', ':', 0x1f07},
        {'1', 'N', 0x2002},
        {'1', 'M', 0x2003},
        {'3', 'M', 0x2004},
        {'4', 'M', 0x2005},
        {'6', 'M', 0x2006},
        {'1', 'T', 0x2009},
        {'1', 'H', 0x200a},
        {'-', '1', 0x2010},
        {'-', 'N', 0x2013},
        {'-', 'M', 0x2014},
        {'-', '3', 0x2015},
        {'!', '2', 0x2016},
        {'=', '2', 0x2017},
        {'\'', '6', 0x2018},
        {'\'', '9', 0x2019},
        {'.', '9', 0x201a},
        {'9', '\'', 0x201b},
        {'"', '6', 0x201c},
        {'"', '9', 0x201d},
        {':', '9', 0x201e},
        {'9', '"', 0x201f},
        {'/', '-', 0x2020},
        {'/', '=', 0x2021},
        {'.', '.', 0x2025},
        {'%', '0', 0x2030},
        {'1', '\'', 0x2032},
        {'2', '\'', 0x2033},
        {'3', '\'', 0x2034},
        {'1', '"', 0x2035},
        {'2', '"', 0x2036},
        {'3', '"', 0x2037},
        {'C', 'a', 0x2038},
        {'<', '1', 0x2039},
        {'>', '1', 0x203a},
        {':', 'X', 0x203b},
        {'\'', '-', 0x203e},
        {'/', 'f', 0x2044},
        {'0', 'S', 0x2070},
        {'4', 'S', 0x2074},
        {'5', 'S', 0x2075},
        {'6', 'S', 0x2076},
        {'7', 'S', 0x2077},
        {'8', 'S', 0x2078},
        {'9', 'S', 0x2079},
        {'+', 'S', 0x207a},
        {'-', 'S', 0x207b},
        {'=', 'S', 0x207c},
        {'(', 'S', 0x207d},
        {')', 'S', 0x207e},
        {'n', 'S', 0x207f},
        {'0', 's', 0x2080},
        {'1', 's', 0x2081},
        {'2', 's', 0x2082},
        {'3', 's', 0x2083},
        {'4', 's', 0x2084},
        {'5', 's', 0x2085},
        {'6', 's', 0x2086},
        {'7', 's', 0x2087},
        {'8', 's', 0x2088},
        {'9', 's', 0x2089},
        {'+', 's', 0x208a},
        {'-', 's', 0x208b},
        {'=', 's', 0x208c},
        {'(', 's', 0x208d},
        {')', 's', 0x208e},
        {'L', 'i', 0x20a4},
        {'P', 't', 0x20a7},
        {'W', '=', 0x20a9},
        {'=', 'e', 0x20ac}, /* euro */
        {'E', 'u', 0x20ac}, /* euro */
        {'o', 'C', 0x2103},
        {'c', 'o', 0x2105},
        {'o', 'F', 0x2109},
        {'N', '0', 0x2116},
        {'P', 'O', 0x2117},
        {'R', 'x', 0x211e},
        {'S', 'M', 0x2120},
        {'T', 'M', 0x2122},
        {'O', 'm', 0x2126},
        {'A', 'O', 0x212b},
        {'1', '3', 0x2153},
        {'2', '3', 0x2154},
        {'1', '5', 0x2155},
        {'2', '5', 0x2156},
        {'3', '5', 0x2157},
        {'4', '5', 0x2158},
        {'1', '6', 0x2159},
        {'5', '6', 0x215a},
        {'1', '8', 0x215b},
        {'3', '8', 0x215c},
        {'5', '8', 0x215d},
        {'7', '8', 0x215e},
        {'1', 'R', 0x2160},
        {'2', 'R', 0x2161},
        {'3', 'R', 0x2162},
        {'4', 'R', 0x2163},
        {'5', 'R', 0x2164},
        {'6', 'R', 0x2165},
        {'7', 'R', 0x2166},
        {'8', 'R', 0x2167},
        {'9', 'R', 0x2168},
        {'a', 'R', 0x2169},
        {'b', 'R', 0x216a},
        {'c', 'R', 0x216b},
        {'1', 'r', 0x2170},
        {'2', 'r', 0x2171},
        {'3', 'r', 0x2172},
        {'4', 'r', 0x2173},
        {'5', 'r', 0x2174},
        {'6', 'r', 0x2175},
        {'7', 'r', 0x2176},
        {'8', 'r', 0x2177},
        {'9', 'r', 0x2178},
        {'a', 'r', 0x2179},
        {'b', 'r', 0x217a},
        {'c', 'r', 0x217b},
        {'<', '-', 0x2190},
        {'-', '!', 0x2191},
        {'-', '>', 0x2192},
        {'-', 'v', 0x2193},
        {'<', '>', 0x2194},
        {'U', 'D', 0x2195},
        {'<', '=', 0x21d0},
        {'=', '>', 0x21d2},
        {'=', '=', 0x21d4},
        {'F', 'A', 0x2200},
        {'d', 'P', 0x2202},
        {'T', 'E', 0x2203},
        {'/', '0', 0x2205},
        {'D', 'E', 0x2206},
        {'N', 'B', 0x2207},
        {'(', '-', 0x2208},
        {'-', ')', 0x220b},
        {'*', 'P', 0x220f},
        {'+', 'Z', 0x2211},
        {'-', '2', 0x2212},
        {'-', '+', 0x2213},
        {'*', '-', 0x2217},
        {'O', 'b', 0x2218},
        {'S', 'b', 0x2219},
        {'R', 'T', 0x221a},
        {'0', '(', 0x221d},
        {'0', '0', 0x221e},
        {'-', 'L', 0x221f},
        {'-', 'V', 0x2220},
        {'P', 'P', 0x2225},
        {'A', 'N', 0x2227},
        {'O', 'R', 0x2228},
        {'(', 'U', 0x2229},
        {')', 'U', 0x222a},
        {'I', 'n', 0x222b},
        {'D', 'I', 0x222c},
        {'I', 'o', 0x222e},
        {'.', ':', 0x2234},
        {':', '.', 0x2235},
        {':', 'R', 0x2236},
        {':', ':', 0x2237},
        {'?', '1', 0x223c},
        {'C', 'G', 0x223e},
        {'?', '-', 0x2243},
        {'?', '=', 0x2245},
        {'?', '2', 0x2248},
        {'=', '?', 0x224c},
        {'H', 'I', 0x2253},
        {'!', '=', 0x2260},
        {'=', '3', 0x2261},
        {'=', '<', 0x2264},
        {'>', '=', 0x2265},
        {'<', '*', 0x226a},
        {'*', '>', 0x226b},
        {'!', '<', 0x226e},
        {'!', '>', 0x226f},
        {'(', 'C', 0x2282},
        {')', 'C', 0x2283},
        {'(', '_', 0x2286},
        {')', '_', 0x2287},
        {'0', '.', 0x2299},
        {'0', '2', 0x229a},
        {'-', 'T', 0x22a5},
        {'.', 'P', 0x22c5},
        {':', '3', 0x22ee},
        {'.', '3', 0x22ef},
        {'E', 'h', 0x2302},
        {'<', '7', 0x2308},
        {'>', '7', 0x2309},
        {'7', '<', 0x230a},
        {'7', '>', 0x230b},
        {'N', 'I', 0x2310},
        {'(', 'A', 0x2312},
        {'T', 'R', 0x2315},
        {'I', 'u', 0x2320},
        {'I', 'l', 0x2321},
        {'<', '/', 0x2329},
        {'/', '>', 0x232a},
        {'V', 's', 0x2423},
        {'1', 'h', 0x2440},
        {'3', 'h', 0x2441},
        {'2', 'h', 0x2442},
        {'4', 'h', 0x2443},
        {'1', 'j', 0x2446},
        {'2', 'j', 0x2447},
        {'3', 'j', 0x2448},
        {'4', 'j', 0x2449},
        {'1', '.', 0x2488},
        {'2', '.', 0x2489},
        {'3', '.', 0x248a},
        {'4', '.', 0x248b},
        {'5', '.', 0x248c},
        {'6', '.', 0x248d},
        {'7', '.', 0x248e},
        {'8', '.', 0x248f},
        {'9', '.', 0x2490},
        {'h', 'h', 0x2500},
        {'H', 'H', 0x2501},
        {'v', 'v', 0x2502},
        {'V', 'V', 0x2503},
        {'3', '-', 0x2504},
        {'3', '_', 0x2505},
        {'3', '!', 0x2506},
        {'3', '/', 0x2507},
        {'4', '-', 0x2508},
        {'4', '_', 0x2509},
        {'4', '!', 0x250a},
        {'4', '/', 0x250b},
        {'d', 'r', 0x250c},
        {'d', 'R', 0x250d},
        {'D', 'r', 0x250e},
        {'D', 'R', 0x250f},
        {'d', 'l', 0x2510},
        {'d', 'L', 0x2511},
        {'D', 'l', 0x2512},
        {'L', 'D', 0x2513},
        {'u', 'r', 0x2514},
        {'u', 'R', 0x2515},
        {'U', 'r', 0x2516},
        {'U', 'R', 0x2517},
        {'u', 'l', 0x2518},
        {'u', 'L', 0x2519},
        {'U', 'l', 0x251a},
        {'U', 'L', 0x251b},
        {'v', 'r', 0x251c},
        {'v', 'R', 0x251d},
        {'V', 'r', 0x2520},
        {'V', 'R', 0x2523},
        {'v', 'l', 0x2524},
        {'v', 'L', 0x2525},
        {'V', 'l', 0x2528},
        {'V', 'L', 0x252b},
        {'d', 'h', 0x252c},
        {'d', 'H', 0x252f},
        {'D', 'h', 0x2530},
        {'D', 'H', 0x2533},
        {'u', 'h', 0x2534},
        {'u', 'H', 0x2537},
        {'U', 'h', 0x2538},
        {'U', 'H', 0x253b},
        {'v', 'h', 0x253c},
        {'v', 'H', 0x253f},
        {'V', 'h', 0x2542},
        {'V', 'H', 0x254b},
        {'F', 'D', 0x2571},
        {'B', 'D', 0x2572},
        {'T', 'B', 0x2580},
        {'L', 'B', 0x2584},
        {'F', 'B', 0x2588},
        {'l', 'B', 0x258c},
        {'R', 'B', 0x2590},
        {'.', 'S', 0x2591},
        {':', 'S', 0x2592},
        {'?', 'S', 0x2593},
        {'f', 'S', 0x25a0},
        {'O', 'S', 0x25a1},
        {'R', 'O', 0x25a2},
        {'R', 'r', 0x25a3},
        {'R', 'F', 0x25a4},
        {'R', 'Y', 0x25a5},
        {'R', 'H', 0x25a6},
        {'R', 'Z', 0x25a7},
        {'R', 'K', 0x25a8},
        {'R', 'X', 0x25a9},
        {'s', 'B', 0x25aa},
        {'S', 'R', 0x25ac},
        {'O', 'r', 0x25ad},
        {'U', 'T', 0x25b2},
        {'u', 'T', 0x25b3},
        {'P', 'R', 0x25b6},
        {'T', 'r', 0x25b7},
        {'D', 't', 0x25bc},
        {'d', 'T', 0x25bd},
        {'P', 'L', 0x25c0},
        {'T', 'l', 0x25c1},
        {'D', 'b', 0x25c6},
        {'D', 'w', 0x25c7},
        {'L', 'Z', 0x25ca},
        {'0', 'm', 0x25cb},
        {'0', 'o', 0x25ce},
        {'0', 'M', 0x25cf},
        {'0', 'L', 0x25d0},
        {'0', 'R', 0x25d1},
        {'S', 'n', 0x25d8},
        {'I', 'c', 0x25d9},
        {'F', 'd', 0x25e2},
        {'B', 'd', 0x25e3},
        {'*', '2', 0x2605},
        {'*', '1', 0x2606},
        {'<', 'H', 0x261c},
        {'>', 'H', 0x261e},
        {'0', 'u', 0x263a},
        {'0', 'U', 0x263b},
        {'S', 'U', 0x263c},
        {'F', 'm', 0x2640},
        {'M', 'l', 0x2642},
        {'c', 'S', 0x2660},
        {'c', 'H', 0x2661},
        {'c', 'D', 0x2662},
        {'c', 'C', 0x2663},
        {'M', 'd', 0x2669},
        {'M', '8', 0x266a},
        {'M', '2', 0x266b},
        {'M', 'b', 0x266d},
        {'M', 'x', 0x266e},
        {'M', 'X', 0x266f},
        {'O', 'K', 0x2713},
        {'X', 'X', 0x2717},
        {'-', 'X', 0x2720},
        {'I', 'S', 0x3000},
        {',', '_', 0x3001},
        {'.', '_', 0x3002},
        {'+', '"', 0x3003},
        {'+', '_', 0x3004},
        {'*', '_', 0x3005},
        {';', '_', 0x3006},
        {'0', '_', 0x3007},
        {'<', '+', 0x300a},
        {'>', '+', 0x300b},
        {'<', '\'', 0x300c},
        {'>', '\'', 0x300d},
        {'<', '"', 0x300e},
        {'>', '"', 0x300f},
        {'(', '"', 0x3010},
        {')', '"', 0x3011},
        {'=', 'T', 0x3012},
        {'=', '_', 0x3013},
        {'(', '\'', 0x3014},
        {')', '\'', 0x3015},
        {'(', 'I', 0x3016},
        {')', 'I', 0x3017},
        {'-', '?', 0x301c},
        {'A', '5', 0x3041},
        {'a', '5', 0x3042},
        {'I', '5', 0x3043},
        {'i', '5', 0x3044},
        {'U', '5', 0x3045},
        {'u', '5', 0x3046},
        {'E', '5', 0x3047},
        {'e', '5', 0x3048},
        {'O', '5', 0x3049},
        {'o', '5', 0x304a},
        {'k', 'a', 0x304b},
        {'g', 'a', 0x304c},
        {'k', 'i', 0x304d},
        {'g', 'i', 0x304e},
        {'k', 'u', 0x304f},
        {'g', 'u', 0x3050},
        {'k', 'e', 0x3051},
        {'g', 'e', 0x3052},
        {'k', 'o', 0x3053},
        {'g', 'o', 0x3054},
        {'s', 'a', 0x3055},
        {'z', 'a', 0x3056},
        {'s', 'i', 0x3057},
        {'z', 'i', 0x3058},
        {'s', 'u', 0x3059},
        {'z', 'u', 0x305a},
        {'s', 'e', 0x305b},
        {'z', 'e', 0x305c},
        {'s', 'o', 0x305d},
        {'z', 'o', 0x305e},
        {'t', 'a', 0x305f},
        {'d', 'a', 0x3060},
        {'t', 'i', 0x3061},
        {'d', 'i', 0x3062},
        {'t', 'U', 0x3063},
        {'t', 'u', 0x3064},
        {'d', 'u', 0x3065},
        {'t', 'e', 0x3066},
        {'d', 'e', 0x3067},
        {'t', 'o', 0x3068},
        {'d', 'o', 0x3069},
        {'n', 'a', 0x306a},
        {'n', 'i', 0x306b},
        {'n', 'u', 0x306c},
        {'n', 'e', 0x306d},
        {'n', 'o', 0x306e},
        {'h', 'a', 0x306f},
        {'b', 'a', 0x3070},
        {'p', 'a', 0x3071},
        {'h', 'i', 0x3072},
        {'b', 'i', 0x3073},
        {'p', 'i', 0x3074},
        {'h', 'u', 0x3075},
        {'b', 'u', 0x3076},
        {'p', 'u', 0x3077},
        {'h', 'e', 0x3078},
        {'b', 'e', 0x3079},
        {'p', 'e', 0x307a},
        {'h', 'o', 0x307b},
        {'b', 'o', 0x307c},
        {'p', 'o', 0x307d},
        {'m', 'a', 0x307e},
        {'m', 'i', 0x307f},
        {'m', 'u', 0x3080},
        {'m', 'e', 0x3081},
        {'m', 'o', 0x3082},
        {'y', 'A', 0x3083},
        {'y', 'a', 0x3084},
        {'y', 'U', 0x3085},
        {'y', 'u', 0x3086},
        {'y', 'O', 0x3087},
        {'y', 'o', 0x3088},
        {'r', 'a', 0x3089},
        {'r', 'i', 0x308a},
        {'r', 'u', 0x308b},
        {'r', 'e', 0x308c},
        {'r', 'o', 0x308d},
        {'w', 'A', 0x308e},
        {'w', 'a', 0x308f},
        {'w', 'i', 0x3090},
        {'w', 'e', 0x3091},
        {'w', 'o', 0x3092},
        {'n', '5', 0x3093},
        {'v', 'u', 0x3094},
        {'"', '5', 0x309b},
        {'0', '5', 0x309c},
        {'*', '5', 0x309d},
        {'+', '5', 0x309e},
        {'a', '6', 0x30a1},
        {'A', '6', 0x30a2},
        {'i', '6', 0x30a3},
        {'I', '6', 0x30a4},
        {'u', '6', 0x30a5},
        {'U', '6', 0x30a6},
        {'e', '6', 0x30a7},
        {'E', '6', 0x30a8},
        {'o', '6', 0x30a9},
        {'O', '6', 0x30aa},
        {'K', 'a', 0x30ab},
        {'G', 'a', 0x30ac},
        {'K', 'i', 0x30ad},
        {'G', 'i', 0x30ae},
        {'K', 'u', 0x30af},
        {'G', 'u', 0x30b0},
        {'K', 'e', 0x30b1},
        {'G', 'e', 0x30b2},
        {'K', 'o', 0x30b3},
        {'G', 'o', 0x30b4},
        {'S', 'a', 0x30b5},
        {'Z', 'a', 0x30b6},
        {'S', 'i', 0x30b7},
        {'Z', 'i', 0x30b8},
        {'S', 'u', 0x30b9},
        {'Z', 'u', 0x30ba},
        {'S', 'e', 0x30bb},
        {'Z', 'e', 0x30bc},
        {'S', 'o', 0x30bd},
        {'Z', 'o', 0x30be},
        {'T', 'a', 0x30bf},
        {'D', 'a', 0x30c0},
        {'T', 'i', 0x30c1},
        {'D', 'i', 0x30c2},
        {'T', 'U', 0x30c3},
        {'T', 'u', 0x30c4},
        {'D', 'u', 0x30c5},
        {'T', 'e', 0x30c6},
        {'D', 'e', 0x30c7},
        {'T', 'o', 0x30c8},
        {'D', 'o', 0x30c9},
        {'N', 'a', 0x30ca},
        {'N', 'i', 0x30cb},
        {'N', 'u', 0x30cc},
        {'N', 'e', 0x30cd},
        {'N', 'o', 0x30ce},
        {'H', 'a', 0x30cf},
        {'B', 'a', 0x30d0},
        {'P', 'a', 0x30d1},
        {'H', 'i', 0x30d2},
        {'B', 'i', 0x30d3},
        {'P', 'i', 0x30d4},
        {'H', 'u', 0x30d5},
        {'B', 'u', 0x30d6},
        {'P', 'u', 0x30d7},
        {'H', 'e', 0x30d8},
        {'B', 'e', 0x30d9},
        {'P', 'e', 0x30da},
        {'H', 'o', 0x30db},
        {'B', 'o', 0x30dc},
        {'P', 'o', 0x30dd},
        {'M', 'a', 0x30de},
        {'M', 'i', 0x30df},
        {'M', 'u', 0x30e0},
        {'M', 'e', 0x30e1},
        {'M', 'o', 0x30e2},
        {'Y', 'A', 0x30e3},
        {'Y', 'a', 0x30e4},
        {'Y', 'U', 0x30e5},
        {'Y', 'u', 0x30e6},
        {'Y', 'O', 0x30e7},
        {'Y', 'o', 0x30e8},
        {'R', 'a', 0x30e9},
        {'R', 'i', 0x30ea},
        {'R', 'u', 0x30eb},
        {'R', 'e', 0x30ec},
        {'R', 'o', 0x30ed},
        {'W', 'A', 0x30ee},
        {'W', 'a', 0x30ef},
        {'W', 'i', 0x30f0},
        {'W', 'e', 0x30f1},
        {'W', 'o', 0x30f2},
        {'N', '6', 0x30f3},
        {'V', 'u', 0x30f4},
        {'K', 'A', 0x30f5},
        {'K', 'E', 0x30f6},
        {'V', 'a', 0x30f7},
        {'V', 'i', 0x30f8},
        {'V', 'e', 0x30f9},
        {'V', 'o', 0x30fa},
        {'.', '6', 0x30fb},
        {'-', '6', 0x30fc},
        {'*', '6', 0x30fd},
        {'+', '6', 0x30fe},
        {'b', '4', 0x3105},
        {'p', '4', 0x3106},
        {'m', '4', 0x3107},
        {'f', '4', 0x3108},
        {'d', '4', 0x3109},
        {'t', '4', 0x310a},
        {'n', '4', 0x310b},
        {'l', '4', 0x310c},
        {'g', '4', 0x310d},
        {'k', '4', 0x310e},
        {'h', '4', 0x310f},
        {'j', '4', 0x3110},
        {'q', '4', 0x3111},
        {'x', '4', 0x3112},
        {'z', 'h', 0x3113},
        {'c', 'h', 0x3114},
        {'s', 'h', 0x3115},
        {'r', '4', 0x3116},
        {'z', '4', 0x3117},
        {'c', '4', 0x3118},
        {'s', '4', 0x3119},
        {'a', '4', 0x311a},
        {'o', '4', 0x311b},
        {'e', '4', 0x311c},
        {'a', 'i', 0x311e},
        {'e', 'i', 0x311f},
        {'a', 'u', 0x3120},
        {'o', 'u', 0x3121},
        {'a', 'n', 0x3122},
        {'e', 'n', 0x3123},
        {'a', 'N', 0x3124},
        {'e', 'N', 0x3125},
        {'e', 'r', 0x3126},
        {'i', '4', 0x3127},
        {'u', '4', 0x3128},
        {'i', 'u', 0x3129},
        {'v', '4', 0x312a},
        {'n', 'G', 0x312b},
        {'g', 'n', 0x312c},
        {'1', 'c', 0x3220},
        {'2', 'c', 0x3221},
        {'3', 'c', 0x3222},
        {'4', 'c', 0x3223},
        {'5', 'c', 0x3224},
        {'6', 'c', 0x3225},
        {'7', 'c', 0x3226},
        {'8', 'c', 0x3227},
        {'9', 'c', 0x3228},
        {' ', ' ', 0xe000},
        {'/', 'c', 0xe001},
        {'U', 'A', 0xe002},
        {'U', 'B', 0xe003},
        {'"', '3', 0xe004},
        {'"', '1', 0xe005},
        {'"', '!', 0xe006},
        {'"', '\'', 0xe007},
        {'"', '>', 0xe008},
        {'"', '?', 0xe009},
        {'"', '-', 0xe00a},
        {'"', '(', 0xe00b},
        {'"', '.', 0xe00c},
        {'"', ':', 0xe00d},
        {'"', '0', 0xe00e},
        {'"', '"', 0xe00f},
        {'"', '<', 0xe010},
        {'"', ',', 0xe011},
        {'"', ';', 0xe012},
        {'"', '_', 0xe013},
        {'"', '=', 0xe014},
        {'"', '/', 0xe015},
        {'"', 'i', 0xe016},
        {'"', 'd', 0xe017},
        {'"', 'p', 0xe018},
        {';', ';', 0xe019},
        {',', ',', 0xe01a},
        {'b', '3', 0xe01b},
        {'C', 'i', 0xe01c},
        {'f', '(', 0xe01d},
        {'e', 'd', 0xe01e},
        {'a', 'm', 0xe01f},
        {'p', 'm', 0xe020},
        {'F', 'l', 0xe023},
        {'G', 'F', 0xe024},
        {'>', 'V', 0xe025},
        {'!', '*', 0xe026},
        {'?', '*', 0xe027},
        {'J', '<', 0xe028},
        {'f', 'f', 0xfb00},
        {'f', 'i', 0xfb01},
        {'f', 'l', 0xfb02},
        {'f', 't', 0xfb05},
        {'s', 't', 0xfb06},
#      endif /* FEAT_MBYTE */
        {NUL, NUL, NUL}
       };

#     endif /* OLD_DIGRAPHS */

#    endif /* Macintosh */
#   endif /* EBCDIC */
#  endif    /* !HPUX_DIGRAPHS */
# endif /* !__MINT__ */
#endif  /* !MSDOS && !OS2 */

/*
 * handle digraphs after typing a character
 */
    int
do_digraph(c)
    int     c;
{
    static int  backspaced;     /* character before K_BS */
    static int  lastchar;       /* last typed character */

    if (c == -1)                /* init values */
    {
        backspaced = -1;
    }
    else if (p_dg)
    {
        if (backspaced >= 0)
            c = getdigraph(backspaced, c, FALSE);
        backspaced = -1;
        if ((c == K_BS || c == Ctrl_H) && lastchar >= 0)
            backspaced = lastchar;
    }
    lastchar = c;
    return c;
}

/*
 * Get a digraph.  Used after typing CTRL-K on the command line or in normal
 * mode.
 * Returns composed character, or NUL when ESC was used.
 */
    int
get_digraph(cmdline)
    int         cmdline;        /* TRUE when called from the cmdline */
{
    int         c, cc;

    ++no_mapping;
    ++allow_keys;
    c = safe_vgetc();
    --no_mapping;
    --allow_keys;
    if (c != ESC)               /* ESC cancels CTRL-K */
    {
        if (IS_SPECIAL(c))      /* insert special key code */
            return c;
        if (cmdline)
        {
            if (char2cells(c) == 1
#if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
                    && cmdline_star == 0
#endif
                    )
                putcmdline(c, TRUE);
        }
#ifdef FEAT_CMDL_INFO
        else
            add_to_showcmd(c);
#endif
        ++no_mapping;
        ++allow_keys;
        cc = safe_vgetc();
        --no_mapping;
        --allow_keys;
        if (cc != ESC)      /* ESC cancels CTRL-K */
            return getdigraph(c, cc, TRUE);
    }
    return NUL;
}

/*
 * Lookup the pair "char1", "char2" in the digraph tables.
 * If no match, return "char2".
 * If "meta" is TRUE and "char1" is a space, return "char2" | 0x80.
 */
    static int
getexactdigraph(char1, char2, meta)
    int         char1;
    int         char2;
    int         meta;
{
    int         i;
    int         retval = 0;
    digr_T      *dp;

    if (IS_SPECIAL(char1) || IS_SPECIAL(char2))
        return char2;

    /*
     * Search user digraphs first.
     */
    dp = (digr_T *)user_digraphs.ga_data;
    for (i = 0; i < user_digraphs.ga_len; ++i)
    {
        if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
        {
            retval = dp->result;
            break;
        }
        ++dp;
    }

    /*
     * Search default digraphs.
     */
    if (retval == 0)
    {
        dp = digraphdefault;
        for (i = 0; dp->char1 != 0; ++i)
        {
            if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
            {
                retval = dp->result;
                break;
            }
            ++dp;
        }
    }
#ifdef FEAT_MBYTE
# ifdef USE_UNICODE_DIGRAPHS
    if (retval != 0 && !enc_utf8)
    {
        char_u      buf[6], *to;
        vimconv_T   vc;

        /*
         * Convert the Unicode digraph to 'encoding'.
         */
        i = utf_char2bytes(retval, buf);
        retval = 0;
        vc.vc_type = CONV_NONE;
        if (convert_setup(&vc, (char_u *)"utf-8", p_enc) == OK)
        {
            vc.vc_fail = TRUE;
            to = string_convert(&vc, buf, &i);
            if (to != NULL)
            {
                retval = (*mb_ptr2char)(to);
                vim_free(to);
            }
            (void)convert_setup(&vc, NULL, NULL);
        }
    }
# endif

    /* Ignore multi-byte characters when not in multi-byte mode. */
    if (!has_mbyte && retval > 0xff)
        retval = 0;
#endif

    if (retval == 0)            /* digraph deleted or not found */
    {
        if (char1 == ' ' && meta)       /* <space> <char> --> meta-char */
            return (char2 | 0x80);
        return char2;
    }
    return retval;
}

/*
 * Get digraph.
 * Allow for both char1-char2 and char2-char1
 */
    int
getdigraph(char1, char2, meta)
    int char1;
    int char2;
    int meta;
{
    int     retval;

    if (((retval = getexactdigraph(char1, char2, meta)) == char2)
            && (char1 != char2)
            && ((retval = getexactdigraph(char2, char1, meta)) == char1))
        return char2;
    return retval;
}

/*
 * Add the digraphs in the argument to the digraph table.
 * format: {c1}{c2} char {c1}{c2} char ...
 */
    void
putdigraph(str)
    char_u *str;
{
    int         char1, char2, n;
    int         i;
    digr_T      *dp;

    while (*str != NUL)
    {
        str = skipwhite(str);
        if (*str == NUL)
            return;
        char1 = *str++;
        char2 = *str++;
        if (char2 == 0)
        {
            EMSG(_(e_invarg));
            return;
        }
        if (char1 == ESC || char2 == ESC)
        {
            EMSG(_("E104: Escape not allowed in digraph"));
            return;
        }
        str = skipwhite(str);
        if (!VIM_ISDIGIT(*str))
        {
            EMSG(_(e_number_exp));
            return;
        }
        n = getdigits(&str);

        /* If the digraph already exists, replace the result. */
        dp = (digr_T *)user_digraphs.ga_data;
        for (i = 0; i < user_digraphs.ga_len; ++i)
        {
            if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
            {
                dp->result = n;
                break;
            }
            ++dp;
        }

        /* Add a new digraph to the table. */
        if (i == user_digraphs.ga_len)
        {
            if (ga_grow(&user_digraphs, 1) == OK)
            {
                dp = (digr_T *)user_digraphs.ga_data + user_digraphs.ga_len;
                dp->char1 = char1;
                dp->char2 = char2;
                dp->result = n;
                ++user_digraphs.ga_len;
            }
        }
    }
}

    void
listdigraphs()
{
    int         i;
    digr_T      *dp;

    msg_putchar('\n');

    dp = digraphdefault;
    for (i = 0; dp->char1 != NUL && !got_int; ++i)
    {
#if defined(USE_UNICODE_DIGRAPHS) && defined(FEAT_MBYTE)
        digr_T tmp;

        /* May need to convert the result to 'encoding'. */
        tmp.char1 = dp->char1;
        tmp.char2 = dp->char2;
        tmp.result = getexactdigraph(tmp.char1, tmp.char2, FALSE);
        if (tmp.result != 0 && tmp.result != tmp.char2
                                          && (has_mbyte || tmp.result <= 255))
            printdigraph(&tmp);
#else

        if (getexactdigraph(dp->char1, dp->char2, FALSE) == dp->result
# ifdef FEAT_MBYTE
                && (has_mbyte || dp->result <= 255)
# endif
                )
            printdigraph(dp);
#endif
        ++dp;
        ui_breakcheck();
    }

    dp = (digr_T *)user_digraphs.ga_data;
    for (i = 0; i < user_digraphs.ga_len && !got_int; ++i)
    {
        printdigraph(dp);
        ui_breakcheck();
        ++dp;
    }
    must_redraw = CLEAR;    /* clear screen, because some digraphs may be
                               wrong, in which case we messed up ScreenLines */
}

    static void
printdigraph(dp)
    digr_T      *dp;
{
    char_u      buf[30];
    char_u      *p;

    int         list_width;

    if ((dy_flags & DY_UHEX)
#ifdef FEAT_MBYTE
            || has_mbyte
#endif
            )
        list_width = 13;
    else
        list_width = 11;

    if (dp->result != 0)
    {
        if (msg_col > Columns - list_width)
            msg_putchar('\n');
        if (msg_col)
            while (msg_col % list_width != 0)
                msg_putchar(' ');

        p = buf;
        *p++ = dp->char1;
        *p++ = dp->char2;
        *p++ = ' ';
#ifdef FEAT_MBYTE
        if (has_mbyte)
        {
            /* add a space to draw a composing char on */
            if (enc_utf8 && utf_iscomposing(dp->result))
                *p++ = ' ';
            p += (*mb_char2bytes)(dp->result, p);
        }
        else
#endif
            *p++ = dp->result;
        if (char2cells(dp->result) == 1)
            *p++ = ' ';
        sprintf((char *)p, " %3d", dp->result);
        msg_outtrans(buf);
    }
}

#endif /* FEAT_DIGRAPHS */

#if defined(FEAT_KEYMAP) || defined(PROTO)

/* structure used for b_kmap_ga.ga_data */
typedef struct
{
    char_u      *from;
    char_u      *to;
} kmap_T;

#define KMAP_MAXLEN 20      /* maximum length of "from" or "to" */

static void keymap_unload __ARGS((void));

/*
 * Set up key mapping tables for the 'keymap' option
 */
    char_u *
keymap_init()
{
    curbuf->b_kmap_state &= ~KEYMAP_INIT;

    if (*curbuf->b_p_keymap == NUL)
    {
        /* Stop any active keymap and clear the table. */
        keymap_unload();
    }
    else
    {
        char_u  *buf;

        /* Source the keymap file.  It will contain a ":loadkeymap" command
         * which will call ex_loadkeymap() below. */
        buf = alloc((unsigned)(STRLEN(curbuf->b_p_keymap)
# ifdef FEAT_MBYTE
                                                       + STRLEN(p_enc)
# endif
                                                       + 14));
        if (buf == NULL)
            return e_outofmem;

# ifdef FEAT_MBYTE
        /* try finding "keymap/'keymap'_'encoding'.vim"  in 'runtimepath' */
        sprintf((char *)buf, "keymap/%s_%s.vim", curbuf->b_p_keymap, p_enc);
        if (source_runtime(buf, FALSE) == FAIL)
# endif
        {
            /* try finding "keymap/'keymap'.vim" in 'runtimepath'  */
            sprintf((char *)buf, "keymap/%s.vim", curbuf->b_p_keymap);
            if (source_runtime(buf, FALSE) == FAIL)
            {
                vim_free(buf);
                return (char_u *)N_("E544: Keymap file not found");
            }
        }
        vim_free(buf);
    }

    return NULL;
}

/*
 * ":loadkeymap" command: load the following lines as the keymap.
 */
    void
ex_loadkeymap(eap)
    exarg_T     *eap;
{
    char_u      *line;
    char_u      *p;
    char_u      *s;
    kmap_T      *kp;
#define KMAP_LLEN   200     /* max length of "to" and "from" together */
    char_u      buf[KMAP_LLEN + 11];
    int         i;
    char_u      *save_cpo = p_cpo;

    if (!getline_equal(eap->getline, eap->cookie, getsourceline))
    {
        EMSG(_("E105: Using :loadkeymap not in a sourced file"));
        return;
    }

    /*
     * Stop any active keymap and clear the table.
     */
    keymap_unload();

    curbuf->b_kmap_state = 0;
    ga_init2(&curbuf->b_kmap_ga, (int)sizeof(kmap_T), 20);

    /* Set 'cpoptions' to "C" to avoid line continuation. */
    p_cpo = (char_u *)"C";

    /*
     * Get each line of the sourced file, break at the end.
     */
    for (;;)
    {
        line = eap->getline(0, eap->cookie, 0);
        if (line == NULL)
            break;

        p = skipwhite(line);
        if (*p != '"' && *p != NUL && ga_grow(&curbuf->b_kmap_ga, 1) == OK)
        {
            kp = (kmap_T *)curbuf->b_kmap_ga.ga_data + curbuf->b_kmap_ga.ga_len;
            s = skiptowhite(p);
            kp->from = vim_strnsave(p, (int)(s - p));
            p = skipwhite(s);
            s = skiptowhite(p);
            kp->to = vim_strnsave(p, (int)(s - p));

            if (kp->from == NULL || kp->to == NULL
                    || STRLEN(kp->from) + STRLEN(kp->to) >= KMAP_LLEN
                    || *kp->from == NUL || *kp->to == NUL)
            {
                if (kp->to != NULL && *kp->to == NUL)
                    EMSG(_("E791: Empty keymap entry"));
                vim_free(kp->from);
                vim_free(kp->to);
            }
            else
                ++curbuf->b_kmap_ga.ga_len;
        }
        vim_free(line);
    }

    /*
     * setup ":lnoremap" to map the keys
     */
    for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
    {
        vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s %s",
                                ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from,
                                 ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].to);
        (void)do_map(2, buf, LANGMAP, FALSE);
    }

    p_cpo = save_cpo;

    curbuf->b_kmap_state |= KEYMAP_LOADED;
#ifdef FEAT_WINDOWS
    status_redraw_curbuf();
#endif
}

/*
 * Stop using 'keymap'.
 */
    static void
keymap_unload()
{
    char_u      buf[KMAP_MAXLEN + 10];
    int         i;
    char_u      *save_cpo = p_cpo;

    if (!(curbuf->b_kmap_state & KEYMAP_LOADED))
        return;

    /* Set 'cpoptions' to "C" to avoid line continuation. */
    p_cpo = (char_u *)"C";

    /* clear the ":lmap"s */
    for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
    {
        vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s",
                               ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from);
        (void)do_map(1, buf, LANGMAP, FALSE);
    }

    p_cpo = save_cpo;

    ga_clear(&curbuf->b_kmap_ga);
    curbuf->b_kmap_state &= ~KEYMAP_LOADED;
    do_cmdline_cmd((char_u *)"unlet! b:keymap_name");
#ifdef FEAT_WINDOWS
    status_redraw_curbuf();
#endif
}

#endif /* FEAT_KEYMAP */