1: #ifndef NOCSETS
   2: char *xlav = "Character Set Translation 5A(018), 21 Nov 92";
   3: 
   4: /*  C K U X L A  */
   5: 
   6: /*  C-Kermit tables and functions supporting character set translation.  */
   7: /*
   8:   Author: Frank da Cruz (fdc@columbia.edu, FDCCU@CUVMA.BITNET),
   9:   Columbia University Center for Computing Activities.
  10:   Copyright (C) 1985, 1992, Trustees of Columbia University in the City of New
  11:   York.  Permission is granted to any individual or institution to use this
  12:   software as long as it is not sold for profit.  This copyright notice must be
  13:   retained.  This software may not be included in commercial products without
  14:   written permission of Columbia University.
  15: */
  16: 
  17: /*
  18:   CAVEAT PROGRAMMOR: The mechanism used here turns out to be somewhat
  19:   inflexible and maybe a little dangerous.  It is designed for Kermit's
  20:   character-at-a-time processing during protocol operations.  Elaborate
  21:   kludges are used for translating one character into two (like stuffing an
  22:   extra character into the input stream), or two into one, or two into two.
  23: 
  24:   The whole translation business needs to be redesigned to be string-oriented
  25:   rather than character oriented, so (a) we can have more flexible
  26:   translations, and (b) we don't have to be concerned about which input stream
  27:   we are using.  The current mechanism is also quite inappropriate
  28:   for multibyte character sets and for flexible user-defined translations.
  29: 
  30:   For the future: perhaps it would be better to represent characters
  31:   internally using a universal character set like UNICODE (ISO 10646 BMP),
  32:   the ultimate "transfer character set".
  33: */
  34: #include "ckcdeb.h"         /* Includes... */
  35: #include "ckcker.h"
  36: #include "ckucmd.h"
  37: #include "ckcxla.h"
  38: 
  39: /* Character set translation data and functions */
  40: 
  41: extern int zincnt;          /* File i/o macros and variables */
  42: extern char *zinptr;
  43: extern int zoutcnt;
  44: extern char *zoutptr;
  45: 
  46: int tslevel  = TS_L0;           /* Transfer syntax level (0,1,2) */
  47: int tcharset = TC_TRANSP;       /* Transfer syntax character set */
  48: int tcsr     = FC_USASCII;      /* Remote terminal character set */
  49: int language = L_USASCII;       /* Language */
  50: 
  51: /*
  52:   Default local file and terminal character set.
  53:   Normally ASCII, but for some systems we know otherwise.
  54: */
  55: #ifdef datageneral          /* Data General AOS/VS */
  56: int fcharset = FC_DGMCS;        /* uses the DG International set */
  57: int tcsl     = FC_DGMCS;
  58: #else
  59: #ifdef NEXT             /* The NeXT workstation */
  60: int fcharset = FC_NEXT;         /* uses its own 8-bit set */
  61: int tcsl     = FC_NEXT;
  62: #else
  63: #ifdef MAC              /* The Macintosh */
  64: int fcharset = FC_APPQD;        /* uses an extended version of */
  65: int tcsl     = FC_APPQD;        /* Apple Quickdraw */
  66: #else
  67: #ifdef AUX
  68: int fcharset = FC_APPQD;        /* Ditto for Apple A/UX */
  69: int tcsl     = FC_APPQD;
  70: #else
  71: #ifdef AMIGA                /* The Commodore Amiga */
  72: int fcharset = FC_1LATIN;       /* uses Latin-1 */
  73: int tcsl     = FC_1LATIN;
  74: #else                   /* All others */
  75: int fcharset = FC_USASCII;      /* use ASCII by default */
  76: int tcsl     = FC_USASCII;
  77: #endif /* AMIGA */
  78: #endif /* AUX */
  79: #endif /* MAC */
  80: #endif /* NEXT */
  81: #endif /* datageneral */
  82: 
  83: 
  84: 
  85: _PROTOTYP( CHAR xnel1, (CHAR c) );  /* NeXT to Latin-1 */
  86: _PROTOTYP( CHAR xl143, (CHAR c) );  /* Latin-1 to IBM CP437 */
  87: _PROTOTYP( CHAR xl1as, (CHAR c) );  /* Latin-1 to US ASCII */
  88: _PROTOTYP( CHAR zl1as, (CHAR c) );  /* Latin-1 to US ASCII */
  89: 
  90: #ifdef CYRILLIC
  91: _PROTOTYP( CHAR xassk, (CHAR c) );  /* ASCII to Short KOI */
  92: _PROTOTYP( CHAR xskcy, (CHAR c) );  /* Short KOI to Latin/Cyrillic */
  93: #endif /* CYRILLIC */
  94: 
  95: #ifdef LATIN2
  96: _PROTOTYP( CHAR xnel2, (CHAR c) );  /* NeXT to Latin-2 */
  97: _PROTOTYP( CHAR xl243, (CHAR c) );  /* Latin-2 to IBM CP437 */
  98: _PROTOTYP( CHAR xl2as, (CHAR c) );  /* Latin-2 to US ASCII */
  99: _PROTOTYP( CHAR zl2as, (CHAR c) );  /* Latin-2 to US ASCII */
 100: #endif /* LATIN2 */
 101: 
 102: /* Transfer character-set info */
 103: 
 104: struct csinfo tcsinfo[] = {
 105: /*  Name                       size code      designator  alphabet           */
 106:     "TRANSPARENT, no translation", 256, TC_TRANSP,  "",       AL_UNK,   /* 0 */
 107:     "ASCII",                       128, TC_USASCII, "",       AL_ROMAN, /* 1 */
 108:     "LATIN1, ISO 8859-1",          256, TC_1LATIN,  "I6/100", AL_ROMAN, /* 2 */
 109: #ifdef LATIN2
 110:     "LATIN2, ISO 8859-2",          256, TC_2LATIN,  "I6/101", AL_ROMAN, /* 3 */
 111: #else
 112:     "LATIN2 not supported",          0, TC_TRANSP,   "XXX",   AL_UNK,   /* 3 */
 113: #endif /* LATIN2 */
 114: #ifdef CYRILLIC
 115:     "CYRILLIC, ISO 8859-5",        256, TC_CYRILL,   "I6/144",AL_CYRIL, /* 4 */
 116: #else
 117:     "CYRILLIC not supported",        0, TC_TRANSP,   "XXX",   AL_UNK,   /* 4 */
 118: #endif /* CYRILLIC */
 119: /*
 120:   NOTE: the second entry is obsolete, but retained temporarily.
 121:   The proper designator is given in the first entry.  C-Kermit sends the
 122:   first (proper) form, but accepts either form.
 123: */
 124: #ifdef KANJI
 125:     "KANJI (EUC)", 16384, TC_JEUC,  "I14/87/13", AL_JAPAN, /* 5 */
 126:     "KANJI (EUC)", 16384, TC_JEUC,  "I14/87E",   AL_JAPAN  /* 5 */
 127: #else
 128:     "KANJI not supported", 0, TC_TRANSP,"XXX",   AL_UNK,   /* 5 */
 129: #endif /* KANJI */
 130: };
 131: int ntcsets = (sizeof(tcsinfo) / sizeof(struct csinfo));
 132: 
 133: struct keytab tcstab[] = {      /* Keyword table for */
 134:     "ascii",         TC_USASCII, 0, /* SET TRANSFER CHARACTER-SET */
 135: #ifdef CYRILLIC
 136:     "cyrillic-iso",  TC_CYRILL,  0,
 137: #endif /* CYRILLIC */
 138: #ifdef KANJI
 139:     "japanese-euc",  TC_JEUC,    0,
 140: #endif /* KANJI */
 141: #ifdef LATIN2
 142: /*
 143:   If Latin-2 is defined, let the following be invisible, non-unique
 144:   abbreviations for LATIN1.
 145: */
 146:     "l",             TC_1LATIN,  CM_ABR|CM_INV,
 147:     "la",            TC_1LATIN,  CM_ABR|CM_INV,
 148:     "lat",           TC_1LATIN,  CM_ABR|CM_INV,
 149:     "lati",          TC_1LATIN,  CM_ABR|CM_INV,
 150:     "latin",         TC_1LATIN,  CM_ABR|CM_INV,
 151: #endif /* LATIN2 */
 152:     "latin1-iso",    TC_1LATIN,  0,
 153: #ifdef LATIN2
 154:     "latin2-iso",    TC_2LATIN,  0,
 155: #endif /* LATIN2 */
 156:     "transparent",   TC_TRANSP,  0
 157: };
 158: int ntcs = (sizeof(tcstab) / sizeof(struct keytab));
 159: 
 160: /* File character set information structure, indexed by character set code, */
 161: /* as defined in ckuxla.h.  This table must be in order of file character */
 162: /* set number! */
 163: 
 164: struct csinfo fcsinfo[] = { /* File character set information... */
 165:   /* Descriptive Name              Size  Designator */
 166:     "US ASCII",                     128, FC_USASCII, NULL, AL_ROMAN,
 167:     "British/UK ISO-646",           128, FC_UKASCII, NULL, AL_ROMAN,
 168:     "Dutch ISO-646",                128, FC_DUASCII, NULL, AL_ROMAN,
 169:     "Finnish ISO-646",              128, FC_FIASCII, NULL, AL_ROMAN,
 170:     "French ISO-646",               128, FC_FRASCII, NULL, AL_ROMAN,
 171:     "Canadian-French ISO-646",      128, FC_FCASCII, NULL, AL_ROMAN,
 172:     "German ISO-646",               128, FC_GEASCII, NULL, AL_ROMAN,
 173:     "Hungarian ISO-646",            128, FC_HUASCII, NULL, AL_ROMAN,
 174:     "Italian ISO-646",              128, FC_ITASCII, NULL, AL_ROMAN,
 175:     "Norwegian/Danish ISO-646",     128, FC_NOASCII, NULL, AL_ROMAN,
 176:     "Portuguese ISO-646",           128, FC_POASCII, NULL, AL_ROMAN,
 177:     "Spanish ISO-646",              128, FC_SPASCII, NULL, AL_ROMAN,
 178:     "Swedish ISO-646",              128, FC_SWASCII, NULL, AL_ROMAN,
 179:     "Swiss ISO-646",                128, FC_CHASCII, NULL, AL_ROMAN,
 180:     "ISO 8859-1 Latin-1",           256, FC_1LATIN,  NULL, AL_ROMAN,
 181: #ifdef LATIN2
 182:     "ISO 8859-2 Latin-2",           256, FC_2LATIN,  NULL, AL_ROMAN,
 183: #endif /* LATIN2 */
 184:     "DEC Multinational",            256, FC_DECMCS,  NULL, AL_ROMAN,
 185:     "NeXT Multinational",           256, FC_NEXT,    NULL, AL_ROMAN,
 186:     "IBM Code Page 437",            256, FC_CP437,   NULL, AL_ROMAN,
 187:     "IBM Code Page 850",            256, FC_CP850,   NULL, AL_ROMAN,
 188: #ifdef LATIN2
 189:     "IBM Code Page 852",            256, FC_CP852,   NULL, AL_ROMAN,
 190: #endif /* LATIN2 */
 191:     "Apple Macintosh Latin",        256, FC_APPQD,   NULL, AL_ROMAN,
 192:     "Data General International",   256, FC_DGMCS,   NULL, AL_ROMAN
 193: #ifdef CYRILLIC
 194: ,   "ISO 8859-5 Latin/Cyrillic",    256, FC_CYRILL,  NULL, AL_CYRIL,
 195:     "CP866 Cyrillic",           256, FC_CP866,   NULL, AL_CYRIL,
 196:     "Short KOI",                    128, FC_KOI7,    NULL, AL_CYRIL,
 197:     "Old KOI-8 Cyrillic",           256, FC_KOI8,    NULL, AL_CYRIL
 198: #endif /* CYRILLIC */
 199: #ifdef KANJI
 200: ,   "Japanese JIS7",            256, FC_JIS7,    NULL, AL_JAPAN,
 201:     "Japanese Shift JIS",     16384, FC_SHJIS,   NULL, AL_JAPAN,
 202:     "Japanese EUC",       16384, FC_JEUC,    NULL, AL_JAPAN,
 203:     "Japanese DEC Kanji",     16384, FC_JDEC,    NULL, AL_JAPAN
 204: #endif /* KANJI */
 205: };
 206: 
 207: /* Local file character sets */
 208: /* Includes 7-bit National Replacement Character Sets of ISO 646 */
 209: /* Plus ISO Latin-1, DEC Multinational Character Set (MCS), NeXT char set */
 210: 
 211: struct keytab fcstab[] = { /* Keyword table for 'set file character-set' */
 212: 
 213: /*
 214:   IMPORTANT: This table is replicated below as ttcstab (terminal character
 215:   set table).  The only differences are the addition of TRANSPARENT
 216:   and the removal of the Kanji sets, which are not supported yet.
 217:   If you make changes to this table, also change ttcstab.
 218: */
 219: 
 220: /* Keyword             Value       Flags */
 221:     "apple-quickdraw",    FC_APPQD,   CM_INV, /* Apple Quickdraw */
 222:     "ascii",              FC_USASCII, 0, /* ASCII */
 223:     "british",            FC_UKASCII, 0, /* British NRC */
 224:     "canadian-french",    FC_FCASCII, 0, /* French Canadian NRC */
 225:     "cp437",              FC_CP437,   0, /* IBM CP437 */
 226:     "cp850",              FC_CP850,   0, /* IBM CP850 */
 227: #ifdef LATIN2
 228:     "cp852",              FC_CP852,   0, /* IBM CP852 */
 229: #endif /* LATIN2 */
 230: #ifdef CYRILLIC
 231:     "cp866-cyrillic",     FC_CP866,   0, /* CP866 Cyrillic */
 232:     "cyrillic-iso",       FC_CYRILL,  0, /* ISO Latin/Cyrillic Alphabet */
 233: #endif /* CYRILLIC */
 234:     "danish",             FC_NOASCII, 0, /* Norwegian and Danish NRC */
 235: #ifdef KANJI
 236:     "dec-kanji",          FC_JDEC,    0, /* Japanese DEC Kanji */
 237: #endif /* KANJI */
 238:     "dec-multinational",  FC_DECMCS,  0, /* DEC multinational character set */
 239:     "dg-international",   FC_DGMCS,   0, /* Data General multinational */
 240:     "dutch",              FC_DUASCII, 0, /* Dutch NRC */
 241:     "finnish",            FC_FIASCII, 0, /* Finnish NRC */
 242:     "french",             FC_FRASCII, 0, /* French NRC */
 243:     "fr-canadian",        FC_FCASCII, CM_INV, /* French Canadian NRC */
 244:     "german",             FC_GEASCII, 0, /* German NRC */
 245:     "hungarian",          FC_HUASCII, 0, /* Hungarian NRC */
 246:     "italian",            FC_ITASCII, 0, /* Italian NRC */
 247: #ifdef KANJI
 248:     "japanese-euc",       FC_JEUC,    0, /* Japanese EUC */
 249:     "jis7-kanji",         FC_JIS7,    0, /* Japanese JIS7 7bit code */
 250: #endif /* KANJI */
 251: #ifdef CYRILLIC
 252:     "koi8-cyrillic",      FC_KOI8,    0, /* Old KOI-8 Cyrillic */
 253: #endif /* CYRILLIC */
 254: #ifdef LATIN2
 255:     "l",                  FC_1LATIN,  CM_ABR|CM_INV,
 256:     "la",                 FC_1LATIN,  CM_ABR|CM_INV,
 257:     "lat",                FC_1LATIN,  CM_ABR|CM_INV,
 258:     "lati",               FC_1LATIN,  CM_ABR|CM_INV,
 259:     "latin",              FC_1LATIN,  CM_ABR|CM_INV,
 260: #endif /* LATIN2 */
 261:     "latin1-iso",         FC_1LATIN,  0, /* ISO Latin Alphabet 1 */
 262: #ifdef LATIN2
 263:     "latin2-iso",         FC_2LATIN,  0, /* ISO Latin Alphabet 2 */
 264: #endif /* LATIN2 */
 265:     "macintosh-latin",    FC_APPQD,   0, /* "Extended Mac Latin" */
 266:     "next-multinational", FC_NEXT,    0, /* NeXT workstation */
 267:     "norwegian",          FC_NOASCII, 0, /* Norwegian and Danish NRC */
 268:     "portuguese",         FC_POASCII, 0, /* Portuguese NRC */
 269: #ifdef KANJI
 270:     "shift-jis-kanji",    FC_SHJIS,   0, /* Japanese Kanji Shift-JIS */
 271: #endif /* KANJI */
 272: #ifdef CYRILLIC
 273:     "short-koi",          FC_KOI7,    0, /* Short KOI Cyrillic */
 274: #endif /* CYRILLIC */
 275:     "spanish",            FC_SPASCII, 0, /* Spanish NRC */
 276:     "swedish",            FC_SWASCII, 0, /* Swedish NRC */
 277:     "swiss",              FC_CHASCII, 0  /* Swiss NRC */
 278: };
 279: int nfilc = (sizeof(fcstab) / sizeof(struct keytab)); /* size of this table */
 280: 
 281: 
 282: struct keytab ttcstab[] = { /* Keyword table for SET TERMINAL CHARACTER-SET */
 283: /*
 284:   IMPORTANT: This table is a replica of fcstab, immediately above, with the
 285:   addition of TRANSPARENT.  If you make changes to this table, make the
 286:   corresponding changes to fcstab.
 287: */
 288: /* Keyword               Value       Flags */
 289:     "apple-quickdraw",    FC_APPQD,   CM_INV, /* Apple Quickdraw */
 290:     "ascii",              FC_USASCII, 0, /* ASCII */
 291:     "british",            FC_UKASCII, 0, /* British NRC */
 292:     "canadian-french",    FC_FCASCII, 0, /* French Canadian NRC */
 293:     "cp437",              FC_CP437,   0, /* IBM CP437 */
 294:     "cp850",              FC_CP850,   0, /* IBM CP850 */
 295: #ifdef LATIN2
 296:     "cp852",              FC_CP852,   0, /* IBM CP852 */
 297: #endif /* LATIN2 */
 298: #ifdef CYRILLIC
 299:     "cp866-cyrillic",     FC_CP866,   0, /* CP866 Cyrillic */
 300:     "cyrillic-iso",       FC_CYRILL,  0, /* ISO Latin/Cyrillic Alphabet */
 301: #endif /* CYRILLIC */
 302:     "danish",             FC_NOASCII, 0, /* Norwegian and Danish NRC */
 303: #ifdef COMMENT
 304: #ifdef KANJI
 305:     "dec-kanji",          FC_JDEC,    0, /* Japanese DEC Kanji */
 306: #endif /* KANJI */
 307: #endif /* COMMENT */
 308:     "dec-multinational",  FC_DECMCS,  0, /* DEC multinational character set */
 309:     "dg-international",   FC_DGMCS,   0, /* Data General multinational */
 310:     "dutch",              FC_DUASCII, 0, /* Dutch NRC */
 311:     "finnish",            FC_FIASCII, 0, /* Finnish NRC */
 312:     "french",             FC_FRASCII, 0, /* French NRC */
 313:     "fr-canadian",        FC_FCASCII, CM_INV, /* French Canadian NRC */
 314:     "german",             FC_GEASCII, 0, /* German NRC */
 315:     "hungarian",          FC_HUASCII, 0, /* Hungarian NRC */
 316:     "italian",            FC_ITASCII, 0, /* Italian NRC */
 317: #ifdef COMMENT
 318: /* Kanji terminal character sets not implemented yet */
 319: #ifdef KANJI
 320:     "japanese-euc",       FC_JEUC,    0, /* Japanese EUC */
 321:     "jis7-kanji",         FC_JIS7,    0, /* Japanese JIS7 7bit code */
 322: #endif /* KANJI */
 323: #endif /* COMMENT */
 324: #ifdef CYRILLIC
 325:     "koi8-cyrillic",      FC_KOI8,    0, /* Old KOI-8 Cyrillic */
 326: #endif /* CYRILLIC */
 327: #ifdef LATIN2
 328:     "l",                  FC_1LATIN,  CM_ABR|CM_INV,
 329:     "la",                 FC_1LATIN,  CM_ABR|CM_INV,
 330:     "lat",                FC_1LATIN,  CM_ABR|CM_INV,
 331:     "lati",               FC_1LATIN,  CM_ABR|CM_INV,
 332:     "latin",              FC_1LATIN,  CM_ABR|CM_INV,
 333: #endif /* LATIN2 */
 334:     "latin1-iso",         FC_1LATIN,  0, /* ISO Latin Alphabet 1 */
 335: #ifdef LATIN2
 336:     "latin2-iso",         FC_2LATIN,  0, /* ISO Latin Alphabet 2 */
 337: #endif /* LATIN2 */
 338:     "macintosh-latin",    FC_APPQD,   0, /* "Extended Mac Latin */
 339:     "next-multinational", FC_NEXT,    0, /* NeXT workstation */
 340:     "norwegian",          FC_NOASCII, 0, /* Norwegian and Danish NRC */
 341:     "portuguese",         FC_POASCII, 0, /* Portuguese NRC */
 342: #ifdef COMMENT
 343: /* Kanji terminal character sets not implemented yet. */
 344: #ifdef KANJI
 345:     "shift-jis-kanji",    FC_SHJIS,   0, /* Japanese Kanji Shift-JIS */
 346: #endif /* KANJI */
 347: #endif /* COMMENT */
 348: #ifdef CYRILLIC
 349:     "short-koi",          FC_KOI7,    0, /* Short KOI Cyrillic */
 350: #endif /* CYRILLIC */
 351:     "spanish",            FC_SPASCII, 0, /* Spanish NRC */
 352:     "swedish",            FC_SWASCII, 0, /* Swedish NRC */
 353:     "swiss",              FC_CHASCII, 0, /* Swiss NRC */
 354:     "transparent",        FC_TRANSP,  0  /* Transparent */
 355: };
 356: int ntermc = (sizeof(ttcstab) / sizeof(struct keytab)); /* size of table */
 357: 
 358: /*
 359:  Languages:
 360: 
 361:  This table allows C-Kermit to have a SET LANGUAGE command to apply special
 362:  language-specific rules when translating from a character set that contains
 363:  national characters into plain ASCII, like German umlaut-a becomes ae.
 364: 
 365:  Originally, I thought it would be a good idea to let SET LANGUAGE also select
 366:  an appropriate FILE CHARACTER-SET and TRANSFER CHARACTER-SET automatically,
 367:  and these are included in the langinfo structure.  Later I realized that this
 368:  was a bad idea.  Users are confused by unexpected side effects.  If this
 369:  functionality is desired, it's better to define a macro to do it.
 370: */
 371: 
 372: struct langinfo langs[] = {
 373: /*  Language code   File Charset Xfer Charset Name */
 374:     L_USASCII,      FC_USASCII,  TC_USASCII,  "ASCII (American English)",
 375:     L_DANISH,       FC_NOASCII,  TC_1LATIN,   "Danish",
 376:     L_DUTCH,        FC_DUASCII,  TC_1LATIN,   "Dutch",
 377:     L_FINNISH,      FC_FIASCII,  TC_1LATIN,   "Finnish",
 378:     L_FRENCH,       FC_FRASCII,  TC_1LATIN,   "French",
 379:     L_GERMAN,       FC_GEASCII,  TC_1LATIN,   "German",
 380:     L_HUNGARIAN,    FC_HUASCII,  TC_2LATIN,   "Hungarian",
 381:     L_ICELANDIC,    FC_USASCII,  TC_1LATIN,   "Icelandic",
 382:     L_ITALIAN,      FC_ITASCII,  TC_1LATIN,   "Italian",
 383: #ifdef KANJI
 384:     L_JAPANESE,     FC_JEUC,     TC_JEUC,     "Japanese",
 385: #endif /* KANJI */
 386:     L_NORWEGIAN,    FC_NOASCII,  TC_1LATIN,   "Norwegian",
 387:     L_PORTUGUESE,   FC_POASCII,  TC_1LATIN,   "Portuguese",
 388: #ifdef CYRILLIC
 389:     L_RUSSIAN,      FC_CP866,    TC_CYRILL,   "Russian",
 390: #endif /* CYRILLIC */
 391:     L_SPANISH,      FC_SPASCII,  TC_1LATIN,   "Spanish",
 392:     L_SWEDISH,      FC_SWASCII,  TC_1LATIN,   "Swedish",
 393:     L_SWISS,        FC_CHASCII,  TC_1LATIN,   "Swiss"
 394: };
 395: int nlangs = (sizeof(langs) / sizeof(struct langinfo));
 396: 
 397: /*
 398:   Keyword table for the SET LANGUAGE command.
 399:   Only a few of these (German, Scandinavian, etc) actually do anything.
 400:   The language is used to invoke special translation rules when converting
 401:   from an 8-bit character set to ASCII; for example, German u-diaeresis
 402:   becomes "ue", Dutch y-diaeresis becomes "ij".  Languages without associated
 403:   rules are invisible (CM_INV).
 404: */
 405: struct keytab lngtab[] = {
 406:     "ascii",            L_USASCII,    CM_INV,
 407:     "danish",           L_DANISH,     0,
 408:     "dutch",            L_DUTCH,      0,
 409:     "english",          L_USASCII,    CM_INV,
 410:     "finnish",          L_FINNISH,    0,
 411:     "french",           L_FRENCH,     0,
 412:     "german",           L_GERMAN,     0,
 413:     "hungarian",        L_HUNGARIAN,  CM_INV,
 414:     "icelandic",        L_ICELANDIC,  0,
 415:     "italian",          L_ITALIAN,    CM_INV,
 416: #ifdef KANJI
 417:     "japanese",         L_JAPANESE,   CM_INV,
 418: #endif /* KANJI */
 419:     "norwegian",        L_NORWEGIAN,  0,
 420:     "none",             L_USASCII,    0,
 421:     "portuguese",       L_PORTUGUESE, CM_INV,
 422: #ifdef CYRILLIC
 423:     "russian",          L_RUSSIAN,    0,
 424: #endif /* CYRILLIC */
 425:     "spanish",          L_SPANISH,    CM_INV,
 426:     "swedish",          L_SWEDISH,    0,
 427: #ifdef CYRILLIC
 428:     "ukrainian",        L_RUSSIAN,    0
 429: #endif /* CYRILLIC */
 430: };
 431: int nlng = (sizeof(lngtab) / sizeof(struct keytab)); /* how many languages */
 432: 
 433: 
 434: /* Translation tables ... */
 435: 
 436: /*
 437:   For each pair of (transfer,file) character sets, we need two translation
 438:   functions, one for sending, one for receiving.
 439: */
 440: 
 441: /*
 442:   Here is the first table, Latin-1 to ASCII, fully annotated...
 443:   This one is absolutely NOT invertible, since we're going from an 8-bit
 444:   set to a 7-bit set.  Accented letters are mapped to unaccented
 445:   equivalents, C1 control characters are all translated to "?", etc.
 446: */
 447: CHAR
 448: yl1as[] = {  /* ISO 8859-1 Latin Alphabet 1 to US ASCII */
 449:       /*  Source character    Description               => Translation */
 450:       /*  Dec row/col Set                                           */
 451:   0,  /*  000  00/00  C0 NUL  Ctrl-@                    =>  (self)  */
 452:   1,  /*  001  00/01  C0 SOH  Ctrl-A                    =>  (self)  */
 453:   2,  /*  002  00/02  C0 STX  Ctrl-B                    =>  (self)  */
 454:   3,  /*  003  00/03  C0 ETX  Ctrl-C                    =>  (self)  */
 455:   4,  /*  004  00/04  C0 EOT  Ctrl-D                    =>  (self)  */
 456:   5,  /*  005  00/05  C0 ENQ  Ctrl-E                    =>  (self)  */
 457:   6,  /*  006  00/06  C0 ACK  Ctrl-F                    =>  (self)  */
 458:   7,  /*  007  00/07  C0 BEL  Ctrl-G                    =>  (self)  */
 459:   8,  /*  008  00/08  C0 BS   Ctrl-H                    =>  (self)  */
 460:   9,  /*  009  00/09  C0 HT   Ctrl-I                    =>  (self)  */
 461:  10,  /*  010  00/10  C0 LF   Ctrl-J                    =>  (self)  */
 462:  11,  /*  011  00/11  C0 VT   Ctrl-K                    =>  (self)  */
 463:  12,  /*  012  00/12  C0 FF   Ctrl-L                    =>  (self)  */
 464:  13,  /*  013  00/13  C0 CR   Ctrl-M                    =>  (self)  */
 465:  14,  /*  014  00/14  C0 SO   Ctrl-N                    =>  (self)  */
 466:  15,  /*  015  00/15  C0 SI   Ctrl-O                    =>  (self)  */
 467:  16,  /*  016  01/00  C0 DLE  Ctrl-P                    =>  (self)  */
 468:  17,  /*  017  01/01  C0 DC1  Ctrl-Q                    =>  (self)  */
 469:  18,  /*  018  01/02  C0 DC2  Ctrl-R                    =>  (self)  */
 470:  19,  /*  019  01/03  C0 DC3  Ctrl-S                    =>  (self)  */
 471:  20,  /*  020  01/04  C0 DC4  Ctrl-T                    =>  (self)  */
 472:  21,  /*  021  01/05  C0 NAK  Ctrl-U                    =>  (self)  */
 473:  22,  /*  022  01/06  C0 SYN  Ctrl-V                    =>  (self)  */
 474:  23,  /*  023  01/07  C0 ETB  Ctrl-W                    =>  (self)  */
 475:  24,  /*  024  01/08  C0 CAN  Ctrl-X                    =>  (self)  */
 476:  25,  /*  025  01/09  C0 EM   Ctrl-Y                    =>  (self)  */
 477:  26,  /*  026  01/10  C0 SUB  Ctrl-Z                    =>  (self)  */
 478:  27,  /*  027  01/11  C0 ESC  Ctrl-[                    =>  (self)  */
 479:  28,  /*  028  01/12  C0 FS   Ctrl-\                    =>  (self)  */
 480:  29,  /*  029  01/13  C0 GS   Ctrl-]                    =>  (self)  */
 481:  30,  /*  030  01/14  C0 RS   Ctrl-^                    =>  (self)  */
 482:  31,  /*  031  01/15  C0 US   Ctrl-_                    =>  (self)  */
 483:  32,  /*  032  02/00     SP   Space                     =>  (self)  */
 484:  33,  /*  033  02/01  G0 !    Exclamation mark          =>  (self)  */
 485:  34,  /*  034  02/02  G0 "    Doublequote               =>  (self)  */
 486:  35,  /*  035  02/03  G0 #    Number sign               =>  (self)  */
 487:  36,  /*  036  02/04  G0 $    Dollar sign               =>  (self)  */
 488:  37,  /*  037  02/05  G0 %    Percent sign              =>  (self)  */
 489:  38,  /*  038  02/06  G0 &    Ampersand                 =>  (self)  */
 490:  39,  /*  039  02/07  G0 '    Apostrophe                =>  (self)  */
 491:  40,  /*  040  02/08  G0 (    Left parenthesis          =>  (self)  */
 492:  41,  /*  041  02/09  G0 )    Right parenthesis         =>  (self)  */
 493:  42,  /*  042  02/10  G0 *    Asterisk                  =>  (self)  */
 494:  43,  /*  043  02/11  G0 +    Plus sign                 =>  (self)  */
 495:  44,  /*  044  02/12  G0 ,    Comma                     =>  (self)  */
 496:  45,  /*  045  02/13  G0 -    Hyphen, minus sign        =>  (self)  */
 497:  46,  /*  046  02/14  G0 .    Period, full stop         =>  (self)  */
 498:  47,  /*  047  02/15  G0 /    Slash, solidus            =>  (self)  */
 499:  48,  /*  048  03/00  G0 0    Digit 0                   =>  (self)  */
 500:  49,  /*  049  03/01  G0 1    Digit 1                   =>  (self)  */
 501:  50,  /*  050  03/02  G0 2    Digit 2                   =>  (self)  */
 502:  51,  /*  051  03/03  G0 3    Digit 3                   =>  (self)  */
 503:  52,  /*  052  03/04  G0 4    Digit 4                   =>  (self)  */
 504:  53,  /*  053  03/05  G0 5    Digit 5                   =>  (self)  */
 505:  54,  /*  054  03/06  G0 6    Digit 6                   =>  (self)  */
 506:  55,  /*  055  03/07  G0 7    Digit 7                   =>  (self)  */
 507:  56,  /*  056  03/08  G0 8    Digit 8                   =>  (self)  */
 508:  57,  /*  057  03/09  G0 9    Digit 9                   =>  (self)  */
 509:  58,  /*  058  03/10  G0 :    Colon                     =>  (self)  */
 510:  59,  /*  059  03/11  G0 ;    Semicolon                 =>  (self)  */
 511:  60,  /*  060  03/12  G0 <    Less-than sign            =>  (self)  */
 512:  61,  /*  061  03/13  G0 =    Equals sign               =>  (self)  */
 513:  62,  /*  062  03/14  G0 >    Greater-than sign         =>  (self)  */
 514:  63,  /*  063  03/15  G0 ?    Question mark             =>  (self)  */
 515:  64,  /*  064  04/00  G0 @    Commercial at sign        =>  (self)  */
 516:  65,  /*  065  04/01  G0 A    Letter A                  =>  (self)  */
 517:  66,  /*  066  04/02  G0 B    Letter B                  =>  (self)  */
 518:  67,  /*  067  04/03  G0 C    Letter C                  =>  (self)  */
 519:  68,  /*  068  04/04  G0 D    Letter D                  =>  (self)  */
 520:  69,  /*  069  04/05  G0 E    Letter E                  =>  (self)  */
 521:  70,  /*  070  04/06  G0 F    Letter F                  =>  (self)  */
 522:  71,  /*  071  04/07  G0 G    Letter G                  =>  (self)  */
 523:  72,  /*  072  04/08  G0 H    Letter H                  =>  (self)  */
 524:  73,  /*  073  04/09  G0 I    Letter I                  =>  (self)  */
 525:  74,  /*  074  04/10  G0 J    Letter J                  =>  (self)  */
 526:  75,  /*  075  04/11  G0 K    Letter K                  =>  (self)  */
 527:  76,  /*  076  04/12  G0 L    Letter L                  =>  (self)  */
 528:  77,  /*  077  04/13  G0 M    Letter M                  =>  (self)  */
 529:  78,  /*  078  04/14  G0 N    Letter N                  =>  (self)  */
 530:  79,  /*  079  04/15  G0 O    Letter O                  =>  (self)  */
 531:  80,  /*  080  05/00  G0 P    Letter P                  =>  (self)  */
 532:  81,  /*  081  05/01  G0 Q    Letter Q                  =>  (self)  */
 533:  82,  /*  082  05/02  G0 R    Letter R                  =>  (self)  */
 534:  83,  /*  083  05/03  G0 S    Letter S                  =>  (self)  */
 535:  84,  /*  084  05/04  G0 T    Letter T                  =>  (self)  */
 536:  85,  /*  085  05/05  G0 U    Letter U                  =>  (self)  */
 537:  86,  /*  086  05/06  G0 V    Letter V                  =>  (self)  */
 538:  87,  /*  087  05/07  G0 W    Letter W                  =>  (self)  */
 539:  88,  /*  088  05/08  G0 X    Letter X                  =>  (self)  */
 540:  89,  /*  089  05/09  G0 Y    Letter Y                  =>  (self)  */
 541:  90,  /*  090  05/10  G0 Z    Letter Z                  =>  (self)  */
 542:  91,  /*  091  05/11  G0 [    Left square bracket       =>  (self)  */
 543:  92,  /*  092  05/12  G0 \    Reverse slash             =>  (self)  */
 544:  93,  /*  093  05/13  G0 ]    Right square bracket      =>  (self)  */
 545:  94,  /*  094  05/14  G0 ^    Circumflex accent         =>  (self)  */
 546:  95,  /*  095  05/15  G0 _    Underline, low line       =>  (self)  */
 547:  96,  /*  096  06/00  G0 `    Grave accent              =>  (self)  */
 548:  97,  /*  097  06/01  G0 a    Letter a                  =>  (self)  */
 549:  98,  /*  098  06/02  G0 b    Letter b                  =>  (self)  */
 550:  99,  /*  099  06/03  G0 c    Letter c                  =>  (self)  */
 551: 100,  /*  100  06/04  G0 d    Letter d                  =>  (self)  */
 552: 101,  /*  101  06/05  G0 e    Letter e                  =>  (self)  */
 553: 102,  /*  102  06/06  G0 f    Letter f                  =>  (self)  */
 554: 103,  /*  103  06/07  G0 g    Letter g                  =>  (self)  */
 555: 104,  /*  104  06/08  G0 h    Letter h                  =>  (self)  */
 556: 105,  /*  105  06/09  G0 i    Letter i                  =>  (self)  */
 557: 106,  /*  106  06/10  G0 j    Letter j                  =>  (self)  */
 558: 107,  /*  107  06/11  G0 k    Letter k                  =>  (self)  */
 559: 108,  /*  108  06/12  G0 l    Letter l                  =>  (self)  */
 560: 109,  /*  109  06/13  G0 m    Letter m                  =>  (self)  */
 561: 110,  /*  110  06/14  G0 n    Letter n                  =>  (self)  */
 562: 111,  /*  111  06/15  G0 o    Letter o                  =>  (self)  */
 563: 112,  /*  112  07/00  G0 p    Letter p                  =>  (self)  */
 564: 113,  /*  113  07/01  G0 q    Letter q                  =>  (self)  */
 565: 114,  /*  114  07/02  G0 r    Letter r                  =>  (self)  */
 566: 115,  /*  115  07/03  G0 s    Letter s                  =>  (self)  */
 567: 116,  /*  116  07/04  G0 t    Letter t                  =>  (self)  */
 568: 117,  /*  117  07/05  G0 u    Letter u                  =>  (self)  */
 569: 118,  /*  118  07/06  G0 v    Letter v                  =>  (self)  */
 570: 119,  /*  119  07/07  G0 w    Letter w                  =>  (self)  */
 571: 120,  /*  120  07/08  G0 x    Letter x                  =>  (self)  */
 572: 121,  /*  121  07/09  G0 y    Letter y                  =>  (self)  */
 573: 122,  /*  122  07/10  G0 z    Letter z                  =>  (self)  */
 574: 123,  /*  123  07/11  G0 {    Left curly bracket        =>  (self)  */
 575: 124,  /*  124  07/12  G0 |    Vertical bar              =>  (self)  */
 576: 125,  /*  125  07/13  G0 }    Right curly bracket       =>  (self)  */
 577: 126,  /*  126  07/14  G0 ~    Tilde                     =>  (self)  */
 578: 127,  /*  127  07/15     DEL  Delete, Rubout            =>  (self)  */
 579: UNK,  /*  128  08/00  C1                                =>  UNK     */
 580: UNK,  /*  129  08/01  C1                                =>  UNK     */
 581: UNK,  /*  130  08/02  C1                                =>  UNK     */
 582: UNK,  /*  131  08/03  C1                                =>  UNK     */
 583: UNK,  /*  132  08/04  C1 IND                            =>  UNK     */
 584: UNK,  /*  133  08/05  C1 NEL                            =>  UNK     */
 585: UNK,  /*  134  08/06  C1 SSA                            =>  UNK     */
 586: UNK,  /*  135  08/07  C1 ESA                            =>  UNK     */
 587: UNK,  /*  136  08/08  C1 HTS                            =>  UNK     */
 588: UNK,  /*  137  08/09  C1                                =>  UNK     */
 589: UNK,  /*  138  08/10  C1                                =>  UNK     */
 590: UNK,  /*  139  08/11  C1                                =>  UNK     */
 591: UNK,  /*  140  08/12  C1                                =>  UNK     */
 592: UNK,  /*  141  08/13  C1 RI                             =>  UNK     */
 593: UNK,  /*  142  08/14  C1 SS2                            =>  UNK     */
 594: UNK,  /*  143  08/15  C1 SS3                            =>  UNK     */
 595: UNK,  /*  144  09/00  C1 DCS                            =>  UNK     */
 596: UNK,  /*  145  09/01  C1                                =>  UNK     */
 597: UNK,  /*  146  09/02  C1                                =>  UNK     */
 598: UNK,  /*  147  09/03  C1 STS                            =>  UNK     */
 599: UNK,  /*  148  09/04  C1                                =>  UNK     */
 600: UNK,  /*  149  09/05  C1                                =>  UNK     */
 601: UNK,  /*  150  09/06  C1 SPA                            =>  UNK     */
 602: UNK,  /*  151  09/07  C1 EPA                            =>  UNK     */
 603: UNK,  /*  152  09/08  C1                                =>  UNK     */
 604: UNK,  /*  153  09/09  C1                                =>  UNK     */
 605: UNK,  /*  154  09/10  C1                                =>  UNK     */
 606: UNK,  /*  155  09/11  C1 CSI                            =>  UNK     */
 607: UNK,  /*  156  09/12  C1 ST                             =>  UNK     */
 608: UNK,  /*  157  09/13  C1 OSC                            =>  UNK     */
 609: UNK,  /*  158  09/14  C1 PM                             =>  UNK     */
 610: UNK,  /*  159  09/15  C1 APC                            =>  UNK     */
 611:  32,  /*  160  10/00  G1      No-break space            =>  SP      */
 612:  33,  /*  161  10/01  G1      Inverted exclamation      =>  !       */
 613:  99,  /*  162  10/02  G1      Cent sign                 =>  c       */
 614:  35,  /*  163  10/03  G1      Pound sign                =>  #       */
 615:  36,  /*  164  10/04  G1      Currency sign             =>  $       */
 616:  89,  /*  165  10/05  G1      Yen sign                  =>  Y       */
 617: 124,  /*  166  10/06  G1      Broken bar                =>  |       */
 618:  80,  /*  167  10/07  G1      Paragraph sign            =>  P       */
 619:  34,  /*  168  10/08  G1      Diaeresis                 =>  "       */
 620:  67,  /*  169  10/09  G1      Copyright sign            =>  C       */
 621:  97,  /*  170  10/10  G1      Feminine ordinal          =>  a       */
 622:  34,  /*  171  10/11  G1      Left angle quotation      =>  "       */
 623: 126,  /*  172  10/12  G1      Not sign                  =>  ~       */
 624:  45,  /*  173  10/13  G1      Soft hyphen               =>  -       */
 625:  82,  /*  174  10/14  G1      Registered trade mark     =>  R       */
 626:  95,  /*  175  10/15  G1      Macron                    =>  _       */
 627: 111,  /*  176  11/00  G1      Degree sign, ring above   =>  o       */
 628: UNK,  /*  177  11/01  G1      Plus-minus sign           =>  UNK     */
 629:  50,  /*  178  11/02  G1      Superscript two           =>  2       */
 630:  51,  /*  179  11/03  G1      Superscript three         =>  3       */
 631:  39,  /*  180  11/04  G1      Acute accent              =>  '       */
 632: 117,  /*  181  11/05  G1      Micro sign                =>  u       */
 633:  45,  /*  182  11/06  G1      Pilcrow sign              =>  -       */
 634:  45,  /*  183  11/07  G1      Middle dot                =>  -       */
 635:  44,  /*  184  11/08  G1      Cedilla                   =>  ,       */
 636:  49,  /*  185  11/09  G1      Superscript one           =>  1       */
 637: 111,  /*  186  11/10  G1      Masculine ordinal         =>  o       */
 638:  34,  /*  187  11/11  G1      Right angle quotation     =>  "       */
 639: UNK,  /*  188  11/12  G1      One quarter               =>  UNK     */
 640: UNK,  /*  189  11/13  G1      One half                  =>  UNK     */
 641: UNK,  /*  190  11/14  G1      Three quarters            =>  UNK     */
 642:  63,  /*  191  11/15  G1      Inverted question mark    =>  ?       */
 643:  65,  /*  192  12/00  G1      A grave                   =>  A       */
 644:  65,  /*  193  12/01  G1      A acute                   =>  A       */
 645:  65,  /*  194  12/02  G1      A circumflex              =>  A       */
 646:  65,  /*  195  12/03  G1      A tilde                   =>  A       */
 647:  65,  /*  196  12/04  G1      A diaeresis               =>  A       */
 648:  65,  /*  197  12/05  G1      A ring above              =>  A       */
 649:  65,  /*  198  12/06  G1      A with E                  =>  A       */
 650:  67,  /*  199  12/07  G1      C Cedilla                 =>  C       */
 651:  69,  /*  200  12/08  G1      E grave                   =>  E       */
 652:  69,  /*  201  12/09  G1      E acute                   =>  E       */
 653:  69,  /*  202  12/10  G1      E circumflex              =>  E       */
 654:  69,  /*  203  12/11  G1      E diaeresis               =>  E       */
 655:  73,  /*  204  12/12  G1      I grave                   =>  I       */
 656:  73,  /*  205  12/13  G1      I acute                   =>  I       */
 657:  73,  /*  206  12/14  G1      I circumflex              =>  I       */
 658:  73,  /*  207  12/15  G1      I diaeresis               =>  I       */
 659:  68,  /*  208  13/00  G1      Icelandic Eth             =>  D       */
 660:  78,  /*  209  13/01  G1      N tilde                   =>  N       */
 661:  79,  /*  210  13/02  G1      O grave                   =>  O       */
 662:  79,  /*  211  13/03  G1      O acute                   =>  O       */
 663:  79,  /*  212  13/04  G1      O circumflex              =>  O       */
 664:  79,  /*  213  13/05  G1      O tilde                   =>  O       */
 665:  79,  /*  214  13/06  G1      O diaeresis               =>  O       */
 666: 120,  /*  215  13/07  G1      Multiplication sign       =>  x       */
 667:  79,  /*  216  13/08  G1      O oblique stroke          =>  O       */
 668:  85,  /*  217  13/09  G1      U grave                   =>  U       */
 669:  85,  /*  218  13/10  G1      U acute                   =>  U       */
 670:  85,  /*  219  13/11  G1      U circumflex              =>  U       */
 671:  85,  /*  220  13/12  G1      U diaeresis               =>  U       */
 672:  89,  /*  221  13/13  G1      Y acute                   =>  Y       */
 673:  84,  /*  222  13/14  G1      Icelandic Thorn           =>  T       */
 674: 115,  /*  223  13/15  G1      German sharp s            =>  s       */
 675:  97,  /*  224  14/00  G1      a grave                   =>  a       */
 676:  97,  /*  225  14/01  G1      a acute                   =>  a       */
 677:  97,  /*  226  14/02  G1      a circumflex              =>  a       */
 678:  97,  /*  227  14/03  G1      a tilde                   =>  a       */
 679:  97,  /*  228  14/04  G1      a diaeresis               =>  a       */
 680:  97,  /*  229  14/05  G1      a ring above              =>  a       */
 681:  97,  /*  230  14/06  G1      a with e                  =>  a       */
 682:  99,  /*  231  14/07  G1      c cedilla                 =>  c       */
 683: 101,  /*  232  14/08  G1      e grave                   =>  e       */
 684: 101,  /*  233  14/09  G1      e acute                   =>  e       */
 685: 101,  /*  234  14/10  G1      e circumflex              =>  e       */
 686: 101,  /*  235  14/11  G1      e diaeresis               =>  e       */
 687: 105,  /*  236  14/12  G1      i grave                   =>  i       */
 688: 105,  /*  237  14/13  G1      i acute                   =>  i       */
 689: 105,  /*  238  14/14  G1      i circumflex              =>  i       */
 690: 105,  /*  239  14/15  G1      i diaeresis               =>  i       */
 691: 100,  /*  240  15/00  G1      Icelandic eth             =>  d       */
 692: 110,  /*  241  15/01  G1      n tilde                   =>  n       */
 693: 111,  /*  242  15/02  G1      o grave                   =>  o       */
 694: 111,  /*  243  15/03  G1      o acute                   =>  o       */
 695: 111,  /*  244  15/04  G1      o circumflex              =>  o       */
 696: 111,  /*  245  15/05  G1      o tilde                   =>  o       */
 697: 111,  /*  246  15/06  G1      o diaeresis               =>  o       */
 698:  47,  /*  247  15/07  G1      Division sign             =>  /       */
 699: 111,  /*  248  15/08  G1      o oblique stroke          =>  o       */
 700: 117,  /*  249  15/09  G1      u grave                   =>  u       */
 701: 117,  /*  250  15/10  G1      u acute                   =>  u       */
 702: 117,  /*  251  15/11  G1      u circumflex              =>  u       */
 703: 117,  /*  252  15/12  G1      u diaeresis               =>  u       */
 704: 121,  /*  253  15/13  G1      y acute                   =>  y       */
 705: 116,  /*  254  15/14  G1      Icelandic thorn           =>  t       */
 706: 121   /*  255  15/15  G1      y diaeresis               =>  y       */
 707: };
 708: 
 709: 
 710: /* Translation tables for ISO Latin Alphabet 1 to local file character sets */
 711: 
 712: /*
 713:   Most of the remaining tables are not annotated like the one above, because
 714:   the size of the resulting source file would be ridiculous.  Each row in the
 715:   following tables corresponds to a column of ISO 8859-1.
 716: */
 717: 
 718: CHAR
 719: yl185[] = {  /* ISO 8859-1 Latin Alphabet 1 (Latin-1) to IBM Code Page 850 */
 720: /*
 721:   This is IBM's official invertible translation.  Reference: IBM Character
 722:   Data Representation Architecture (CDRA), Level 1, Registry, SC09-1291-00
 723:   (1990), p.152.  (Note: Latin-1 is IBM Code Page 00819.)  Note the bizarre
 724:   rearrangement of C0 controls and DEL.
 725: */
 726:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 727:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 728:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 729:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 730:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 731:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
 732:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 733: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
 734: 186, 205, 201, 187, 200, 188, 204, 185, 203, 202, 206, 223, 220, 219, 254, 242,
 735: 179, 196, 218, 191, 192, 217, 195, 180, 194, 193, 197, 176, 177, 178, 213, 159,
 736: 255, 173, 189, 156, 207, 190, 221, 245, 249, 184, 166, 174, 170, 240, 169, 238,
 737: 248, 241, 253, 252, 239, 230, 244, 250, 247, 251, 167, 175, 172, 171, 243, 168,
 738: 183, 181, 182, 199, 142, 143, 146, 128, 212, 144, 210, 211, 222, 214, 215, 216,
 739: 209, 165, 227, 224, 226, 229, 153, 158, 157, 235, 233, 234, 154, 237, 232, 225,
 740: 133, 160, 131, 198, 132, 134, 145, 135, 138, 130, 136, 137, 141, 161, 140, 139,
 741: 208, 164, 149, 162, 147, 228, 148, 246, 155, 151, 163, 150, 129, 236, 231, 152
 742: };
 743: 
 744: CHAR
 745: y85l1[] = {  /* IBM Code Page 850 to Latin-1 */
 746: /*
 747:   This is from IBM CDRA page 153.  It is the inverse of yl185[].
 748:   As of edit 183, this table is no longer pure CDRA.  The translations
 749:   involving C0 controls have been removed.
 750: */
 751:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 752:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 753:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 754:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 755:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 756:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
 757:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 758: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
 759: 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197,
 760: 201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 248, 163, 216, 215, 159,
 761: 225, 237, 243, 250, 241, 209, 170, 186, 191, 174, 172, 189, 188, 161, 171, 187,
 762: 155, 156, 157, 144, 151, 193, 194, 192, 169, 135, 128, 131, 133, 162, 165, 147,
 763: 148, 153, 152, 150, 145, 154, 227, 195, 132, 130, 137, 136, 134, 129, 138, 164,
 764: 240, 208, 202, 203, 200, 158, 205, 206, 207, 149, 146, 141, 140, 166, 204, 139,
 765: 211, 223, 212, 210, 245, 213, 181, 254, 222, 218, 219, 217, 253, 221, 175, 180,
 766: 173, 177, 143, 190, 182, 167, 247, 184, 176, 168, 183, 185, 179, 178, 142, 160
 767: };
 768: 
 769: CHAR
 770: yl143[] = {  /* Latin-1 to IBM Code Page 437 */
 771: /*
 772:   Although the IBM CDRA does not include an official translation between CP437
 773:   and ISO Latin Alphabet 1, it does include an official, invertible
 774:   translation between CP437 and CP850 (page 196), and another from CP850 to
 775:   Latin-1 (CP819) (page 153).  This translation was obtained with a two-step
 776:   process based on those tables.
 777:   As of edit 183, the translation is modified to leave C0 controls alone.
 778: */
 779:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 780:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 781:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 782:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 783:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 784:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
 785:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 786: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
 787: 186, 205, 201, 187, 200, 188, 204, 185, 203, 202, 206, 223, 220, 219, 254, 242,
 788: 179, 196, 218, 191, 192, 217, 195, 180, 194, 193, 197, 176, 177, 178, 213, 159,
 789: 255, 173, 155, 156, 207, 157, 221, 245, 249, 184, 166, 174, 170, 240, 169, 238,
 790: 248, 241, 253, 252, 239, 230, 244, 250, 247, 251, 167, 175, 172, 171, 243, 168,
 791: 183, 181, 182, 199, 142, 143, 146, 128, 212, 144, 210, 211, 222, 214, 215, 216,
 792: 209, 165, 227, 224, 226, 229, 153, 158, 190, 235, 233, 234, 154, 237, 232, 225,
 793: 133, 160, 131, 198, 132, 134, 145, 135, 138, 130, 136, 137, 141, 161, 140, 139,
 794: 208, 164, 149, 162, 147, 228, 148, 246, 189, 151, 163, 150, 129, 236, 231, 152
 795: };
 796: 
 797: CHAR
 798: y43l1[] = {  /* IBM Code Page 437 to Latin-1 */
 799: /*
 800:   This table is the inverse of yl143[].
 801: */
 802:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 803:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 804:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 805:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 806:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 807:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
 808:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 809: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
 810: 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197,
 811: 201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 162, 163, 165, 215, 159,
 812: 225, 237, 243, 250, 241, 209, 170, 186, 191, 174, 172, 189, 188, 161, 171, 187,
 813: 155, 156, 157, 144, 151, 193, 194, 192, 169, 135, 128, 131, 133, 248, 216, 147,
 814: 148, 153, 152, 150, 145, 154, 227, 195, 132, 130, 137, 136, 134, 129, 138, 164,
 815: 240, 208, 202, 203, 200, 158, 205, 206, 207, 149, 146, 141, 140, 166, 204, 139,
 816: 211, 223, 212, 210, 245, 213, 181, 254, 222, 218, 219, 217, 253, 221, 175, 180,
 817: 173, 177, 143, 190, 182, 167, 247, 184, 176, 168, 183, 185, 179, 178, 142, 160
 818: };
 819: 
 820: CHAR
 821: yl1aq[] = {  /* Latin-1 to Extended Mac Latin (based on Apple QuickDraw) */
 822:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 823:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 824:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 825:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 826:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 827:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
 828:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 829: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
 830: 182, 183, 184, 185, 189, 196, 197, 198, 206, 207, 210, 211, 217, 218, 195, 212,
 831: 209, 215, 213, 226, 227, 228, 240, 245, 246, 247, 249, 250, 251, 253, 254, 255,
 832: 202, 193, 162, 163, 219, 180, 201, 164, 172, 169, 187, 199, 194, 208, 168, 248,
 833: 161, 177, 170, 173, 171, 181, 166, 225, 252, 176, 188, 200, 178, 179, 186, 192,
 834: 203, 231, 229, 204, 128, 129, 174, 130, 233, 131, 230, 232, 237, 234, 235, 236,
 835: 220, 132, 241, 238, 239, 205, 133, 165, 175, 244, 242, 243, 134, 160, 222, 167,
 836: 136, 135, 137, 139, 138, 140, 190, 141, 143, 142, 144, 145, 147, 146, 148, 149,
 837: 221, 150, 152, 151, 153, 155, 154, 214, 191, 157, 156, 158, 159, 224, 223, 216
 838: };
 839: 
 840: CHAR
 841: yl1du[] = {  /* Latin-1 to Dutch ISO 646 */
 842:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 843:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 844:  32,  33,  34, UNK,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 845:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 846: UNK,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 847:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK,  94,  95,
 848:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 849: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK,  39, 127,
 850: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
 851: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
 852:  32,  33, UNK,  35, 124, UNK, UNK,  93, 123,  67, UNK,  34, UNK,  45,  82, UNK,
 853:  91, UNK, UNK, UNK, 126, 117, UNK, UNK,  44, UNK, UNK,  34, 125,  92,  64,  63,
 854:  65,  65,  65,  65,  91,  65,  65,  67,  69,  69,  69,  69,  73,  73,  73,  73,
 855: UNK,  78,  79,  79,  79,  79,  79, 120,  79,  85,  85,  85,  85,  89, UNK, 115,
 856:  97,  97,  97,  97,  97,  97,  97,  99, 101, 101, 101, 101, 105, 105, 105, 105,
 857: UNK, 110, 111, 111, 111, 111, 111,  47, 111, 117, 117, 117, 117, 121, UNK,  91
 858: };
 859: 
 860: CHAR
 861: yl1fi[] = {  /* Latin-1 to Finnish ISO 646 */
 862:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 863:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 864:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 865:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 866:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 867:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK, UNK,  95,
 868: UNK,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 869: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, UNK, UNK,
 870: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
 871: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
 872:  32,  33, UNK, UNK, UNK, UNK, UNK, UNK,  34,  67, UNK,  34, UNK,  45,  82, UNK,
 873: UNK, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
 874:  65,  65,  65,  65,  91,  93,  65,  67,  69,  69,  69,  69,  73,  73,  73,  73,
 875: UNK,  78,  79,  79,  79,  79,  92, 120,  79,  85,  85,  85,  94,  89, UNK, 115,
 876:  97,  97,  97,  97, 123, 125,  97,  99, 101,  96, 101, 101, 105, 105, 105, 105,
 877: UNK, 110, 111, 111, 111, 111, 124,  47, 111, 117, 117, 117, 126, 121, UNK, 121
 878: };
 879: 
 880: CHAR
 881: yl1fr[] = {  /* Latin-1 to French ISO 646 */
 882:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 883:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 884:  32,  33,  34, UNK,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 885:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 886: UNK,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 887:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK,  94,  95,
 888:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 889: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, UNK, 127,
 890: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
 891: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
 892:  32,  33, UNK,  35, UNK, UNK, UNK,  93,  34,  67, UNK,  34, UNK,  45,  82, UNK,
 893:  91, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
 894:  65,  65,  65,  65,  65,  65,  65,  67,  69,  69,  69,  69,  73,  73,  73,  73,
 895: UNK,  78,  79,  79,  79,  79,  79, 120,  79,  85,  85,  85,  85,  89, UNK, 115,
 896:  64,  97,  97,  97,  97,  97,  97,  92, 125, 123, 101, 101, 105, 105, 105, 105,
 897: UNK, 110, 111, 111, 111, 111, 111,  47, 111, 124, 117, 117, 117, 121, UNK, 121
 898: };
 899: 
 900: CHAR
 901: yl1fc[] = {  /* Latin-1 to French-Canadian ISO 646 */
 902:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 903:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 904:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 905:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 906: UNK,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 907:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK, UNK,  95,
 908: UNK,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 909: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, UNK, 127,
 910: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
 911: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
 912:  32,  33, UNK, UNK, UNK, UNK, UNK, UNK,  34,  67, UNK,  34, UNK,  45,  82, UNK,
 913: UNK, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
 914:  65,  65,  65,  65,  65,  65,  65,  67,  69,  69,  69,  69,  73,  73,  73,  73,
 915: UNK,  78,  79,  79,  79,  79,  79, 120,  79,  85,  85,  85,  85,  89, UNK, 115,
 916:  64,  97,  91,  97,  97,  97,  97,  92, 125, 123,  93, 101, 105, 105,  94, 105,
 917: UNK, 110, 111, 111,  96, 111, 111,  47, 111, 124, 117, 126, 117, 121, UNK, 121
 918: };
 919: 
 920: CHAR
 921: yl1ge[] = {  /* Latin-1 to German ISO 646 */
 922:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 923:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 924:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 925:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 926: UNK,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 927:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK,  94,  95,
 928:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 929: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, UNK, 127,
 930: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
 931: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
 932:  32,  33, UNK, UNK, UNK, UNK, UNK,  64,  34,  67, UNK,  34, UNK,  45,  82, UNK,
 933: UNK, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
 934:  65,  65,  65,  65,  91,  65,  65,  67,  69,  69,  69,  69,  73,  73,  73,  73,
 935: UNK,  78,  79,  79,  79,  79,  92, 120,  79,  85,  85,  85,  93,  89, UNK, 126,
 936:  97,  97,  97,  97, 123,  97,  97,  99, 101, 101, 101, 101, 105, 105, 105, 105,
 937: UNK, 110, 111, 111, 111, 111, 124,  47, 111, 117, 117, 117, 125, 121, UNK, 121
 938: };
 939: 
 940: CHAR
 941: yl1hu[] = {  /* Latin-1 to Hungarian ISO-646 */
 942:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 943:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 944:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 945:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 946:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 947:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
 948:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 949: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
 950: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
 951: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
 952:  32,  33, UNK, UNK,  36, UNK, UNK, UNK,  34,  67, UNK,  34, UNK,  45,  82, UNK,
 953: UNK,  64, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
 954:  65,  65,  65,  65,  65,  65,  65,  67,  69,  91,  69,  69,  73,  73,  73,  73,
 955: UNK,  78,  79,  79,  79,  79,  92, 120,  79,  85,  85,  85,  93,  89, UNK, 115,
 956:  97,  96,  97,  97,  97,  97,  97,  99, 101, 123, 101, 101, 105, 105, 105, 105,
 957: UNK, 110, 111, 111, 111, 111, 124,  47, 111, 117, 117, 117, 125, 121, UNK, 121
 958: };
 959: 
 960: CHAR
 961: yl1it[] = {  /* Latin-1 to Italian ISO 646 */
 962:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 963:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 964:  32,  33,  34, UNK,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 965:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 966: UNK,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 967:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK,  94,  95,
 968: UNK,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 969: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, UNK, 127,
 970: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
 971: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
 972:  32,  33, UNK,  35, UNK, UNK, UNK,  64,  34,  67, UNK,  34, UNK,  45,  82, UNK,
 973:  91, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
 974:  65,  65,  65,  65,  65,  65,  65,  67,  69,  69,  69,  69,  73,  73,  73,  73,
 975: UNK,  78,  79,  79,  79,  79,  79, 120,  79,  85,  85,  85,  85,  89, UNK, 115,
 976: 123,  97,  97,  97,  97,  97,  97,  92, 125,  93, 101, 101, 126, 105, 105, 105,
 977: UNK, 110, 124, 111, 111, 111, 111,  47, 111,  96, 117, 117, 117, 121, UNK, 121
 978: };
 979: 
 980: CHAR
 981: yl1ne[] = {  /* Latin-1 to NeXT */
 982: /* NEED TO MAKE THIS ONE INVERTIBLE, LIKE CP850 */
 983: /*
 984:   Which means finding all the graphic characters in the NeXT set that have
 985:   no equivalent in Latin-1 and assigning them to the UNK positions (mostly
 986:   Latin-1 C1 controls).  Then make the ynel1[] table be the inverse of this
 987:   one.  But first we should try to get an official Latin-1/NeXT translation
 988:   table from NeXT, Inc.
 989: */
 990:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
 991:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
 992:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
 993:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
 994:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
 995:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
 996:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
 997: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
 998: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
 999: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
1000:  32, 161, 162, 163, 168, 165, 181, 167, 200, 160, 227, 171, 190, UNK, 176, 197,
1001: 202, 209, 201, 204, 194, 157, 182, 183, 203, 192, 235, 187, 210, 211, 212, 191,
1002: 129, 130, 131, 132, 133, 134, 225, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1003: 144, 145, 146, 147, 148, 149, 150, 158, 233, 151, 152, 153, 154, 155, 156, 251,
1004: 213, 214, 215, 216, 217, 218, 241, 219, 220, 221, 222, 223, 224, 226, 228, 229,
1005: 230, 231, 236, 237, 238, 239, 240, 159, 249, 242, 243, 244, 246, 247, 252, 253
1006: };
1007: 
1008: CHAR
1009: yl1no[] = {  /* Latin-1 to Norwegian/Danish ISO 646 */
1010:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1011:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1012:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1013:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1014:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1015:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK,  94,  95,
1016:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1017: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, 126, 127,
1018: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1019: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1020:  32,  33, UNK, UNK, UNK, UNK, UNK, UNK,  34,  67, UNK,  34, UNK,  45,  82, UNK,
1021: UNK, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
1022:  65,  65,  65,  65,  65,  93,  91,  67,  69,  69,  69,  69,  73,  73,  73,  73,
1023: UNK,  78,  79,  79,  79,  79,  79, 120,  92,  85,  85,  85,  85,  89, UNK, 115,
1024:  97,  97,  97,  97,  97, 125, 123,  99, 101, 101, 101, 101, 105, 105, 105, 105,
1025: UNK, 110, 111, 111, 111, 111, 111,  47, 124, 117, 117, 117, 117, 121, UNK, 121
1026: };
1027: 
1028: CHAR
1029: yl1po[] = {  /* Latin-1 to Portuguese ISO 646 */
1030:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1031:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1032:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1033:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1034:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1035:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK,  94,  95,
1036:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1037: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, 126, 127,
1038: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1039: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1040:  32,  33, UNK, UNK, UNK, UNK, UNK, UNK,  34,  67, UNK,  34, UNK,  45,  82, UNK,
1041: UNK, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
1042:  65,  65,  65,  91,  65,  65,  65,  92,  69,  69,  69,  69,  73,  73,  73,  73,
1043: UNK,  78,  79,  79,  79,  93,  79, 120,  79,  85,  85,  85,  85,  89, UNK, 115,
1044:  97,  97,  97, 123,  97,  97,  97, 124, 101, 101, 101, 101, 105, 105, 105, 105,
1045: UNK, 110, 111, 111, 111, 125, 111,  47, 111, 117, 117, 117, 117, 121, UNK, 121
1046: };
1047: 
1048: CHAR
1049: yl1sp[] = {  /* Latin-1 to Spanish ISO 646 */
1050:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1051:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1052:  32,  33,  34, UNK,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1053:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1054: UNK,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1055:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK,  94,  95,
1056:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1057: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,  96, UNK, UNK, 126, 127,
1058: 126, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1059: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1060:  32,  91, UNK,  35, UNK, UNK, UNK,  64,  34,  67, UNK,  34, UNK,  45,  82, UNK,
1061: 123, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  93,
1062:  65,  65,  65,  65,  65,  65,  65,  67,  69,  69,  69,  69,  73,  73,  73,  73,
1063: UNK,  92,  79,  79,  79,  79,  79, 120,  79,  85,  85,  85,  85,  89, UNK, 115,
1064: 124,  97,  97,  97,  97,  97,  97, 125, 101, 101, 101, 101, 105, 105, 105, 105,
1065: UNK, 124, 111, 111, 111, 111, 111,  47, 111, 117, 117, 117, 117, 121, UNK, 121
1066: };
1067: 
1068: CHAR
1069: yl1sw[] = {  /* Latin-1 to Swedish ISO 646 */
1070:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1071:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1072:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1073:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1074: UNK,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1075:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK, UNK,  95,
1076: UNK,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1077: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, UNK, 127,
1078: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1079: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1080:  32,  33, UNK, UNK, UNK, UNK, UNK, UNK,  34,  67, UNK,  34, UNK,  45,  82, UNK,
1081: UNK, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
1082:  65,  65,  65,  65,  91,  93,  65,  67,  69,  64,  69,  69,  73,  73,  73,  73,
1083: UNK,  78,  79,  79,  79,  79,  92, 120,  79,  85,  85,  85,  94,  89, UNK, 115,
1084:  97,  97,  97,  97, 123, 125,  97,  99, 101,  96, 101, 101, 105, 105, 105, 105,
1085: UNK, 110, 111, 111, 111, 111, 124,  47, 111, 117, 117, 117, 126, 121, UNK, 121
1086: };
1087: 
1088: CHAR
1089: yl1ch[] = {  /* Latin-1 to Swiss ISO 646 */
1090:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1091:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1092:  32,  33,  34, UNK,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1093:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1094: UNK,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1095:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, UNK, UNK, UNK, UNK, UNK,
1096:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1097: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, UNK, UNK, UNK, UNK, 127,
1098: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1099: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1100:  32,  33, UNK, UNK, UNK, UNK, UNK, UNK,  34,  67, UNK,  34, UNK,  45,  82, UNK,
1101: UNK, UNK, UNK, UNK,  39, 117, UNK, UNK,  44, UNK, UNK,  34, UNK, UNK, UNK,  63,
1102:  65,  65,  65,  65,  65,  65,  65,  67,  69,  69,  69,  69,  73,  73,  73,  73,
1103: UNK,  78,  79,  79,  79,  79,  79, 120,  79,  85,  85,  85,  85,  89, UNK, 115,
1104:  64,  97,  97,  97, 123,  97,  97,  92,  95,  91,  93, 101, 105, 105,  94, 105,
1105: UNK, 110, 111, 111,  96, 111, 124,  47, 111,  35, 117, 126, 125, 121, UNK, 121
1106: };
1107: 
1108: CHAR
1109: yl1dm[] = {  /* Latin-1 to DEC Multinational Character Set */
1110:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1111:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1112:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1113:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1114:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1115:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1116:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1117: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1118: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1119: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1120:  32, 161, 162, 163, 168, 165, 124, 167,  34, 169, 170, 171, 126, UNK,  82, UNK,
1121: 176, 177, 178, 179,  39, 181, 182, 183,  44, 185, 186, 187, 188, 189, UNK, 191,
1122: 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1123: UNK, 209, 210, 211, 212, 213, 214, 120, 216, 217, 218, 219, 220, 221, UNK, 223,
1124: 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
1125: UNK, 241, 242, 243, 244, 245, 246,  47, 248, 249, 250, 251, 252, UNK, UNK, 253
1126: };
1127: 
1128: CHAR
1129: yl1dg[] = {  /* Latin-1 to Data General International Character Set */
1130:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1131:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1132:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1133:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1134:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1135:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1136:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1137: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1138: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1139: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1140: 160, 171, 167, 168, 166, 181, 191, 187, 189, 173, 169, 177, 161, 255, 174, 175,
1141: 188, 182, 164, 165, 190, 163, 178, 185, 186, 179, 170, 176, 223, 162, 220, 172,
1142: 193, 192, 194, 196, 195, 197, 198, 199, 201, 200, 202, 203, 205, 204, 206, 207,
1143: 184, 208, 210, 209, 211, 213, 212, 215, 214, 217, 216, 218, 219, 221, 222, 252,
1144: 225, 224, 226, 228, 227, 229, 230, 231, 233, 232, 234, 235, 237, 236, 238, 239,
1145: 183, 240, 242, 241, 243, 245, 244, 247, 246, 249, 248, 250, 251, 180, 254, 253
1146: };
1147: 
1148: 
1149: /* Local file character sets to ISO Latin Alphabet 1 */
1150: 
1151: #ifdef NOTUSED
1152: CHAR
1153: yasl1[] = {  /* ASCII to Latin-1 */
1154:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1155:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1156:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1157:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1158:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1159:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1160:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1161: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127
1162: };
1163: #endif /* NOTUSED */
1164: 
1165: CHAR
1166: yaql1[] = {  /* Extended Mac Latin (based on Apple Quickdraw) to Latin-1 */
1167:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1168:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1169:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1170:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1171:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1172:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1173:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1174: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1175: 196, 197, 199, 201, 209, 214, 220, 225, 224, 226, 228, 227, 229, 231, 233, 232,
1176: 234, 235, 237, 236, 238, 239, 241, 243, 242, 244, 246, 245, 250, 249, 251, 252,
1177: 221, 176, 162, 163, 167, 215, 182, 223, 174, 169, 178, 180, 168, 179, 198, 216,
1178: 185, 177, 188, 189, 165, 181, 128, 129, 130, 131, 190, 170, 186, 132, 230, 248,
1179: 191, 161, 172, 142, 133, 134, 135, 171, 187, 166, 160, 192, 195, 213, 136, 137,
1180: 173, 144, 138, 139, 143, 146, 247, 145, 255, 140, 141, 164, 208, 240, 222, 254,
1181: 253, 183, 147, 148, 149, 194, 202, 193, 203, 200, 205, 206, 207, 204, 211, 212,
1182: 150, 210, 218, 219, 217, 151, 152, 153, 175, 154, 155, 156, 184, 157, 158, 159
1183: };
1184: 
1185: CHAR
1186: ydul1[] = {  /* Dutch ISO 646 to Latin-1 */
1187:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1188:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1189:  32,  33,  34, 163,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1190:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1191: 190,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1192:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 255, 189, 124,  94,  95,
1193:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1194: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 168, 164, 188,  39, 127
1195: };
1196: 
1197: CHAR
1198: yfil1[] = {  /* Finnish ISO 646 to Latin-1 */
1199:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1200:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1201:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1202:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1203:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1204:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 196, 214, 197, 220,  95,
1205: 233,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1206: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 228, 246, 229, 252, 127
1207: };
1208: 
1209: CHAR
1210: yfrl1[] = {  /* French ISO 646 to Latin-1 */
1211:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1212:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1213:  32,  33,  34, 163,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1214:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1215: 224,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1216:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 176, 231, 167,  94,  95,
1217:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1218: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 233, 249, 232, 168, 127
1219: };
1220: 
1221: CHAR
1222: yfcl1[] = {  /* French-Canadian ISO 646 to Latin-1 */
1223:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1224:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1225:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1226:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1227: 224,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1228:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 226, 231, 234, 238,  95,
1229: 244,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1230: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 233, 249, 232, 251, 127
1231: };
1232: 
1233: CHAR
1234: ygel1[] = {  /* German ISO 646 to Latin-1 */
1235:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1236:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1237:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1238:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1239: 167,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1240:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 196, 214, 220,  94,  95,
1241:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1242: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 228, 246, 252, 223, 127
1243: };
1244: 
1245: CHAR
1246: yitl1[] = {  /* Italian ISO 646 to Latin-1 */
1247:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1248:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1249:  32,  33,  34, 163,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1250:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1251: 167,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1252:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 176, 231, 233,  94,  95,
1253: 249,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1254: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 224, 242, 232, 236, 127
1255: };
1256: 
1257: CHAR
1258: ynel1[] = {  /* NeXT to Latin-1 */
1259: /* NEED TO MAKE THIS ONE INVERTIBLE */
1260:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1261:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1262:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1263:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1264:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1265:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1266:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1267: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1268: 160, 192, 193, 194, 195, 196, 197, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1269: 208, 209, 210, 211, 212, 213, 214, 217, 218, 219, 220, 221, 222, 181, 215, 247,
1270: 169, 161, 162, 163, UNK, 165, UNK, 167, 164, UNK, UNK, 171, UNK, UNK, UNK, UNK,
1271: 174, UNK, UNK, UNK, 183, 166, 182, UNK, UNK, UNK, UNK, 187, UNK, UNK, 172, 191,
1272: 185,  96, 180,  94, 126, 175, UNK, UNK, 168, 178, 176, 184, 179, UNK, UNK, UNK,
1273: UNK, 177, 188, 189, 190, 224, 225, 226, 227, 228, 229, 231, 232, 233, 234, 235,
1274: 236, 198, 237, 170, 238, 239, 240, 241, UNK, 216, UNK, 186, 242, 243, 244, 245,
1275: 246, 230, 249, 250, 251, UNK, 252, 253, UNK, 248, UNK, 223, 254, 255, UNK, UNK
1276: };
1277: 
1278: CHAR
1279: ynol1[] = {  /* Norwegian/Danish ISO 646 to Latin-1 */
1280:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1281:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1282:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1283:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1284:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1285:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 198, 216, 197,  94,  95,
1286:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1287: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 230, 248, 229, 126, 127
1288: };
1289: 
1290: CHAR
1291: ypol1[] = {  /* Portuguese ISO 646 to Latin-1 */
1292:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1293:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1294:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1295:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1296:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1297:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 195, 199, 213,  94,  95,
1298:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1299: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 227, 231, 245, 126, 127
1300: };
1301: 
1302: CHAR
1303: yspl1[] = {  /* Spanish ISO 646 to Latin-1 */
1304:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1305:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1306:  32,  33,  34, 163,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1307:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1308: 167,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1309:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 161, 209, 191,  94,  95,
1310:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1311: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 176, 241, 231, 126, 127
1312: };
1313: 
1314: CHAR
1315: yswl1[] = {  /* Swedish ISO 646 to Latin-1 */
1316:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1317:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1318:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1319:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1320: 201,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1321:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 196, 214, 197, 220,  95,
1322: 233,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1323: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 228, 246, 229, 252, 127
1324: };
1325: 
1326: CHAR
1327: ychl1[] = {  /* Swiss ISO 646 to Latin-1 */
1328:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1329:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1330:  32,  33,  34, 249,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1331:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1332: 224,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1333:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 233, 231, 234, 238, 232,
1334: 244,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1335: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 228, 246, 252, 251, 127
1336: };
1337: 
1338: CHAR
1339: yhul1[] = {  /* Hungarian ISO 646 to Latin-1 */
1340:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1341:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1342:  32,  33,  34,  35, 164,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1343:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1344: 193,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1345:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90, 201, 214, 220,  94,  95,
1346: 225,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1347: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 233, 246, 252,  34, 127
1348: };
1349: 
1350: CHAR
1351: ydml1[] = {  /* DEC Multinational Character Set to Latin-1 */
1352:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1353:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1354:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1355:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1356:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1357:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1358:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1359: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1360: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1361: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1362: 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1363: 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1364: 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1365: 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1366: 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
1367: 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,
1368: };
1369: 
1370: CHAR
1371: ydgl1[] = {  /* Data General International to Latin-1 */
1372:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1373:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1374:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1375:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1376:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1377:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1378:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1379: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1380: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1381: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1382: 160, 172, 189, 181, 178, 179, 164, 162, 163, 170, 186, 161, 191, 169, 174, 175,
1383: 187, 171, 182, 185, 253, 165, 177, 240, 208, 183, 184, 167, 176, 168, 180, 166,
1384: 193, 192, 194, 196, 195, 197, 198, 199, 201, 200, 202, 203, 205, 204, 206, 207,
1385: 209, 211, 210, 212, 214, 213, 216, 215, 218, 217, 219, 220, 190, 221, 222, 188,
1386: 225, 224, 226, 228, 227, 229, 230, 231, 233, 232, 234, 235, 237, 236, 238, 239,
1387: 241, 243, 242, 244, 246, 245, 248, 247, 250, 249, 251, 252, 223, 255, 254, 173
1388: };
1389: 
1390: 
1391: /* Translation tables for Cyrillic character sets */
1392: 
1393: #ifdef CYRILLIC
1394: CHAR
1395: ylcac[] = {  /* Latin/Cyrillic to CP866 */
1396:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1397:  16,  17,  18,  19, 208, 209,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1398:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1399:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1400:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1401:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1402:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1403: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1404: 196, 179, 192, 217, 191, 218, 195, 193, 180, 194, 197, 176, 177, 178, 211, 216,
1405: 205, 186, 200, 188, 187, 201, 204, 202, 185, 203, 206, 223, 220, 219, 254, UNK,
1406: 255, 240, 132, 131, 242,  83,  73, 244,  74, 139, 141, 151, 138,  45, 246, 135,
1407: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1408: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1409: 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1410: 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
1411: 252, 241, 164, 163, 243, 115, 105, 245, 106, 171, 173, 231, 170,  21, 247, 167
1412: };
1413: 
1414: CHAR
1415: ylck8[] = {  /* Latin/Cyrillic to Old KOI-8 Cyrillic */
1416:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1417:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1418:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1419:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1420:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1421:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1422:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1423: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1424: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1425: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1426: UNK, 229, UNK, UNK, UNK,  83,  73,  73,  74, UNK, UNK, UNK, 235, UNK, 245, UNK,
1427: 225, 226, 247, 231, 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240,
1428: 242, 243, 244, 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241,
1429: 193, 194, 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208,
1430: 210, 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, 209,
1431: UNK, 197, UNK, UNK, UNK, 115, 105, 105, 106, UNK, UNK, UNK, 203, UNK, 213, UNK
1432: };
1433: 
1434: CHAR
1435: yaclc[] = {  /* CP866 to Latin/Cyrillic */
1436: /* NEED TO MAKE THIS ONE INVERTIBLE */
1437:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1438:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1439:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1440:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1441:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1442:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1443:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1444: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1445: 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1446: 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1447: 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1448: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
1449: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
1450: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
1451: 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
1452: 161, 241, 164, 244, 167, 247, 174, 254, UNK, UNK, UNK, UNK, 240, UNK, UNK, UNK
1453: };
1454: 
1455: CHAR
1456: yk8lc[] = {  /* Old KOI-8 Cyrillic to Latin/Cyrillic */
1457:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1458:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1459:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1460:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1461:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1462:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1463:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1464: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1465: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1466: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1467: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
1468: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
1469: 238, 208, 209, 230, 212, 213, 228, 211, 229, 216, 217, 218, 219, 220, 221, 222,
1470: 223, 239, 224, 225, 226, 227, 214, 210, 236, 235, 215, 232, 237, 233, 231, 234,
1471: 206, 176, 177, 198, 180, 181, 196, 179, 197, 184, 185, 186, 187, 188, 189, 190,
1472: 191, 207, 192, 193, 194, 195, 182, 178, 204, 203, 183, 200, 205, 201, 199, 127
1473: };
1474: 
1475: CHAR
1476: ylcsk[] = {  /* Latin/Cyrillic to Short KOI */
1477:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1478:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1479:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1480:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1481:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1482:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1483:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1484:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94, 127,
1485:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1486:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1487:  32, 101, UNK, UNK, UNK,  83,  73,  73,  74, UNK, UNK, UNK, 107,  45, 117, UNK,
1488:  97,  98, 119, 103, 100, 101, 118, 122, 105, 106, 107, 108, 109, 110, 111, 112,
1489: 114, 115, 116, 117, 102, 104,  99, 126, 123, 125,  39, 121, 120, 124,  96, 113,
1490:  97,  98, 119, 103, 100, 101, 118, 122, 105, 106, 107, 108, 109, 110, 111, 112,
1491: 114, 115, 116, 117, 102, 104,  99, 126, 123, 125,  39, 121, 120, 124,  96, 113,
1492: UNK, 101, UNK, UNK, UNK,  83,  73,  73,  74, UNK, UNK, UNK, 107, UNK, 117, UNK
1493: };
1494: 
1495: CHAR yskcy[] = {  /* Short KOI to Latin/Cyrillic */
1496:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1497:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1498:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1499:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1500:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1501:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1502: 206, 176, 177, 198, 180, 181, 196, 179, 197, 184, 185, 186, 187, 188, 189, 190,
1503: 191, 207, 192, 193, 194, 195, 182, 178, 204, 203, 183, 200, 205, 201, 199, 127
1504: };
1505: #endif /* CYRILLIC */
1506: 
1507: #ifdef LATIN2
1508: 
1509: /* Latin-2 tables */
1510: 
1511: CHAR
1512: yl252[] = {  /* Latin-2 to Code Page 852 */
1513:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1514:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1515:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1516:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1517:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1518:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1519:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1520: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1521: 174, 175, 176, 177, 178, 179, 180, 185, 186, 187, 188, 191, 192, 193, 194, 195,
1522: 196, 197, 200, 201, 202, 203, 204, 205, 206, 217, 218, 219, 220, 223, 240, 254,
1523: 255, 164, 244, 157, 207, 149, 151, 245, 249, 230, 184, 155, 141, 170, 166, 189,
1524: 248, 165, 242, 136, 239, 150, 152, 243, 247, 231, 173, 156, 171, 241, 167, 190,
1525: 232, 181, 182, 198, 142, 145, 143, 128, 172, 144, 168, 211, 183, 214, 215, 210,
1526: 209, 227, 213, 224, 226, 138, 153, 158, 252, 222, 233, 235, 154, 237, 221, 225,
1527: 234, 160, 131, 199, 132, 146, 134, 135, 159, 130, 169, 137, 216, 161, 140, 212,
1528: 208, 228, 229, 162, 147, 139, 148, 246, 253, 133, 163, 251, 129, 236, 238, 250
1529: };
1530: 
1531: CHAR
1532: y52l2[] = {  /* Code Page 852 to Latin-2 */
1533:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1534:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1535:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1536:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1537:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1538:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1539:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1540: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1541: 199, 252, 233, 226, 228, 249, 230, 231, 179, 235, 213, 245, 238, 172, 196, 198,
1542: 201, 197, 229, 244, 246, 165, 181, 166, 182, 214, 220, 171, 187, 163, 215, 232,
1543: 225, 237, 243, 250, 161, 177, 174, 190, 202, 234, 173, 188, 200, 186, 128, 129,
1544: 130, 131, 132, 133, 134, 193, 194, 204, 170, 135, 136, 137, 138, 175, 191, 139,
1545: 140, 141, 142, 143, 144, 145, 195, 227, 146, 147, 148, 149, 150, 151, 152, 164,
1546: 240, 208, 207, 203, 239, 210, 205, 206, 236, 153, 154, 155, 156, 222, 217, 157,
1547: 211, 223, 212, 209, 241, 242, 169, 185, 192, 218, 224, 219, 253, 221, 254, 180,
1548: 158, 189, 178, 183, 162, 167, 247, 184, 176, 168, 255, 251, 216, 248, 159, 160
1549: };
1550: 
1551: CHAR
1552: yl2l1[] = {  /* Latin-2 to Latin-1 */
1553:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1554:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1555:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1556:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1557:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1558:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1559:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1560: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1561: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1562: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1563: 160, 'A', UNK, 'L', 164, 'L', 'S', 167, 168, 'S', 'S', 'T', 'Z', 173, 'Z', 'Z',
1564: 176, 'a', UNK, 'l', 180, 'l', 's', UNK, 184, 's', 's', 't', 'z', UNK, 'z', 'z',
1565: 'R', 193, 194, 'A', 196, 'L', 'C', 199, 'C', 201, 'E', 203, 'E', 205, 'I', 'D',
1566: 208, 'N', 'N', 211, 212, 'O', 214, 215, 'R', 'U', 218, 'U', 220, 221, 'T', 's',
1567: 'r', 225, 226, 'a', 228, 'l', 'c', 231, 'c', 233, 'e', 235, 'e', 237, 'i', 'd',
1568: 240, 'n', 'n', 243, 244, 'o', 246, 247, 'r', 'u', 250, 'u', 252, 253, 't', '.'
1569: };
1570: 
1571: CHAR
1572: yl1l2[] = {  /* Latin-1 to Latin-2 */
1573:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1574:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1575:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1576:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1577:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1578:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1579:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1580: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1581: 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1582: 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1583: 160, 'A', UNK, 'L', 164, UNK, UNK, 167, 168, 'C', 'a', '<', '>', 173, 'R', UNK,
1584: 176, UNK, UNK, UNK, 180, UNK, UNK, UNK, 184, UNK, 'o', '>', UNK, UNK, UNK, UNK,
1585: 'A', 193, 194, 'A', 196, 'A', 'A', 199, 'E', 201, 'E', 203, 'I', 205, 'I', 'I',
1586: 208, 'N', 'O', 211, 212, 'O', 214, 215, 'O', 'U', 218, 'U', 220, 221, UNK, 223,
1587: 'a', 225, 226, 'a', 228, 'a', 'a', 231, 'e', 233, 'e', 235, 'i', 237, 'i', 'i',
1588: 240, 'n', 'o', 243, 244, 'o', 246, 247, 'o', 'u', 250, 'u', 252, 253, UNK, 'y'
1589: };
1590: 
1591: CHAR
1592: yl2as[] = {  /* Latin-2 to ASCII */
1593:   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
1594:  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
1595:  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1596:  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1597:  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1598:  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1599:  96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1600: 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1601: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
1602: UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK,
1603:  32, 'A', UNK, 'L', UNK, 'L', 'S', UNK,  34, 'S', 'S', 'T', 'Z', '-', 'Z', 'Z',
1604: UNK, 'a', UNK, 'l',  39, 'l', 's', UNK,  44, 's', 's', 't', 'z', UNK, 'z', 'z',
1605: 'R', 'A', 'A', 'A', 'A', 'L', 'C', 'C', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'D',
1606: 'D', 'N', 'N', 'O', 'O', 'O', 'O', 'x', 'R', 'U', 'U', 'U', 'U', 'Y', 'T', 's',
1607: 'r', 'a', 'a', 'a', 'a', 'l', 'c', 'c', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'd',
1608: 'd', 'n', 'n', 'o', 'o', 'o', 'o', '/', 'r', 'u', 'u', 'u', 'u', 'y', 't', '.'
1609: };
1610: #endif /* LATIN2 */
1611: 
1612: /* Translation functions ... */
1613: 
1614: CHAR                /* The identity translation function.  */
1615: #ifdef CK_ANSIC
1616: ident(CHAR c)               /* (no longer used) */
1617: #else
1618: ident(c) CHAR c;
1619: #endif /* CK_ANSIC */
1620: { /* ident */
1621:     return(c);              /* Instead, enter NULL in the  */
1622: }                   /* table of functions to avoid */
1623:                     /* needless function calls.    */
1624: CHAR
1625: #ifdef CK_ANSIC
1626: xl1as(CHAR c)
1627: #else
1628: xl1as(c) CHAR c;
1629: #endif /* CK_ANSIC */
1630: { /* xl1as */           /* Latin-1 to US ASCII... */
1631:     switch(langs[language].id) {
1632: 
1633:       case L_DUTCH:
1634:     if (c == 255) {         /* Dutch umlaut-y */
1635:         zmstuff('j');       /* becomes ij */
1636:         return('i');
1637:     } else return(yl1as[c]);    /* all others by the book */
1638: 
1639:       case L_GERMAN:
1640:     switch (c) {            /* German, special rules. */
1641:       case 196:         /* umlaut-A -> Ae */
1642:         zmstuff('e');
1643:         return('A');
1644:       case 214:         /* umlaut-O -> Oe */
1645:         zmstuff('e');
1646:         return('O');
1647:       case 220:         /* umlaut-U -> Ue */
1648:         zmstuff('e');
1649:         return('U');
1650:       case 228:         /* umlaut-a -> ae */
1651:         zmstuff('e');
1652:         return('a');
1653:       case 246:         /* umlaut-o -> oe */
1654:         zmstuff('e');
1655:         return('o');
1656:       case 252:         /* umlaut-u -> ue */
1657:         zmstuff('e');
1658:         return('u');
1659:       case 223:         /* ess-zet -> ss */
1660:         zmstuff('s');
1661:         return('s');
1662:       default: return(yl1as[c]);    /* all others by the book */
1663:     }
1664:       case L_DANISH:
1665:       case L_FINNISH:
1666:       case L_NORWEGIAN:
1667:       case L_SWEDISH:
1668:     switch (c) {            /* Scandanavian languages. */
1669:       case 196:         /* umlaut-A -> Ae */
1670:           case 198:         /* AE ligature also -> Ae */
1671:         zmstuff('e');
1672:         return('A');
1673:       case 214:         /* umlaut-O -> Oe */
1674:       case 216:         /* O-slash -> Oe */
1675:         zmstuff('e');
1676:         return('O');
1677:       case 220:         /* umlaut-U -> Ue */
1678:       /*  return('Y'); replaced by "Ue" by popular demand. */
1679:           /*  Y for Umlaut-U is only used in German names. */
1680:         zmstuff('e');
1681:         return('U');
1682:       case 228:         /* umlaut-a -> ae */
1683:           case 230:         /* ditto for ae ligature */
1684:         zmstuff('e');
1685:         return('a');
1686:       case 246:         /* umlaut-o -> oe */
1687:       case 248:         /* o-slash -> oe */
1688:         zmstuff('e');
1689:         return('o');
1690:       case 252:         /* umlaut-u -> ue */
1691:       /*  return('y'); replaced by "ue" by popular demand. */
1692:         zmstuff('e');
1693:         return('u');
1694:       case 197:         /* A-ring -> Aa */
1695:         zmstuff('a');
1696:         return('A');
1697:           case 229:         /* a-ring -> aa */
1698:         zmstuff('a');
1699:         return('a');
1700:       default: return(yl1as[c]);    /* All others by the book */
1701:     }
1702:       case L_ICELANDIC:         /* Icelandic. */
1703:     switch (c) {
1704:       case 198:         /* uppercase AE -> AE */
1705:         zmstuff('e');
1706:         return('A');
1707:       case 208:         /* uppercase Eth -> D */
1708:         return('D');
1709:       case 214:         /* uppercase O-diaeresis -> Oe */
1710:         zmstuff('e');
1711:         return('O');
1712:       case 222:         /* uppercase Thorn -> Th */
1713:         zmstuff('h');
1714:         return('T');
1715:       case 230:         /* lowercase ae -> ae */
1716:         zmstuff('e');
1717:         return('a');
1718:       case 240:         /* lowercase Eth -> d */
1719:         return('d');
1720:       case 246:         /* lowercase O-diaeresis -> oe */
1721:         zmstuff('e');
1722:         return('o');
1723:       case 254:         /* lowercase Thorn -> th */
1724:         zmstuff('h');
1725:         return('t');
1726:       default: return(yl1as[c]);    /* All others by the book */
1727:     }
1728:       default:
1729:     return(yl1as[c]);       /* None of the above, by the table. */
1730:     }
1731: }
1732: 
1733: CHAR                    /* Latin-1 to German */
1734: #ifdef CK_ANSIC
1735: xl1ge(CHAR c)
1736: #else
1737: xl1ge(c) CHAR c;
1738: #endif /* CK_ANSIC */
1739: { /* xl1ge */
1740:     return(yl1ge[c]);
1741: }
1742: 
1743: CHAR                    /* German to Latin-1 */
1744: #ifdef CK_ANSIC
1745: xgel1(CHAR c)
1746: #else
1747: xgel1(c) CHAR c;
1748: #endif /* CK_ANSIC */
1749: { /* xgel1 */
1750:     return(ygel1[c]);
1751: }
1752: 
1753: CHAR
1754: #ifdef CK_ANSIC
1755: xgeas(CHAR c)
1756: #else
1757: xgeas(c) CHAR c;
1758: #endif /* CK_ANSIC */
1759: { /* xgeas */           /* German ISO 646 to ASCII */
1760:     switch (c) {
1761:       case 91:              /* umlaut-A -> Ae */
1762:     zmstuff('e');
1763:     return('A');
1764:       case 92:              /* umlaut-O -> Oe */
1765:     zmstuff('e');
1766:     return('O');
1767:       case 93:              /* umlaut-U -> Ue */
1768:     zmstuff('e');
1769:     return('U');
1770:       case 123:             /* umlaut-a -> ae */
1771:     zmstuff('e');
1772:     return('a');
1773:       case 124:             /* umlaut-o -> oe */
1774:     zmstuff('e');
1775:     return('o');
1776:       case 125:             /* umlaut-u -> ue */
1777:     zmstuff('e');
1778:     return('u');
1779:       case 126:             /* ess-zet -> ss */
1780:     zmstuff('s');
1781:     return('s');
1782:       default:  return(c);      /* all others stay the same */
1783:     }
1784: }
1785: 
1786: CHAR
1787: #ifdef CK_ANSIC
1788: xduas(CHAR c)
1789: #else
1790: xduas(c) CHAR c;
1791: #endif /* CK_ANSIC */
1792: { /* xduas */           /* Dutch ISO 646 to US ASCII */
1793:     switch (c) {
1794:       case 64:  return(UNK);        /* 3/4 */
1795:       case 91:              /* y-diaeresis */
1796:     zmstuff('j');
1797:     return('i');
1798:       case 92:  return(UNK);        /* 1/2 */
1799:       case 93:  return(124);        /* vertical bar */
1800:       case 123: return(34);     /* diaeresis */
1801:       case 124: return(UNK);        /* Florin */
1802:       case 125: return(UNK);        /* 1/4 */
1803:       case 126: return(39);     /* Apostrophe */
1804:       default:  return(c);
1805:     }
1806: }
1807: 
1808: CHAR
1809: #ifdef CK_ANSIC
1810: xfias(CHAR c)
1811: #else
1812: xfias(c) CHAR c;
1813: #endif /* CK_ANSIC */
1814: { /* xfias */           /* Finnish ISO 646 to US ASCII */
1815:     switch (c) {
1816:       case 91:              /* A-diaeresis */
1817:     zmstuff('e');
1818:     return('A');
1819:       case 92:              /* O-diaeresis */
1820:     zmstuff('e');
1821:     return('O');
1822:       case 93:              /* A-ring */
1823:     zmstuff('a');
1824:     return('A');
1825:       case 94:              /* U-diaeresis */
1826:     /* return('Y'); */
1827:     zmstuff('e');
1828:     return('U');
1829:       case 96:              /* e-acute */
1830:     return('e');
1831:       case 123:             /* a-diaeresis */
1832:     zmstuff('e');
1833:     return('a');
1834:       case 124:             /* o-diaeresis */
1835:     zmstuff('e');
1836:     return('o');
1837:       case 125:             /* a-ring */
1838:     zmstuff('a');
1839:     return('a');
1840:       case 126:             /* u-diaeresis */
1841:     /* return('y'); */
1842:     zmstuff('e');
1843:     return('U');
1844:       default:
1845:     return(c);
1846:     }
1847: }
1848: 
1849: CHAR
1850: #ifdef CK_ANSIC
1851: xfras(CHAR c)
1852: #else
1853: xfras(c) CHAR c;
1854: #endif /* CK_ANSIC */
1855: { /* xfras */           /* French ISO 646 to US ASCII */
1856:     switch (c) {
1857:       case 64:  return(97);     /* a grave */
1858:       case 91:  return(UNK);        /* degree sign */
1859:       case 92:  return(99);     /* c cedilla */
1860:       case 93:  return(UNK);        /* paragraph sign */
1861:       case 123: return(101);        /* e acute */
1862:       case 124: return(117);        /* u grave */
1863:       case 125: return(101);        /* e grave */
1864:       case 126: return(34);     /* diaeresis */
1865:       default:  return(c);
1866:     }
1867: }
1868: 
1869: CHAR
1870: #ifdef CK_ANSIC
1871: xfcas(CHAR c)
1872: #else
1873: xfcas(c) CHAR c;
1874: #endif /* CK_ANSIC */
1875: { /* xfcas */           /* French Canadian ISO 646 to ASCII */
1876:     switch (c) {
1877:       case 64:  return('a');        /* a grave */
1878:       case 91:  return('a');        /* a circumflex */
1879:       case 92:  return('c');        /* c cedilla */
1880:       case 93:  return('e');        /* e circumflex */
1881:       case 94:  return('i');        /* i circumflex */
1882:       case 96:  return('o');        /* o circumflex */
1883:       case 123: return('e');        /* e acute */
1884:       case 124: return('u');        /* u grave */
1885:       case 125: return('e');        /* e grave */
1886:       case 126: return('u');        /* u circumflex */
1887:       default:  return(c);
1888:     }
1889: }
1890: 
1891: CHAR
1892: #ifdef CK_ANSIC
1893: xitas(CHAR c)
1894: #else
1895: xitas(c) CHAR c;
1896: #endif /* CK_ANSIC */
1897: { /* xitas */           /* Italian ISO 646 to ASCII */
1898:     switch (c) {
1899:       case 91:  return(UNK);        /* degree */
1900:       case 92:  return('c');        /* c cedilla */
1901:       case 93:  return('e');        /* e acute */
1902:       case 96:  return('u');        /* u grave */
1903:       case 123: return('a');        /* a grave */
1904:       case 124: return('o');        /* o grave */
1905:       case 125: return('e');        /* e grave */
1906:       case 126: return('i');        /* i grave */
1907:       default:  return(c);
1908:     }
1909: }
1910: 
1911: CHAR
1912: #ifdef CK_ANSIC
1913: xneas(CHAR c)
1914: #else
1915: xneas(c) CHAR c;
1916: #endif /* CK_ANSIC */
1917: { /* xneas */           /* NeXT to ASCII */
1918:     if (langs[language].id == L_FRENCH) { /* If SET LANGUAGE FRENCH */
1919:     if (c == 234) {         /* handle OE digraph. */
1920:         zmstuff('E');
1921:         return('O');
1922:     } else if (c == 250) {      /* Also lowercase oe. */
1923:         zmstuff('e');
1924:         return('o');
1925:     }
1926:     }
1927:     c = xnel1(c);           /* Convert to Latin-1 */
1928:     return(yl1as[c]);           /* Convert Latin-1 to ASCII */
1929: }
1930: 
1931: CHAR
1932: #ifdef CK_ANSIC
1933: xnoas(CHAR c)
1934: #else
1935: xnoas(c) CHAR c;
1936: #endif /* CK_ANSIC */
1937: { /* xnoas */           /* Norge/Danish ISO 646 to ASCII */
1938:     switch (c) {
1939:       case 91:
1940:     zmstuff('E');           /* AE digraph */
1941:     return('A');
1942:       case 92: return('O');     /* O slash */
1943:       case 93:              /* A ring */
1944:     zmstuff('a');
1945:     return('A');
1946:       case 123:             /* ae digraph */
1947:     zmstuff('e');
1948:     return('a');
1949:       case 124: return('o');        /* o slash */
1950:       case 125:             /* a ring */
1951:     zmstuff('a');
1952:     return('a');
1953:       default:  return(c);
1954:     }
1955: }
1956: 
1957: CHAR
1958: #ifdef CK_ANSIC
1959: xpoas(CHAR c)
1960: #else
1961: xpoas(c) CHAR c;
1962: #endif /* CK_ANSIC */
1963: { /* xpoas */           /* Portuguese ISO 646 to ASCII */
1964:     switch (c) {
1965:       case 91:  return('A');        /* A tilde */
1966:       case 92:  return('C');        /* C cedilla */
1967:       case 93:  return('O');        /* O tilde */
1968:       case 123: return('a');        /* a tilde */
1969:       case 124: return('c');        /* c cedilla */
1970:       case 125: return('o');        /* o tilde */
1971:       default:  return(c);
1972:     }
1973: }
1974: 
1975: CHAR
1976: #ifdef CK_ANSIC
1977: xspas(CHAR c)
1978: #else
1979: xspas(c) CHAR c;
1980: #endif /* CK_ANSIC */
1981: { /* xspas */           /* Spanish ISO 646 to ASCII */
1982:     switch (c) {
1983:       case 91:  return(33);     /* Inverted exclamation */
1984:       case 92:  return('N');        /* N tilde */
1985:       case 93:  return(63);     /* Inverted question mark */
1986:       case 123: return(UNK);        /* degree */
1987:       case 124: return('n');        /* n tilde */
1988:       case 125: return('c');        /* c cedilla */
1989:       default:  return(c);
1990:     }
1991: }
1992: 
1993: CHAR
1994: #ifdef CK_ANSIC
1995: xswas(CHAR c)
1996: #else
1997: xswas(c) CHAR c;
1998: #endif /* CK_ANSIC */
1999: { /* xswas */           /* Swedish ISO 646 to ASCII */
2000:     switch (c) {
2001:       case 64:  return('E');        /* E acute */
2002:       case 91:              /* A diaeresis */
2003:     zmstuff('e');
2004:     return('A');
2005:       case 92:              /* O diaeresis */
2006:     zmstuff('e');
2007:     return('O');
2008:       case 93:              /* A ring */
2009:     zmstuff('a');
2010:     return('A');
2011:       case 94:              /* U diaeresis */
2012:     /* return('Y'); */
2013:     zmstuff('e');
2014:     return('U');
2015:       case 96:  return('e');        /* e acute */
2016:       case 123:             /* a diaeresis */
2017:     zmstuff('e');
2018:     return('a');
2019:       case 124:             /* o diaeresis */
2020:     zmstuff('e');
2021:     return('o');
2022:       case 125:             /* a ring */
2023:     zmstuff('a');
2024:     return('a');
2025:       case 126:             /* u diaeresis */
2026:     /* return('y'); */
2027:     zmstuff('e');
2028:     return('u');
2029:       default:  return(c);
2030:     }
2031: }
2032: 
2033: CHAR
2034: #ifdef CK_ANSIC
2035: xchas(CHAR c)
2036: #else
2037: xchas(c) CHAR c;
2038: #endif /* CK_ANSIC */
2039: { /* xchas */           /* Swiss ISO 646 to ASCII */
2040:     switch (c) {
2041:       case 35:  return('u');        /* u grave */
2042:       case 64:  return('a');        /* a grave */
2043:       case 91:  return('e');        /* e acute */
2044:       case 92:  return('c');        /* c cedilla */
2045:       case 93:  return('e');        /* e circumflex */
2046:       case 94:  return('i');        /* i circumflex */
2047:       case 95:  return('e');        /* e grave */
2048:       case 96:  return('o');        /* o circumflex */
2049:       case 123:             /* a diaeresis */
2050:     zmstuff('e');
2051:     return('a');
2052:       case 124:             /* o diaeresis */
2053:     zmstuff('e');
2054:     return('o');
2055:       case 125:             /* u diaeresis */
2056:     zmstuff('e');
2057:     return('u');
2058:       case 126: return('u');        /* u circumflex */
2059:       default:  return(c);
2060:     }
2061: }
2062: 
2063: CHAR
2064: #ifdef CK_ANSIC
2065: xhuas(CHAR c)
2066: #else
2067: xhuas(c) CHAR c;
2068: #endif /* CK_ANSIC */
2069: { /* xhuas */           /* Hungarian ISO 646 to ASCII */
2070:     switch (c) {
2071:       case 64:  return('A');        /* A acute */
2072:       case 91:  return('E');        /* E acute */
2073:       case 92:  return('O');        /* O diaeresis */
2074:       case 93:  return('U');        /* U diaeresis */
2075:       case 96:  return('a');        /* a acute */
2076:       case 123: return('e');        /* e acute */
2077:       case 124: return('o');        /* o acute */
2078:       case 125: return('u');        /* u acute */
2079:       case 126: return(34);     /* double acute accent */
2080:       default:  return(c);
2081:     }
2082: }
2083: 
2084: CHAR
2085: #ifdef CK_ANSIC
2086: xdmas(CHAR c)
2087: #else
2088: xdmas(c) CHAR c;
2089: #endif /* CK_ANSIC */
2090: { /* xdmas */           /* DEC MCS to ASCII */
2091:     if (langs[language].id == L_FRENCH) { /* If SET LANGUAGE FRENCH */
2092:     if (c == 215) {         /* handle OE digraph. */
2093:         zmstuff('E');
2094:         return('O');
2095:     } else if (c == 247) {      /* Also lowercase oe. */
2096:         zmstuff('e');
2097:         return('o');
2098:     }
2099:     }
2100:     return(yl1as[c]);           /* Otherwise treat like Latin-1 */
2101: }
2102: 
2103: CHAR
2104: #ifdef CK_ANSIC
2105: xdgas(CHAR c)
2106: #else
2107: xdgas(c) CHAR c;
2108: #endif /* CK_ANSIC */
2109: { /*  xdgas */          /* Data General to ASCII */
2110:     switch(c) {
2111:       case 180: return('f');        /* Florin */
2112:       case 183: return('<');        /* Less-equal */
2113:       case 184: return('>');        /* Greater-equal */
2114:       case 186: return(96);     /* Grave accent */
2115:       case 191: return('^');        /* Uparrow */
2116:       case 215:
2117:     if (langs[language].id == L_FRENCH) { /* OE digraph */
2118:         zmstuff('E');
2119:         return('O');
2120:     } else return('O');
2121:       case 247:
2122:     if (langs[language].id == L_FRENCH) { /* oe digraph */
2123:         zmstuff('e');
2124:         return('o');
2125:     } else return('o');
2126:       case 175: case 179: case 220: case 222:
2127:       case 223: case 254: case 255:
2128:     return(UNK);
2129:       default:              /* The rest, convert to Latin-1 */
2130:     return(yl1as[ydgl1[c]]);    /* and from there to ASCII */
2131:     }
2132: }
2133: 
2134: CHAR
2135: #ifdef CK_ANSIC
2136: xukl1(CHAR c)
2137: #else
2138: xukl1(c) CHAR c;
2139: #endif /* CK_ANSIC */
2140: { /* xukl1 */           /* UK ASCII to Latin-1 */
2141:     if (c == 35)
2142:       return(163);
2143:     else return(c);
2144: }
2145: 
2146: CHAR
2147: #ifdef CK_ANSIC
2148: xl1uk(CHAR c)
2149: #else
2150: xl1uk(c) CHAR c;
2151: #endif /* CK_ANSIC */
2152: { /* xl1uk */           /* Latin-1 to UK ASCII */
2153:     if (c == 163)
2154:       return(35);
2155:     else return(yl1as[c]);
2156: }
2157: 
2158: CHAR                    /* Latin-1 to French ISO 646 */
2159: #ifdef CK_ANSIC
2160: xl1fr(CHAR c)
2161: #else
2162: xl1fr(c) CHAR c;
2163: #endif /* CK_ANSIC */
2164: { /* xl1fr */
2165:     return(yl1fr[c]);
2166: }
2167: 
2168: 
2169: CHAR                    /* French ASCII to Latin-1 */
2170: #ifdef CK_ANSIC
2171: xfrl1(CHAR c)
2172: #else
2173: xfrl1(c) CHAR c;
2174: #endif /* CK_ANSIC */
2175: { /* xfrl1 */
2176:     return(yfrl1[c]);
2177: }
2178: 
2179: CHAR                    /* Latin-1 to Dutch ASCII */
2180: #ifdef CK_ANSIC
2181: xl1du(CHAR c)
2182: #else
2183: xl1du(c) CHAR c;
2184: #endif /* CK_ANSIC */
2185: { /* xl1du */
2186:     return(yl1du[c]);
2187: }
2188: 
2189: CHAR
2190: #ifdef CK_ANSIC
2191: xdul1(CHAR c)
2192: #else
2193: xdul1(c) CHAR c;
2194: #endif /* CK_ANSIC */
2195: { /* xdul1 */           /* Dutch ISO 646 to Latin-1 */
2196:     return(ydul1[c]);
2197: }
2198: 
2199: CHAR
2200: #ifdef CK_ANSIC
2201: xfil1(CHAR c)
2202: #else
2203: xfil1(c) CHAR c;
2204: #endif /* CK_ANSIC */
2205: { /* xfil1 */           /* Finnish ISO 646 to Latin-1 */
2206:     return(yfil1[c]);
2207: }
2208: 
2209: CHAR
2210: #ifdef CK_ANSIC
2211: xl1fi(CHAR c)
2212: #else
2213: xl1fi(c) CHAR c;
2214: #endif /* CK_ANSIC */
2215: { /* xl1fi */           /* Latin-1 to Finnish ISO 646 */
2216:     return(yl1fi[c]);
2217: }
2218: 
2219: CHAR
2220: #ifdef CK_ANSIC
2221: xfcl1(CHAR c)
2222: #else
2223: xfcl1(c) CHAR c;
2224: #endif /* CK_ANSIC */
2225: { /* xfcl1 */           /* French Canadian ISO646 to Latin-1 */
2226:     return(yfcl1[c]);
2227: }
2228: 
2229: CHAR
2230: #ifdef CK_ANSIC
2231: xl1fc(CHAR c)
2232: #else
2233: xl1fc(c) CHAR c;
2234: #endif /* CK_ANSIC */
2235: { /* xl1fc */           /* Latin-1 to French Canadian ISO646 */
2236:     return(yl1fc[c]);
2237: }
2238: 
2239: CHAR
2240: #ifdef CK_ANSIC
2241: xitl1(CHAR c)
2242: #else
2243: xitl1(c) CHAR c;
2244: #endif /* CK_ANSIC */
2245: { /* xitl1 */           /* Italian ISO 646 to Latin-1 */
2246:     return(yitl1[c]);
2247: }
2248: 
2249: CHAR
2250: #ifdef CK_ANSIC
2251: xl1it(CHAR c)
2252: #else
2253: xl1it(c) CHAR c;
2254: #endif /* CK_ANSIC */
2255: { /* xl1it */           /* Latin-1 to Italian ISO 646 */
2256:     return(yl1it[c]);
2257: }
2258: 
2259: CHAR
2260: #ifdef CK_ANSIC
2261: xnel1(CHAR c)
2262: #else
2263: xnel1(c) CHAR c;
2264: #endif /* CK_ANSIC */
2265: { /* xnel1 */        /* NeXT to Latin-1 */
2266:     if (langs[language].id == L_FRENCH) { /* If SET LANGUAGE FRENCH */
2267:     if (c == 234) {         /* handle OE digraph. */
2268:         zmstuff('E');
2269:         return('O');
2270:     } else if (c == 250) {      /* Also lowercase oe. */
2271:         zmstuff('e');
2272:         return('o');
2273:     }
2274:     }
2275:     return(ynel1[c]);
2276: }
2277: 
2278: CHAR
2279: #ifdef CK_ANSIC
2280: xl1ne(CHAR c)
2281: #else
2282: xl1ne(c) CHAR c;
2283: #endif /* CK_ANSIC */
2284: { /* xl1ne */        /* Latin-1 to NeXT */
2285:     return(yl1ne[c]);
2286: }
2287: 
2288: CHAR
2289: #ifdef CK_ANSIC
2290: xnol1(CHAR c)
2291: #else
2292: xnol1(c) CHAR c;
2293: #endif /* CK_ANSIC */
2294: { /* xnol1 */        /* Norwegian and Danish ISO 646 to Latin-1 */
2295:     return(ynol1[c]);
2296: }
2297: 
2298: CHAR
2299: #ifdef CK_ANSIC
2300: xl1no(CHAR c)
2301: #else
2302: xl1no(c) CHAR c;
2303: #endif /* CK_ANSIC */
2304: { /* xl1no */        /* Latin-1 to Norwegian and Danish ISO 646 */
2305:     return(yl1no[c]);
2306: }
2307: 
2308: CHAR
2309: #ifdef CK_ANSIC
2310: xpol1(CHAR c)
2311: #else
2312: xpol1(c) CHAR c;
2313: #endif /* CK_ANSIC */
2314: { /* xpol1 */           /* Portuguese ISO 646 to Latin-1 */
2315:     return(ypol1[c]);
2316: }
2317: 
2318: CHAR
2319: #ifdef CK_ANSIC
2320: xl1po(CHAR c)
2321: #else
2322: xl1po(c) CHAR c;
2323: #endif /* CK_ANSIC */
2324: { /* xl1po */           /* Latin-1 to Portuguese ISO 646 */
2325:     return(yl1po[c]);
2326: }
2327: 
2328: CHAR
2329: #ifdef CK_ANSIC
2330: xspl1(CHAR c)
2331: #else
2332: xspl1(c) CHAR c;
2333: #endif /* CK_ANSIC */
2334: { /* xspl1 */           /* Spanish ISO 646 to Latin-1 */
2335:     return(yspl1[c]);
2336: }
2337: 
2338: CHAR
2339: #ifdef CK_ANSIC
2340: xl1sp(CHAR c)
2341: #else
2342: xl1sp(c) CHAR c;
2343: #endif /* CK_ANSIC */
2344: { /* xl1sp */           /* Latin-1 to Spanish ISO 646 */
2345:     return(yl1sp[c]);
2346: }
2347: 
2348: CHAR
2349: #ifdef CK_ANSIC
2350: xswl1(CHAR c)
2351: #else
2352: xswl1(c) CHAR c;
2353: #endif /* CK_ANSIC */
2354: { /* xswl1 */           /* Swedish ISO 646 to Latin-1 */
2355:     return(yswl1[c]);
2356: }
2357: 
2358: CHAR
2359: #ifdef CK_ANSIC
2360: xl1sw(CHAR c)
2361: #else
2362: xl1sw(c) CHAR c;
2363: #endif /* CK_ANSIC */
2364: { /* xl1sw */           /* Latin-1 to Swedish ISO 646 */
2365:     return(yl1sw[c]);
2366: }
2367: 
2368: CHAR
2369: #ifdef CK_ANSIC
2370: xchl1(CHAR c)
2371: #else
2372: xchl1(c) CHAR c;
2373: #endif /* CK_ANSIC */
2374: { /* xchl1 */           /* Swiss ISO 646 to Latin-1 */
2375:     return(ychl1[c]);
2376: }
2377: 
2378: CHAR
2379: #ifdef CK_ANSIC
2380: xl1ch(CHAR c)
2381: #else
2382: xl1ch(c) CHAR c;
2383: #endif /* CK_ANSIC */
2384: { /* xl1ch */           /* Latin-1 to Swiss ISO 646 */
2385:     return(yl1ch[c]);
2386: }
2387: 
2388: CHAR
2389: #ifdef CK_ANSIC
2390: xhul1(CHAR c)
2391: #else
2392: xhul1(c) CHAR c;
2393: #endif /* CK_ANSIC */
2394: { /* xhul1 */           /* Hungarian ISO 646 to Latin-1 */
2395:     return(yhul1[c]);
2396: }
2397: 
2398: CHAR
2399: #ifdef CK_ANSIC
2400: xl1hu(CHAR c)
2401: #else
2402: xl1hu(c) CHAR c;
2403: #endif /* CK_ANSIC */
2404: { /* xl1hu */           /* Latin-1 to Hungarian ISO 646 */
2405:     return(yl1hu[c]);
2406: }
2407: 
2408: CHAR
2409: #ifdef CK_ANSIC
2410: xl1dm(CHAR c)
2411: #else
2412: xl1dm(c) CHAR c;
2413: #endif /* CK_ANSIC */
2414: { /* xl1dm */ /* Latin-1 to DEC Multinational Character Set (MCS) */
2415:     return(yl1dm[c]);
2416: }
2417: 
2418: CHAR
2419: #ifdef CK_ANSIC
2420: xl1dg(CHAR c)
2421: #else
2422: xl1dg(c) CHAR c;
2423: #endif /* CK_ANSIC */
2424: { /* xl1dg */ /* Latin-1 to DG International Character Set (MCS) */
2425:     return(yl1dg[c]);
2426: }
2427: 
2428: CHAR
2429: #ifdef CK_ANSIC
2430: xdml1(CHAR c)
2431: #else
2432: xdml1(c) CHAR c;
2433: #endif /* CK_ANSIC */
2434: { /* xdml1 */ /* DEC Multinational Character Set (MCS) to Latin-1 */
2435:     if (langs[language].id == L_FRENCH) { /* If SET LANGUAGE FRENCH */
2436:     if (c == 215) {         /* handle OE digraph. */
2437:         zmstuff('E');
2438:         return('O');
2439:     } else if (c == 247) {      /* Also lowercase oe. */
2440:         zmstuff('e');
2441:         return('o');
2442:     }
2443:     }
2444:     return(ydml1[c]);
2445: }
2446: 
2447: CHAR
2448: #ifdef CK_ANSIC
2449: xdgl1(CHAR c)
2450: #else
2451: xdgl1(c) CHAR c;
2452: #endif /* CK_ANSIC */
2453: { /* xdgl1 */ /* DG International Character Set (MCS) to Latin-1 */
2454:     if (langs[language].id == L_FRENCH) { /* If SET LANGUAGE FRENCH */
2455:     if (c == 215) {         /* handle OE digraph. */
2456:         zmstuff('E');
2457:         return('O');
2458:     } else if (c == 247) {      /* Also lowercase oe. */
2459:         zmstuff('e');
2460:         return('o');
2461:     }
2462:     }
2463:     return(ydgl1[c]);
2464: }
2465: 
2466: /* Translation functions for receiving files and translating them into ASCII */
2467: 
2468: CHAR
2469: #ifdef CK_ANSIC
2470: zl1as(CHAR c)
2471: #else
2472: zl1as(c) CHAR c;
2473: #endif /* CK_ANSIC */
2474: { /* zl1as */
2475:     switch(langs[language].id) {
2476: 
2477:       case L_DUTCH:
2478:     if (c == 255) {         /* Dutch umlaut-y */
2479:         zdstuff('j');       /* becomes ij */
2480:         return('i');
2481:     } else return(yl1as[c]);    /* all others by the book */
2482: 
2483:       case L_GERMAN:
2484:     switch (c) {            /* German, special rules. */
2485:       case 196:         /* umlaut-A -> Ae */
2486:         zdstuff('e');
2487:         return('A');
2488:       case 214:         /* umlaut-O -> Oe */
2489:         zdstuff('e');
2490:         return('O');
2491:       case 220:         /* umlaut-U -> Ue */
2492:         zdstuff('e');
2493:         return('U');
2494:       case 228:         /* umlaut-a -> ae */
2495:         zdstuff('e');
2496:         return('a');
2497:       case 246:         /* umlaut-o -> oe */
2498:         zdstuff('e');
2499:         return('o');
2500:       case 252:         /* umlaut-u -> ue */
2501:         zdstuff('e');
2502:         return('u');
2503:       case 223:         /* ess-zet -> ss */
2504:         zdstuff('s');
2505:         return('s');
2506:       default: return(yl1as[c]);    /* all others by the book */
2507:     }
2508:       case L_DANISH:
2509:       case L_FINNISH:
2510:       case L_NORWEGIAN:
2511:       case L_SWEDISH:
2512:     switch (c) {            /* Scandanavian languages. */
2513:       case 196:         /* umlaut-A -> Ae */
2514:         zdstuff('e');
2515:         return('A');
2516:       case 214:         /* umlaut-O -> Oe */
2517:       case 216:         /* O-slash -> Oe */
2518:         zdstuff('e');
2519:         return('O');
2520:       case 220:         /* umlaut-U -> Y */
2521:         /* return('Y'); */
2522:         zdstuff('e');
2523:         return('U');
2524:       case 228:         /* umlaut-a -> ae */
2525:         zdstuff('e');
2526:         return('a');
2527:       case 246:         /* umlaut-o -> oe */
2528:       case 248:         /* o-slash -> oe */
2529:         zdstuff('e');
2530:         return('o');
2531:       case 252:         /* umlaut-u -> y */
2532:         /* return('y'); */
2533:         zdstuff('e');
2534:         return('u');
2535:       case 197:         /* A-ring -> Aa */
2536:         zdstuff('a');
2537:         return('A');
2538:           case 229:         /* a-ring -> aa */
2539:         zdstuff('a');
2540:         return('a');
2541:       default: return(yl1as[c]);    /* All others by the book */
2542:     }
2543:       default:
2544:     return(yl1as[c]);       /* Not German, by the table. */
2545:     }
2546: }
2547: 
2548: CHAR                    /* IBM CP437 to Latin-1 */
2549: #ifdef CK_ANSIC
2550: x43l1(CHAR c)
2551: #else
2552: x43l1(c) CHAR c;
2553: #endif /* CK_ANSIC */
2554: { /* x43l1 */
2555:     return(y43l1[c]);
2556: }
2557: 
2558: CHAR                    /* IBM CP850 to Latin-1 */
2559: #ifdef CK_ANSIC
2560: x85l1(CHAR c)
2561: #else
2562: x85l1(c) CHAR c;
2563: #endif /* CK_ANSIC */
2564: { /* x85l1 */
2565:     return(y85l1[c]);
2566: }
2567: 
2568: CHAR                    /* Latin-1 to IBM CP437 */
2569: #ifdef CK_ANSIC
2570: xl143(CHAR c)
2571: #else
2572: xl143(c) CHAR c;
2573: #endif /* CK_ANSIC */
2574: { /* xl143 */
2575:     return(yl143[c]);
2576: }
2577: 
2578: CHAR                    /* Latin-1 to CP850 */
2579: #ifdef CK_ANSIC
2580: xl185(CHAR c)
2581: #else
2582: xl185(c) CHAR c;
2583: #endif /* CK_ANSIC */
2584: { /* xl185 */
2585:     return(yl185[c]);
2586: }
2587: 
2588: CHAR
2589: #ifdef CK_ANSIC
2590: x43as(CHAR c)
2591: #else
2592: x43as(c) CHAR c;
2593: #endif /* CK_ANSIC */
2594: { /* x43as */               /* CP437 to ASCII */
2595:     c = y43l1[c];           /* Translate to Latin-1 */
2596:     return(xl143(c));           /* and from Latin-1 to ASCII. */
2597: }
2598: 
2599: CHAR
2600: #ifdef CK_ANSIC
2601: x85as(CHAR c)
2602: #else
2603: x85as(c) CHAR c;
2604: #endif /* CK_ANSIC */
2605: { /* x85as */               /* CP850 to ASCII */
2606:     c = y85l1[c];           /* Translate to Latin-1 */
2607:     return(xl1as(c));           /* and from Latin-1 to ASCII. */
2608: }
2609: 
2610: CHAR                    /* Macintosh Latin to Latin-1 */
2611: #ifdef CK_ANSIC
2612: xaql1(CHAR c)
2613: #else
2614: xaql1(c) CHAR c;
2615: #endif /* CK_ANSIC */
2616: { /* xaql1 */
2617:     if (langs[language].id == L_FRENCH) { /* If SET LANGUAGE FRENCH */
2618:     if (c == 206) {         /* handle OE digraph. */
2619:         zmstuff('E');
2620:         return('O');
2621:     } else if (c == 207) {      /* Also lowercase oe. */
2622:         zmstuff('e');
2623:         return('o');
2624:     }
2625:     }
2626:     return(yaql1[c]);
2627: }
2628: 
2629: CHAR                    /* Macintosh Latin to ASCII */
2630: #ifdef CK_ANSIC
2631: xaqas(CHAR c)
2632: #else
2633: xaqas(c) CHAR c;
2634: #endif /* CK_ANSIC */
2635: { /* xaqas */
2636:     if (langs[language].id == L_FRENCH) { /* If SET LANGUAGE FRENCH */
2637:     if (c == 206) {         /* handle OE digraph. */
2638:         zmstuff('E');
2639:         return('O');
2640:     } else if (c == 207) {      /* Also lowercase oe. */
2641:         zmstuff('e');
2642:         return('o');
2643:     }
2644:     }
2645:     c = yaql1[c];           /* Translate to Latin-1 */
2646:     return(xl1as(c));           /* then to ASCII. */
2647: }
2648: 
2649: CHAR                    /* Latin-1 to Macintosh Latin */
2650: #ifdef CK_ANSIC
2651: xl1aq(CHAR c)
2652: #else
2653: xl1aq(c) CHAR c;
2654: #endif /* CK_ANSIC */
2655: { /* xl1aq */
2656:     return(yl1aq[c]);
2657: }
2658: 
2659: #ifdef LATIN2
2660: 
2661: /* Translation functions for Latin Alphabet 2 */
2662: 
2663: CHAR                    /* Latin-2 to Latin-1 */
2664: #ifdef CK_ANSIC
2665: xl2l1(CHAR c)
2666: #else
2667: xl2l1(c) CHAR c;
2668: #endif /* CK_ANSIC */
2669: { /* xll2l1 */
2670:     return(yl2l1[c]);
2671: }
2672: 
2673: CHAR                    /* Latin-1 to Latin-2 */
2674: #ifdef CK_ANSIC
2675: xl1l2(CHAR c)
2676: #else
2677: xl1l2(c) CHAR c;
2678: #endif /* CK_ANSIC */
2679: { /* xll1l2 */
2680:     return(yl1l2[c]);
2681: }
2682: 
2683: CHAR                    /* Latin-2 to ASCII */
2684: #ifdef CK_ANSIC
2685: xl2as(CHAR c)
2686: #else
2687: xl2as(c) CHAR c;
2688: #endif /* CK_ANSIC */
2689: { /* xll2as */
2690:     return(yl2as[c]);
2691: }
2692: 
2693: CHAR                    /* Latin-2 to CP852 */
2694: #ifdef CK_ANSIC
2695: xl252(CHAR c)
2696: #else
2697: xl252(c) CHAR c;
2698: #endif /* CK_ANSIC */
2699: { /* xll252 */
2700:     return(yl252[c]);
2701: }
2702: 
2703: CHAR                    /* CP852 to Latin-2 */
2704: #ifdef CK_ANSIC
2705: x52l2(CHAR c)
2706: #else
2707: x52l2(c) CHAR c;
2708: #endif /* CK_ANSIC */
2709: { /* x52l2 */
2710:     return(y52l2[c]);
2711: }
2712: 
2713: CHAR                    /* CP852 to ASCII */
2714: #ifdef CK_ANSIC
2715: x52as(CHAR c)
2716: #else
2717: x52as(c) CHAR c;
2718: #endif /* CK_ANSIC */
2719: { /* xl52as */
2720:     return(yl2as[y52l2[c]]);        /* CP852 -> Latin-2 -> ASCII */
2721: }
2722: 
2723: CHAR                    /* CP852 to Latin-1 */
2724: #ifdef CK_ANSIC
2725: x52l1(CHAR c)
2726: #else
2727: x52l1(c) CHAR c;
2728: #endif /* CK_ANSIC */
2729: { /* xl52l1 */
2730:     return(yl2l1[y52l2[c]]);        /* CP852 -> Latin-2 -> Latin-1 */
2731: }
2732: 
2733: CHAR                    /* Latin-1 to CP852 */
2734: #ifdef CK_ANSIC
2735: xl152(CHAR c)
2736: #else
2737: xl152(c) CHAR c;
2738: #endif /* CK_ANSIC */
2739: { /* xll152 */
2740:     return(yl252[yl1l2[c]]);        /* Latin-1 -> Latin-2 -> CP852 */
2741: }
2742: 
2743: CHAR                    /* Latin-2 to NeXT */
2744: #ifdef CK_ANSIC
2745: xl2ne(CHAR c)
2746: #else
2747: xl2ne(c) CHAR c;
2748: #endif /* CK_ANSIC */
2749: { /* xll2ne */
2750:     switch(c) {
2751:       case 162: return(198);        /* Breve */
2752:       case 163: return(232);        /* L with stroke */
2753:       case 178: return(206);        /* Ogonek */
2754:       case 179: return(248);        /* l with stroke */
2755:       case 183: return(207);        /* Caron */
2756:       case 189: return(205);        /* Double acute */
2757:       case 208: return(144);        /* D stroke = Eth */
2758:       case 240: return(230);        /* d stroke = eth */
2759:       case 255: return(199);        /* Dot above */
2760:       default:  return(yl1ne[yl2l1[c]]);
2761:     }
2762: }
2763: 
2764: CHAR                    /* Latin-2 to CP437 */
2765: #ifdef CK_ANSIC
2766: xl243(CHAR c)
2767: #else
2768: xl243(c) CHAR c;
2769: #endif /* CK_ANSIC */
2770: { /* xll243 */
2771:     return(yl1l2[y43l1[c]]);
2772: }
2773: 
2774: CHAR                    /* Latin-2 to CP850 */
2775: #ifdef CK_ANSIC
2776: xl285(CHAR c)
2777: #else
2778: xl285(c) CHAR c;
2779: #endif /* CK_ANSIC */
2780: { /* xll285 */
2781:     return(yl1l2[y85l1[c]]);
2782: }
2783: 
2784: CHAR                    /* Latin-2 to Apple */
2785: #ifdef CK_ANSIC
2786: xl2aq(CHAR c)
2787: #else
2788: xl2aq(c) CHAR c;
2789: #endif /* CK_ANSIC */
2790: { /* xl2aq */
2791:     return(yl1aq[yl2l1[c]]);        /* Could do more... */
2792: }
2793: 
2794: CHAR                    /* Latin-2 to DGI */
2795: #ifdef CK_ANSIC
2796: xl2dg(CHAR c)
2797: #else
2798: xl2dg(c) CHAR c;
2799: #endif /* CK_ANSIC */
2800: { /* xll2dg */
2801:     return(yl1l2[ydgl1[c]]);
2802: }
2803: 
2804: CHAR                    /* Latin-2 to Short KOI */
2805: #ifdef CK_ANSIC
2806: xl2sk(CHAR c)
2807: #else
2808: xl2sk(c) CHAR c;
2809: #endif /* CK_ANSIC */
2810: { /* xll2sk */
2811:     return(islower(c) ? toupper(c) : c);
2812: }
2813: 
2814: CHAR                    /* NeXT to Latin-2 */
2815: #ifdef CK_ANSIC
2816: xnel2(CHAR c)
2817: #else
2818: xnel2(c) CHAR c;
2819: #endif /* CK_ANSIC */
2820: { /* xnel2 */
2821:     switch (c) {
2822:       case 144: return(208);        /* D stroke = Eth */
2823:       case 198: return(162);        /* Breve */
2824:       case 199: return(255);        /* Dot above */
2825:       case 205: return(189);        /* Double acute */
2826:       case 206: return(178);        /* Ogonek */
2827:       case 207: return(183);        /* Caron */
2828:       case 230: return(240);        /* d stroke = eth */
2829:       case 232: return(163);        /* L with stroke */
2830:       case 248: return(179);        /* l with stroke */
2831:       default:  return(yl1l2[ynel1[c]]); /* Others, go thru Latin-1 */
2832:     }
2833: }
2834: 
2835: CHAR                    /* CP437 to Latin-2 */
2836: #ifdef CK_ANSIC
2837: x43l2(CHAR c)
2838: #else
2839: x43l2(c) CHAR c;
2840: #endif /* CK_ANSIC */
2841: { /* xl43l2 */
2842:     return(yl1l2[y43l1[c]]);
2843: }
2844: 
2845: CHAR                    /* CP850 to Latin-2 */
2846: #ifdef CK_ANSIC
2847: x85l2(CHAR c)
2848: #else
2849: x85l2(c) CHAR c;
2850: #endif /* CK_ANSIC */
2851: { /* xl85l2 */
2852:     return(yl1l2[y85l1[c]]);
2853: }
2854: 
2855: CHAR                    /* Apple to Latin-2 */
2856: #ifdef CK_ANSIC
2857: xaql2(CHAR c)
2858: #else
2859: xaql2(c) CHAR c;
2860: #endif /* CK_ANSIC */
2861: { /* xlaql2 */
2862:     switch (c) {
2863:       case 249: return(162);        /* Breve accent */
2864:       case 250: return(255);        /* Dot accent */
2865:       case 253: return(189);        /* Double acute */
2866:       default: return(yl1l2[yaql1[c]]);
2867:     }
2868: }
2869: 
2870: CHAR                    /* DGI to Latin-2 */
2871: #ifdef CK_ANSIC
2872: xdgl2(CHAR c)
2873: #else
2874: xdgl2(c) CHAR c;
2875: #endif /* CK_ANSIC */
2876: { /* xldgl2 */
2877:     return(yl1l2[ydgl1[c]]);        /* (for now) */
2878: }
2879: 
2880: CHAR                    /* Short KOI to Latin-2 */
2881: #ifdef CK_ANSIC
2882: xskl2(CHAR c)
2883: #else
2884: xskl2(c) CHAR c;
2885: #endif /* CK_ANSIC */
2886: { /* xlskl2 */
2887:     return(islower(c) ? toupper(c) : c);
2888: }
2889: 
2890: CHAR                    /* Latin-2 to German */
2891: #ifdef CK_ANSIC
2892: xl2ge(CHAR c)
2893: #else
2894: xl2ge(c) CHAR c;
2895: #endif /* CK_ANSIC */
2896: { /* xll2ge */
2897:     switch(c) {
2898:       case 167: return(64);     /* Paragraph sign */
2899:       case 196: return(91);     /* A-diaeresis */
2900:       case 214: return(92);     /* O-diaeresis */
2901:       case 220: return(93);     /* U-diaeresis */
2902:       case 223: return(126);        /* double-s */
2903:       case 228: return(123);        /* a-diaeresis */
2904:       case 246: return(124);        /* o-diaeresis */
2905:       case 252: return(125);        /* u-diaeresis */
2906:       default:  return(yl2as[c]);   /* Others */
2907:     }
2908: }
2909: 
2910: CHAR                    /* German to Latin-2 */
2911: #ifdef CK_ANSIC
2912: xgel2(CHAR c)
2913: #else
2914: xgel2(c) CHAR c;
2915: #endif /* CK_ANSIC */
2916: { /* xlgel2 */
2917:     switch(c) {
2918:       case 64:  return(167);        /* Paragraph sign */
2919:       case 91:  return(196);        /* A-diaeresis */
2920:       case 92:  return(214);        /* O-diaeresis */
2921:       case 93:  return(220);        /* U-diaeresis */
2922:       case 123: return(228);        /* a-diaeresis */
2923:       case 126: return(223);        /* double-s */
2924:       case 124: return(246);        /* o-diaeresis */
2925:       case 125: return(252);        /* u-diaeresis */
2926:       default:  return(c);      /* Others */
2927:     }
2928: }
2929: 
2930: CHAR                    /* Latin-2 to Hungarian */
2931: #ifdef CK_ANSIC
2932: xl2hu(CHAR c)
2933: #else
2934: xl2hu(c) CHAR c;
2935: #endif /* CK_ANSIC */
2936: { /* xll2hu */
2937:     switch(c) {
2938:       case 164: return(36);     /* Currency symbol */
2939:       case 189: return(126);        /* Double acute accent */
2940:       case 193: return(64);     /* A-acute */
2941:       case 201: return(91);     /* E-acute */
2942:       case 214: return(92);     /* O-diaeresis */
2943:       case 220: return(93);     /* U-diaeresis */
2944:       case 225: return(96);     /* a-acute */
2945:       case 233: return(123);        /* e-acute */
2946:       case 246: return(124);        /* o-diaeresis */
2947:       case 252: return(125);        /* u-diaeresis */
2948:       default:  return(yl2as[c]);   /* Others */
2949:     }
2950: }
2951: 
2952: CHAR                    /* Hungarian to Latin-2 */
2953: #ifdef CK_ANSIC
2954: xhul2(CHAR c)
2955: #else
2956: xhul2(c) CHAR c;
2957: #endif /* CK_ANSIC */
2958: { /* xlhul2 */
2959:     switch(c) {
2960:       case 36:  return(164);        /* Currency symbol */
2961:       case 64:  return(193);        /* A-acute */
2962:       case 91:  return(201);        /* E-acute */
2963:       case 92:  return(214);        /* O-diaeresis */
2964:       case 93:  return(220);        /* U-diaeresis */
2965:       case 96:  return(225);        /* a-acute */
2966:       case 123: return(233);        /* e-acute */
2967:       case 124: return(246);        /* o-diaeresis */
2968:       case 125: return(252);        /* u-diaeresis */
2969:       case 126: return(189);        /* Double acute accent */
2970:       default:  return(c);      /* Others */
2971:     }
2972: }
2973: #else /* NOLATIN2 */
2974: #define xl2l1 NULL
2975: #define xl1l2 NULL
2976: #define xl2as NULL
2977: #define xl252 NULL
2978: #define x52l2 NULL
2979: #define x52as NULL
2980: #define x52l1 NULL
2981: #define xl152 NULL
2982: #define xl2ne NULL
2983: #define xl243 NULL
2984: #define xl285 NULL
2985: #define xl2aq NULL
2986: #define xl2dg NULL
2987: #define xl2sk NULL
2988: #define xnel2 NULL
2989: #define x43l2 NULL
2990: #define x85l2 NULL
2991: #define xaql2 NULL
2992: #define xdgl2 NULL
2993: #define xskl2 NULL
2994: #define xl2ge NULL
2995: #define xgel2 NULL
2996: #define xl2hu NULL
2997: #define xhul2 NULL
2998: #endif /* LATIN2 */
2999: 
3000: #ifdef CYRILLIC
3001: /* Translation functions for Cyrillic character sets */
3002: 
3003: CHAR                    /* Latin/Cyrillic to */
3004: #ifdef CK_ANSIC
3005: xlcac(CHAR c)
3006: #else
3007: xlcac(c) CHAR c;
3008: #endif /* CK_ANSIC */
3009: { /* xlcac */           /* Microsoft Code Page 866 */
3010:     return(ylcac[c]);
3011: }
3012: 
3013: CHAR                    /* Latin/Cyrillic to Old KOI-8 */
3014: #ifdef CK_ANSIC
3015: xlck8(CHAR c)
3016: #else
3017: xlck8(c) CHAR c;
3018: #endif /* CK_ANSIC */
3019: { /* xlck8 */
3020:     return(ylck8[c]);
3021: }
3022: 
3023: CHAR
3024: #ifdef CK_ANSIC
3025: xlcsk(CHAR c)
3026: #else
3027: xlcsk(c) CHAR c;
3028: #endif /* CK_ANSIC */
3029: { /* xlcsk */           /* Latin/Cyrillic to Short KOI */
3030:     return(ylcsk[c]);
3031: }
3032: 
3033: CHAR
3034: #ifdef CK_ANSIC
3035: xlcas(CHAR c)
3036: #else
3037: xlcas(c) CHAR c;
3038: #endif /* CK_ANSIC */
3039: { /* xlcas */           /* Latin/Cyrillic to ASCII */
3040:     if (langs[language].id == L_RUSSIAN)
3041:       return(ylcsk[c]);
3042:     else
3043:       return((c > 127) ? '?' : c);
3044: }
3045: 
3046: CHAR                    /* CP866 */
3047: #ifdef CK_ANSIC
3048: xaclc(CHAR c)
3049: #else
3050: xaclc(c) CHAR c;
3051: #endif /* CK_ANSIC */
3052: { /* xaclc */           /* to Latin/Cyrillic */
3053:     return(yaclc[c]);
3054: }
3055: 
3056: CHAR                    /* Old KOI-8 to Latin/Cyrillic */
3057: #ifdef CK_ANSIC
3058: xk8lc(CHAR c)
3059: #else
3060: xk8lc(c) CHAR c;
3061: #endif /* CK_ANSIC */
3062: { /* xk8lc */
3063:     return(yk8lc[c]);
3064: }
3065: 
3066: CHAR
3067: #ifdef CK_ANSIC
3068: xskcy(CHAR c)
3069: #else
3070: xskcy(c) CHAR c;
3071: #endif /* CK_ANSIC */
3072: { /* xskcy */           /* Short KOI to Latin/Cyrillic */
3073:     return(yskcy[c & 0x7f]);
3074: }
3075: 
3076: CHAR
3077: #ifdef CK_ANSIC
3078: xascy(CHAR c)
3079: #else
3080: xascy(c) CHAR c;
3081: #endif /* CK_ANSIC */
3082: { /* xascy */           /* ASCII to Latin/Cyrillic */
3083:     if (langs[language].id == L_RUSSIAN) { /* If LANGUAGE == RUSSIAN  */
3084:     return(yskcy[c & 0x7f]);    /* treat ASCII as Short KOI */
3085:     } else return((c > 127) ? '?' : c);
3086: }
3087: 
3088: CHAR
3089: #ifdef CK_ANSIC
3090: xacas(CHAR c)
3091: #else
3092: xacas(c) CHAR c;
3093: #endif /* CK_ANSIC */
3094: { /* xacas */           /* CP866 to ASCII */
3095:     if (langs[language].id == L_RUSSIAN) {
3096:     c = yaclc[c];           /* First to Latin/Cyrillic */
3097:     return(ylcsk[c]);       /* Then to Short KOI */
3098:     } else return((c > 127) ? '?' : c);
3099: }
3100: 
3101: CHAR
3102: #ifdef CK_ANSIC
3103: xskas(CHAR c)
3104: #else
3105: xskas(c) CHAR c;
3106: #endif /* CK_ANSIC */
3107: { /* xskas */           /* Short KOI to ASCII */
3108:     return((c > 95) ? '?' : c);
3109: }
3110: 
3111: CHAR
3112: #ifdef CK_ANSIC
3113: xk8as(CHAR c)
3114: #else
3115: xk8as(c) CHAR c;
3116: #endif /* CK_ANSIC */
3117: { /* xk8as */           /* Old KOI-8 Cyrillic to ASCII */
3118:     if (langs[language].id == L_RUSSIAN) {
3119:     c = yk8lc[c];           /* First to Latin/Cyrillic */
3120:     return(ylcsk[c]);       /* Then to Short KOI */
3121:     } else return((c > 127) ? '?' : c);
3122: }
3123: 
3124: CHAR
3125: #ifdef CK_ANSIC
3126: xassk(CHAR c)
3127: #else
3128: xassk(c) CHAR c;
3129: #endif /* CK_ANSIC */
3130: { /* xassk */           /* ASCII to Short KOI */
3131:     c &= 0x77;              /* Force it to be ASCII */
3132:     return((c > 95) ? (c - 32) : c);    /* Fold columns 6-7 to 4-5 */
3133: }
3134: 
3135: CHAR
3136: #ifdef CK_ANSIC
3137: xl1sk(CHAR c)
3138: #else
3139: xl1sk(c) CHAR c;
3140: #endif /* CK_ANSIC */
3141: { /* xl1sk */           /* Latin-1 to Short KOI */
3142:     c = zl1as(c);           /* Convert to ASCII */
3143:     return(c = xassk(c));       /* Convert ASCII to Short KOI */
3144: }
3145: 
3146: CHAR
3147: #ifdef CK_ANSIC
3148: xaslc(CHAR c)
3149: #else
3150: xaslc(c) CHAR c;
3151: #endif /* CK_ANSIC */
3152: { /* xaslc */           /* ASCII to Latin/Cyrillic */
3153:     if (langs[language].id == L_RUSSIAN)
3154:       return(yskcy[c & 0x7f]);
3155:     else return(c & 0x7f);
3156: }
3157: 
3158: CHAR
3159: #ifdef CK_ANSIC
3160: xasac(CHAR c)
3161: #else
3162: xasac(c) CHAR c;
3163: #endif /* CK_ANSIC */
3164: { /* xasac */           /* ASCII to CP866 */
3165:     if (langs[language].id == L_RUSSIAN) { /* Use Short KOI */
3166:     c = xskcy(c);           /* Translate to Latin/Cyrillic */
3167:     return(ylcac[c]);       /* Then to CP866 */
3168:     } else return(c & 0x7f);
3169: }
3170: 
3171: CHAR
3172: #ifdef CK_ANSIC
3173: xask8(CHAR c)
3174: #else
3175: xask8(c) CHAR c;
3176: #endif /* CK_ANSIC */
3177: { /* xask8 */           /* ASCII to KOI-8 */
3178:     if (langs[language].id == L_RUSSIAN) { /* Use Short KOI */
3179:     c = xskcy(c);           /* Translate to Latin/Cyrillic */
3180:     return(ylck8[c]);       /* Then to KOI-8 */
3181:     } else return(c & 0x7f);
3182: }
3183: #else
3184: #define xacas NULL
3185: #define xaclc NULL
3186: #define xasac NULL
3187: #define xascy NULL
3188: #define xask8 NULL
3189: #define xaslc NULL
3190: #define xassk NULL
3191: #define xk8as NULL
3192: #define xk8lc NULL
3193: #define xl1sk NULL
3194: #define xlcac NULL
3195: #define xlcas NULL
3196: #define xlck8 NULL
3197: #define xlcsk NULL
3198: #define xskas NULL
3199: #define xskcy NULL
3200: #endif /* CYRILLIC */
3201: 
3202: /* Translation functions for Japanese Kanji character sets */
3203: 
3204: #ifdef KANJI
3205: /*
3206:   Translate Kanji Transfer Character Set (EUC) to local file character set,
3207:   contributed by Dr. Hirofumi Fujii, Japan High Energy Research Laboratory
3208:   (KEK), Tokyo, Japan.
3209: 
3210:   a is a byte to be translated, which may be a single-byte character,
3211:   the Katakana prefix, the first byte of a two-byte Kanji character, or the
3212:   second byte of 2-byte Kanji character.
3213: 
3214:   fn is the output function.
3215: 
3216:   Returns 0 on success, -1 on failure.
3217: */
3218: 
3219: _PROTOTYP(static int jpnxas, (int, int[]) );
3220: _PROTOTYP(static int jpnxkt, (int, int[]) );
3221: _PROTOTYP(static int jpnxkn, (int[], int[]) );
3222: 
3223: static int jpncnt;       /* byte count for Japanese */
3224: static int jpnlst;       /* last status (for JIS7) */
3225: 
3226: static int
3227: jpnxas(a, obuf) int a; int obuf[]; { /* Translate ASCII to local file code */
3228:     int r;
3229: 
3230:     r = 0;
3231:     if (fcharset == FC_JIS7) {
3232:     switch (jpnlst) {
3233:       case 1:
3234:         obuf[0] = 0x0f;
3235:         obuf[1] = a;
3236:         r = 2;
3237:         break;
3238:       case 2:
3239:         obuf[0] = 0x1b;
3240:         obuf[1] = 0x28;
3241:         obuf[2] = 0x4a;
3242:         obuf[3] = a;
3243:         r = 4;
3244:         break;
3245:       default:
3246:         obuf[0] = a;
3247:         r = 1;
3248:         break;
3249:     }
3250:     } else {
3251:     obuf[0] = a;
3252:     r = 1;
3253:     }
3254:     return(r);
3255: }
3256: 
3257: static int
3258: jpnxkt(a, obuf) int a; int obuf[]; {
3259: /* Translate JIS X 201 Katakana to local code */
3260: 
3261:     int r;
3262: 
3263:     r = 0;
3264:     if (fcharset == FC_JIS7) {
3265:     switch (jpnlst) {
3266:       case 2:               /* from Kanji */
3267:         obuf[r++] = 0x1b;
3268:         obuf[r++] = 0x28;
3269:         obuf[r++] = 0x4a;
3270:       case 0:               /* from Roman */
3271:         obuf[r++] = 0x0e;
3272:       default:
3273:         obuf[r++] = (a & 0x7f);
3274:       break;
3275:     }
3276:     } else {
3277:     if (fcharset == FC_JEUC)
3278:       obuf[r++] = 0x8e;
3279:     obuf[r++] = (a | 0x80);
3280:     }
3281:     return(r);
3282: }
3283: 
3284: static int
3285: jpnxkn(ibuf, obuf) int ibuf[], obuf[]; {
3286:     /* Translate JIS X 0208 Kanji to local code */
3287:     int c1, c2;
3288:     int r;
3289: 
3290:     c1 = ibuf[0] & 0x7f;
3291:     c2 = ibuf[1] & 0x7f;
3292: 
3293:     if (fcharset == FC_SHJIS) {
3294:     if (c1 & 1)
3295:       c2 += 0x1f;
3296:     else
3297:       c2 += 0x7d;
3298: 
3299:         if (c2 >= 0x7f) c2++;
3300: 
3301:         c1 = ((c1 - 0x21) >> 1) + 0x81;
3302:         if (c1 > 0x9f) c1 += 0x40;
3303: 
3304:         obuf[0] = c1;
3305:         obuf[1] = c2;
3306:         r = 2;
3307:     } else if (fcharset == FC_JIS7) {
3308:         r = 0;
3309:         switch (jpnlst) {
3310:       case 1:
3311:         obuf[r++] = 0x0f; /* From Katakana */
3312:       case 0:
3313:         obuf[r++] = 0x1b;
3314:         obuf[r++] = 0x24;
3315:         obuf[r++] = 0x42;
3316:       default:
3317:         obuf[r++] = c1;
3318:         obuf[r++] = c2;
3319:         break;
3320:     }
3321:     } else {
3322:         obuf[0] = (c1 | 0x80);
3323:         obuf[1] = (c2 | 0x80);
3324:         r = 2;
3325:     }
3326:     return(r);
3327: }
3328: 
3329: int
3330: xkanjf() {
3331: /* Initialize parameters for xkanji */
3332: /* This function should be called when F/X-packet is received */
3333:     jpncnt = jpnlst = 0;
3334:     return(0);
3335: }
3336: 
3337: int
3338: #ifdef CK_ANSIC
3339: xkanjz( int (*fn)(char) )
3340: #else
3341: xkanjz( fn ) int (*fn)();
3342: #endif /* CK_ANSIC */
3343: { /* xkanjz */
3344: /*
3345:   Terminate xkanji
3346:   This function must be called when Z-packet is received
3347:   (before closing the file).
3348: */
3349:     static int obuf[6];
3350:     int r, i, c;
3351: 
3352:     if (fcharset == FC_JIS7) {
3353:         c = 'A';            /* Dummy Roman character */
3354:         r = jpnxas(c, obuf) - 1;    /* -1 removes Dummy character */
3355:         if (r > 0) {
3356:         for (i = 0; i < r; i++)
3357:           if ( ((*fn)((char) obuf[i])) < 0 )
3358:         return( -1 );
3359:     }
3360:     }
3361:     return( 0 );
3362: }
3363: 
3364: int
3365: #ifdef CK_ANSIC
3366: xkanji(int a, int (*fn)(char))
3367: #else
3368: xkanji(a, fn) int a; int (*fn)();
3369: #endif /* CK_ANSIC */
3370: { /* xkanji */
3371:     static int xbuf[2];
3372:     static int obuf[8];
3373: 
3374:     int i, r;
3375:     int c7;
3376:     int state;
3377: 
3378:     r = 0;
3379:     if (jpncnt == 0) {
3380:     /* 1st byte */
3381:     if ( (a & 0x80) == 0 ) {
3382:         /* 8th bit is 0, i.e., single-byte code */
3383:         r = jpnxas(a, obuf);
3384:         state = 0;
3385:     } else {
3386:         /* 8th bit is 1, check the range */
3387:         c7 = a & 0x7f;
3388:         if ( ((c7 > 0x20) && (c7 < 0x7f)) || (c7 == 0x0e) ) {
3389:             /* double byte code */
3390:             xbuf[jpncnt++] = a;
3391:         } else {
3392:             /* single byte code */
3393:             r = jpnxas(a, obuf);
3394:             state = 0;
3395:         }
3396:     }
3397:     } else {
3398:     /* not the 1st byte */
3399:     xbuf[jpncnt++] = a;
3400:     if (xbuf[0] == 0x8e) {
3401:         r = jpnxkt( xbuf[1], obuf );
3402:         state = 1;
3403:     } else {
3404:         r = jpnxkn(xbuf, obuf);
3405:         state = 2;
3406:     }
3407:     }
3408:     if (r > 0) {
3409:         for (i = 0; i < r; i++ )
3410:       if ( ((*fn)((char) obuf[i])) < 0 )
3411:         return( -1 );
3412:         jpnlst = state;
3413:         jpncnt = 0;
3414:     }
3415:     return( 0 );
3416: }
3417: 
3418: /*
3419:   Function for translating from Japanese file character set
3420:   to Japanese EUC transfer character set.
3421:   Returns a pointer to a string containing 0, 1, or 2 bytes.
3422: */
3423: 
3424: /* zkanji */
3425: static int jpnstz;          /* status for JIS-7 */
3426: static int jpnpnd;          /* number of pending bytes */
3427: static int jpnpnt;          /* pending buffer index */
3428: static int jpnpbf[8];           /* pending buffer */
3429: 
3430: int
3431: zkanjf() {              /* Initialize */
3432:     jpnstz = jpnpnd = jpnpnt = 0;
3433:     return(0);
3434: }
3435: 
3436: int
3437: zkanjz() {
3438:     return( 0 );
3439: }
3440: 
3441: int
3442: #ifdef CK_ANSIC
3443: zkanji( int (*fn)(void) )
3444: #else
3445: zkanji( fn ) int (*fn)();
3446: #endif /* CK_ANSIC */
3447: { /* zkanji */
3448:     /* Read Japanese local code and translate to Japanese EUC */
3449:     int a;
3450:     int sc[3];
3451: 
3452:     /* No pending characters */
3453:     if (fcharset == FC_SHJIS) {     /* Translating from Shift-JIS */
3454:         if (jpnpnd) {
3455:             jpnpnd--;
3456:             return( jpnpbf[jpnpnt++] );
3457:         }
3458: 
3459:         a = (*fn)();
3460:     jpnpnd = jpnpnt = 0;
3461:     if (((a >= 0x81) && (a <= 0x9f)) ||
3462:         ((a >= 0xe0) && (a <= 0xfc))) { /* 2-byte Kanji code */
3463:         sc[0] = a;
3464:         if ((sc[1] = (*fn)()) < 0)  /* Get second byte */
3465:           return( sc[1] );
3466:         if (sc[0] <= 0x9f)
3467:           sc[0] -= 0x71;
3468:         else
3469:           sc[0] -= 0xb1;
3470:         sc[0] = sc[0] * 2 + 1;
3471:         if (sc[1] > 0x7f)
3472:           sc[1]--;
3473:         if (sc[1] >= 0x9e) {
3474:             sc[1] -= 0x7d;
3475:             sc[0]++;
3476:         } else {
3477:             sc[1] -= 0x1f;
3478:         }
3479:         a = (sc[0] | 0x80);
3480:         jpnpbf[0] = (sc[1] | 0x80);
3481:         jpnpnd = 1;
3482:         jpnpnt = 0;
3483:     } else if ((a >= 0xa1) && (a <= 0xdf)) { /* Katakana */
3484:         jpnpbf[0] = a;
3485:         jpnpnd = 1;
3486:         jpnpnt = 0;
3487:         a = 0x8e;
3488:     }
3489:     return(a);
3490:     } else if (fcharset == FC_JIS7 ) {  /* 7-bit JIS X 0208 */
3491:         if (jpnpnd) {
3492:             a = jpnpbf[jpnpnt++];
3493:         jpnpnd--;
3494:             return(a);
3495:         }
3496:         jpnpnt = 0;
3497:         if ((a = (*fn)()) < 0)
3498:       return(a);
3499:         while (jpnpnd == 0) {
3500:             if ((a > 0x20) && (a < 0x7f)) {
3501:                 switch (jpnstz) {
3502:           case 1:
3503:             jpnpbf[jpnpnd++] = 0x80; /* Katakana */
3504:             jpnpbf[jpnpnd++] = (a | 0x80);
3505:             break;
3506:           case 2:
3507:             jpnpbf[jpnpnd++] = (a | 0x80); /* Kanji */
3508:             if ((a = (*fn)()) < 0)
3509:               return(a);
3510:             jpnpbf[jpnpnd++] = (a | 0x80);
3511:             break;
3512:           default:
3513:             jpnpbf[jpnpnd++] = a; /* Single byte */
3514:             break;
3515:                 }
3516:             } else if (a == 0x0e) {
3517:                 jpnstz = 1;
3518:                 if ((a = (*fn)()) < 0)
3519:           return(a);
3520:             } else if (a == 0x0f) {
3521:                 jpnstz = 0;
3522:                 if ((a = (*fn)()) < 0)
3523:           return(a);
3524:             } else if (a == 0x1b) {
3525:                 jpnpbf[jpnpnd++] = a;   /* Escape */
3526:                 if ((a = (*fn)()) < 0)
3527:           return(a);
3528:                 jpnpbf[jpnpnd++] = a;
3529:                 if (a == '$') {
3530:                     if ((a = (*fn)()) < 0)
3531:               return(a);
3532:                     jpnpbf[jpnpnd++] = a;
3533:                     if ((a == '@') || (a == 'B')) {
3534:                         jpnstz = 2;
3535:             jpnpnt = jpnpnd = 0;
3536:                         if ((a = (*fn)()) < 0)
3537:               return(a);
3538:                     }
3539:                 } else if (a == '(') {
3540:                     if ((a = (*fn)()) < 0)
3541:               return( a );
3542:                     jpnpbf[jpnpnd++] = a;
3543:                     if ((a == 'B') || (a == 'J')) {
3544:                         jpnstz = 0;
3545:             jpnpnt = jpnpnd = 0;
3546:                         if ((a = (*fn)()) < 0)
3547:               return(a);
3548:                     }
3549:                 } else if (a == 0x1b) {
3550:                     jpnpnt = jpnpnd = 0;
3551:                     if ((a = (*fn)()) < 0)
3552:               return(a);
3553:                 }
3554:             } else {
3555:                 jpnpbf[jpnpnd++] = a;
3556:             }
3557:         }
3558:         jpnpnt = 0;
3559:         a = jpnpbf[jpnpnt++];
3560:     jpnpnd--;
3561:         return(a);
3562:     } else {
3563:         a = (*fn)();
3564:         return(a);
3565:     }
3566: }
3567: #endif /* KANJI */
3568: 
3569: 
3570: /*  TABLES OF TRANSLATION FUNCTIONS */
3571: 
3572: /*
3573:   First, the table of translation functions for RECEIVING files.
3574:   That is, *from* the TRANSFER character set *to* the FILE character set,
3575:   an array of pointers to functions.  The first index is the
3576:   transfer syntax character set number, the second index is the file
3577:   character set number.
3578: 
3579:   These arrays must be fully populated, even if (as is the case with
3580:   Kanji character sets), all the entries are NULL.  Otherwise,
3581:   subscript calculations will be wrong and we'll use the wrong functions.
3582: */
3583: 
3584: #ifdef CK_ANSIC
3585: CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])(CHAR) =
3586: #else
3587: CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])() =
3588: #endif /* CK_ANSIC */
3589: {
3590:     NULL,           /* 0,0 transparent to us ascii */
3591:     NULL,           /* 0,1 transparent to uk ascii */
3592:     NULL,           /* 0,2 transparent to dutch nrc */
3593:     NULL,           /* 0,3 transparent to finnish nrc */
3594:     NULL,           /* 0,4 transparent to french nrc */
3595:     NULL,           /* 0,5 transparent to fr-canadian nrc */
3596:     NULL,           /* 0,6 transparent to german nrc */
3597:     NULL,           /* 0,7 transparent to hungarian nrc */
3598:     NULL,           /* 0,8 transparent to italian nrc */
3599:     NULL,           /* 0,9 transparent to norge/danish nrc */
3600:     NULL,           /* 0,10 transparent to portuguese nrc */
3601:     NULL,           /* 0,11 transparent to spanish nrc */
3602:     NULL,           /* 0,12 transparent to swedish nrc */
3603:     NULL,           /* 0,13 transparent to swiss nrc */
3604:     NULL,           /* 0,14 transparent to latin-1 */
3605:     NULL,           /* 0,15 transparent to latin-2 */
3606:     NULL,           /* 0,16 transparent to DEC MCS */
3607:     NULL,           /* 0,17 transparent to NeXT */
3608:     NULL,           /* 0,18 transparent to CP437 */
3609:     NULL,           /* 0,19 transparent to CP850 */
3610:     NULL,           /* 0,20 transparent to CP852 */
3611:     NULL,           /* 0,21 transparent to Macintosh Latin */
3612:     NULL,           /* 0,22 transparent to DGI */
3613:     NULL,           /* 0,23 transparent to Latin/Cyrillic */
3614:     NULL,                       /* 0,24 transparent to CP866 */
3615:     NULL,           /* 0,25 transparent to Short KOI-7 */
3616:     NULL,                       /* 0,26 transparent to Old KOI-8 Cyrillic */
3617:     NULL,           /* 0,27 transparent to JIS-7 */
3618:     NULL,           /* 0,28 transparent to Shift-JIS */
3619:     NULL,           /* 0,29 transparent to J-EUC */
3620:     NULL,           /* 0,30 transparent to DEC Kanji */
3621:     NULL,           /* 1,0 ascii to us ascii */
3622:     NULL,           /* 1,1 ascii to uk ascii */
3623:     NULL,           /* 1,2 ascii to dutch nrc */
3624:     NULL,           /* 1,3 ascii to finnish nrc */
3625:     NULL,           /* 1,4 ascii to french nrc */
3626:     NULL,           /* 1,5 ascii to fr-canadian nrc */
3627:     NULL,           /* 1,6 ascii to german nrc */
3628:     NULL,           /* 1,7 ascii to hungarian nrc */
3629:     NULL,           /* 1,8 ascii to italian nrc */
3630:     NULL,           /* 1,9 ascii to norge/danish nrc */
3631:     NULL,           /* 1,10 ascii to portuguese nrc */
3632:     NULL,           /* 1,11 ascii to spanish nrc */
3633:     NULL,           /* 1,12 ascii to swedish nrc */
3634:     NULL,           /* 1,13 ascii to swiss nrc */
3635:     NULL,           /* 1,14 ascii to latin-1 */
3636:     NULL,           /* 1,15 ascii to latin-2 */
3637:     NULL,           /* 1,16 ascii to DEC MCS */
3638:     NULL,           /* 1,17 ascii to NeXT */
3639:     NULL,           /* 1,18 ascii to CP437 */
3640:     NULL,           /* 1,19 ascii to CP850 */
3641:     NULL,           /* 1,20 ascii to CP852 */
3642:     NULL,           /* 1,21 ascii to Macintosh Latin */
3643:     NULL,           /* 1,22 ascii to DGI */
3644:     xaslc,                      /* 1,23 ascii to Latin/Cyrillic */
3645:     xasac,                      /* 1,24 ascii to CP866 */
3646:     xassk,                      /* 1,25 ascii to Short KOI */
3647:     xask8,                      /* 1,26 ascii to Old KOI-8 Cyrillic */
3648:     NULL,           /* 1,27 ascii to JIS-7 */
3649:     NULL,           /* 1,28 ascii to Shift-JIS */
3650:     NULL,           /* 1,29 ascii to J-EUC */
3651:     NULL,           /* 1,30 ascii to DEC Kanji */
3652:     zl1as,          /* 2,0 latin-1 to us ascii */
3653:     xl1uk,          /* 2,1 latin-1 to uk ascii */
3654:     xl1du,          /* 2,2 latin-1 to dutch nrc */
3655:     xl1fi,          /* 2,3 latin-1 to finnish nrc */
3656:     xl1fr,          /* 2,4 latin-1 to french nrc */
3657:     xl1fc,          /* 2,5 latin-1 to fr-canadian nrc */
3658:     xl1ge,          /* 2,6 latin-1 to german nrc */
3659:     xl1it,          /* 2,7 latin-1 to italian nrc */
3660:     xl1hu,          /* 2,8 latin-1 to hungarian nrc */
3661:     xl1no,          /* 2,9 latin-1 to norge/danish nrc */
3662:     xl1po,          /* 2,10 latin-1 to portuguese nrc */
3663:     xl1sp,          /* 2,11 latin-1 to spanish nrc */
3664:     xl1sw,          /* 2,12 latin-1 to swedish nrc */
3665:     xl1ch,          /* 2,13 latin-1 to swiss nrc */
3666:     NULL,           /* 2,14 latin-1 to latin-1 */
3667:     xl1l2,          /* 2,15 latin-1 to latin-2 */
3668:     xl1dm,          /* 2,16 latin-1 to DEC MCS */
3669:     xl1ne,          /* 2,17 latin-1 to NeXT */
3670:     xl143,          /* 2,18 latin-1 to CP437 */
3671:     xl185,          /* 2,19 latin-1 to CP850 */
3672:     xl152,          /* 2,20 latin-1 to CP852 */
3673:     xl1aq,          /* 2,21 latin-1 to Macintosh Latin */
3674:     xl1dg,          /* 2,22 latin-1 to DGI */
3675:     zl1as,          /* 2,23 latin-1 to Latin/Cyrillic */
3676:     zl1as,                      /* 2,24 latin-1 to CP866 */
3677:     xl1sk,                      /* 2,25 latin-1 to Short KOI */
3678:     zl1as,              /* 2,26 latin-1 to Old KOI-8 Cyrillic */
3679:     NULL,           /* 2,27 latin-1 to JIS-7 */
3680:     NULL,           /* 2,28 latin-1 to Shift-JIS */
3681:     NULL,           /* 2,29 latin-1 to J-EUC */
3682:     NULL,           /* 2,30 latin-1 to DEC Kanji */
3683:     xl2as,          /* 3,0 latin-2 to us ascii */
3684:     xl2as,          /* 3,1 latin-2 to uk ascii */
3685:     xl2as,          /* 3,2 latin-2 to dutch nrc */
3686:     xl2as,          /* 3,3 latin-2 to finnish nrc */
3687:     xl2as,          /* 3,4 latin-2 to french nrc */
3688:     xl2as,          /* 3,5 latin-2 to fr-canadian nrc */
3689:     xl2as,          /* 3,6 latin-2 to german nrc */
3690:     xl2as,          /* 3,7 latin-2 to italian nrc */
3691:     xl2as,          /* 3,8 latin-2 to hungarian nrc */
3692:     xl2as,          /* 3,9 latin-2 to norge/danish nrc */
3693:     xl2as,          /* 3,10 latin-2 to portuguese nrc */
3694:     xl2as,          /* 3,11 latin-2 to spanish nrc */
3695:     xl2as,          /* 3,12 latin-2 to swedish nrc */
3696:     xl2as,          /* 3,13 latin-2 to swiss nrc */
3697:     xl2l1,          /* 3,14 latin-2 to latin-1 */
3698:     NULL,           /* 3,15 latin-2 to latin-2 */
3699:     xl2l1,          /* 3,16 latin-2 to DEC MCS */
3700:     xl2ne,          /* 3,17 latin-2 to NeXT */
3701:     xl243,          /* 3,18 latin-2 to CP437 */
3702:     xl285,          /* 3,19 latin-2 to CP850 */
3703:     xl252,          /* 3,20 latin-2 to CP852 */
3704:     xl2aq,          /* 3,21 latin-2 to Macintosh Latin */
3705:     xl2dg,          /* 3,22 latin-2 to DGI */
3706:     xl2as,          /* 3,23 latin-2 to Latin/Cyrillic */
3707:     xl2as,                      /* 3,24 latin-2 to CP866 */
3708:     xl2sk,                      /* 3,25 latin-2 to Short KOI */
3709:     xl2as,              /* 3,26 latin-2 to Old KOI-8 Cyrillic */
3710:     NULL,           /* 3,27 latin-2 to JIS-7 */
3711:     NULL,           /* 3,28 latin-2 to Shift-JIS */
3712:     NULL,           /* 3,29 latin-2 to J-EUC */
3713:     NULL,           /* 3,30 latin-2 to DEC Kanji */
3714:     xlcas,          /* 4,0 latin/cyrillic to us ascii */
3715:     xlcas,          /* 4,1 latin/cyrillic to uk ascii */
3716:     xlcas,              /* 4,2 latin/cyrillic to dutch nrc */
3717:     xlcas,          /* 4,3 latin/cyrillic to finnish ascii */
3718:     xlcas,          /* 4,4 latin/cyrillic to french nrc */
3719:     xlcas,          /* 4,5 latin/cyrillic to fr-canadian nrc */
3720:     xlcas,          /* 4,6 latin/cyrillic to german nrc */
3721:     xlcas,          /* 4,7 latin/cyrillic to italian nrc */
3722:     xlcas,          /* 4,8 latin/cyrillic to hungarian nrc */
3723:     xlcas,          /* 4,9 latin/cyrillic to norge/danish nrc */
3724:     xlcas,          /* 4,10 latin/cyrillic to portuguese nrc */
3725:     xlcas,          /* 4,11 latin/cyrillic to spanish nrc */
3726:     xlcas,          /* 4,12 latin/cyrillic to swedish nrc */
3727:     xlcas,          /* 4,13 latin/cyrillic to swiss nrc */
3728:     xlcas,          /* 4,14 latin/cyrillic to latin-1 */
3729:     xlcas,          /* 4,15 latin/cyrillic to latin-2 */
3730:     xlcas,          /* 4,16 latin/cyrillic to DEC MCS */
3731:     xlcas,          /* 4,17 latin/cyrillic to NeXT */
3732:     xlcas,          /* 4,18 latin/cyrillic to CP437 */
3733:     xlcas,          /* 4,19 latin/cyrillic to CP850 */
3734:     xlcas,          /* 4,20 latin/cyrillic to CP852 */
3735:     xlcas,          /* 4,21 latin/cyrillic to Macintosh Latin */
3736:     xlcas,          /* 4,22 latin/cyrillic to DGI */
3737:     NULL,                       /* 4,23 latin/cyrillic to Latin/Cyrillic */
3738:     xlcac,                      /* 4,24 latin/cyrillic to CP866 */
3739:     xlcsk,                      /* 4,25 latin/cyrillic to Short KOI */
3740:     xlck8,              /* 4,26 latin/cyrillic to Old KOI-8 Cyrillic */
3741:     NULL,           /* 4,27 latin/cyril to JIS-7 */
3742:     NULL,           /* 4,28 latin/cyril to Shift-JIS */
3743:     NULL,           /* 4,29 latin/cyril to J-EUC */
3744:     NULL,           /* 4,30 latin/cyril to DEC Kanji */
3745: 
3746: /* Kanji to others ... */
3747: 
3748:     NULL,           /* 5,00 */
3749:     NULL,           /* 5,01 */
3750:     NULL,           /* 5,02 */
3751:     NULL,           /* 5,03 */
3752:     NULL,           /* 5,04 */
3753:     NULL,           /* 5,05 */
3754:     NULL,           /* 5,06 */
3755:     NULL,           /* 5,07 */
3756:     NULL,           /* 5,08 */
3757:     NULL,           /* 5,09 */
3758:     NULL,           /* 5,10 */
3759:     NULL,           /* 5,11 */
3760:     NULL,           /* 5,12 */
3761:     NULL,           /* 5,13 */
3762:     NULL,           /* 5,14 */
3763:     NULL,           /* 5,15 */
3764:     NULL,           /* 5,16 */
3765:     NULL,           /* 5,17 */
3766:     NULL,           /* 5,18 */
3767:     NULL,           /* 5,19 */
3768:     NULL,           /* 5,20 */
3769:     NULL,           /* 5,21 */
3770:     NULL,           /* 5,22 */
3771:     NULL,           /* 5,23 */
3772:     NULL,           /* 5,24 */
3773:     NULL,           /* 5,25 */
3774:     NULL,           /* 5,26 */
3775:     NULL,           /* 5,27 */
3776:     NULL,           /* 5,28 */
3777:     NULL,           /* 5,29 */
3778:     NULL            /* 5,30 */
3779: };
3780: 
3781: /*
3782:   Translation function table for sending files.
3783:   Array of pointers to functions for translating from the local file
3784:   character set to the transfer syntax character set.  Indexed in the same
3785:   way as the xlr array above.
3786: */
3787: #ifdef CK_ANSIC
3788: CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])(CHAR) =
3789: #else
3790: CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])() =
3791: #endif /* CK_ANSIC */
3792: {
3793:     NULL,           /* 0,0 us ascii to transparent */
3794:     NULL,           /* 0,1 uk ascii to transparent */
3795:     NULL,           /* 0,2 dutch nrc to transparent */
3796:     NULL,           /* 0,3 finnish nrc to transparent */
3797:     NULL,           /* 0,4 french nrc to transparent */
3798:     NULL,           /* 0,5 fr-canadian nrc to transparent */
3799:     NULL,           /* 0,6 german nrc to transparent */
3800:     NULL,           /* 0,7 hungarian nrc to transparent */
3801:     NULL,           /* 0,8 italian nrc to transparent */
3802:     NULL,           /* 0,9 norge/danish nrc to transparent */
3803:     NULL,           /* 0,10 portuguese nrc to transparent */
3804:     NULL,           /* 0,11 spanish nrc to transparent */
3805:     NULL,           /* 0,12 swedish nrc to transparent */
3806:     NULL,           /* 0,13 swiss nrc to transparent */
3807:     NULL,           /* 0,14 latin-1 to transparent */
3808:     NULL,           /* 0,15 latin-2 to transparent */
3809:     NULL,           /* 0,16 DEC MCS to transparent */
3810:     NULL,           /* 0,17 NeXT to transparent */
3811:     NULL,           /* 0,18 CP437 to transparent */
3812:     NULL,           /* 0,19 CP850 to transparent */
3813:     NULL,           /* 0,20 CP852 to transparent */
3814:     NULL,           /* 0,21 Macintosh Latin to transparent */
3815:     NULL,           /* 0,22 DGI to transparent */
3816:     NULL,           /* 0,23 Latin/Cyrillic to transparent */
3817:     NULL,                       /* 0,24 CP866 to transparent */
3818:     NULL,                       /* 0,25 Short KOI to transparent */
3819:     NULL,                       /* 0,26 Old KOI-8 to transparent */
3820:     NULL,           /* 0,27 JIS-7 to transparent */
3821:     NULL,           /* 0,28 Shift JIS to transparent */
3822:     NULL,           /* 0,29 Japanese EUC to transparent */
3823:     NULL,           /* 0,30 DEC Kanji to transparent */
3824:     NULL,           /* 1,0 us ascii to ascii */
3825:     NULL,           /* 1,1 uk ascii to ascii */
3826:     xduas,          /* 1,2 dutch nrc to ascii */
3827:     xfias,          /* 1,3 finnish nrc to ascii */
3828:     xfras,          /* 1,4 french nrc to ascii */
3829:     xfcas,          /* 1,5 french canadian nrc to ascii */
3830:     xgeas,          /* 1,6 german nrc to ascii */
3831:     xhuas,          /* 1,7 hungarian nrc to ascii */
3832:     xitas,          /* 1,8 italian nrc to ascii */
3833:     xnoas,          /* 1,9 norwegian/danish nrc to ascii */
3834:     xpoas,          /* 1,10 portuguese nrc to ascii */
3835:     xspas,          /* 1,11 spanish nrc to ascii */
3836:     xswas,          /* 1,12 swedish nrc to ascii */
3837:     xchas,          /* 1,13 swiss nrc to ascii */
3838:     xl1as,          /* 1,14 latin-1 to ascii */
3839:     xl2as,          /* 1,15 latin-2 to ascii */
3840:     xdmas,          /* 1,16 dec mcs to ascii */
3841:     xneas,          /* 1,17 NeXT to ascii */
3842:     x43as,          /* 1,18 CP437 to ascii */
3843:     x85as,          /* 1,19 CP850 to ascii */
3844:     x52as,          /* 1,20 CP850 to ascii */
3845:     xaqas,          /* 1,21 Macintosh Latin to ascii */
3846:     xdgas,          /* 1,22 DGI to ascii */
3847:     xlcas,          /* 1,23 Latin/Cyrillic to ASCII */
3848:     xacas,                      /* 1,24 CP866 to ASCII */
3849:     xskas,          /* 1,25 Short KOI to ASCII */
3850:     xk8as,                      /* 1,26 Old KOI-8 Cyrillic to ASCII */
3851:     NULL,           /* 1,27 */
3852:     NULL,           /* 1,28 */
3853:     NULL,           /* 1,29 */
3854:     NULL,           /* 1,30 */
3855:     NULL,           /* 2,0 us ascii to latin-1 */
3856:     xukl1,          /* 2,1 uk ascii to latin-1 */
3857:     xdul1,          /* 2,2 dutch nrc to latin-1 */
3858:     xfil1,          /* 2,3 finnish nrc to latin-1 */
3859:     xfrl1,          /* 2,4 french nrc to latin-1 */
3860:     xfcl1,          /* 2,5 french canadian nrc to latin-1 */
3861:     xgel1,          /* 2,6 german nrc to latin-1 */
3862:     xhul1,          /* 2,7 hungarian nrc to latin-1 */
3863:     xitl1,          /* 2,8 italian nrc to latin-1 */
3864:     xnol1,          /* 2,9 norwegian/danish nrc to latin-1 */
3865:     xpol1,          /* 2,10 portuguese nrc to latin-1 */
3866:     xspl1,          /* 2,11 spanish nrc to latin-1 */
3867:     xswl1,          /* 2,12 swedish nrc to latin-1 */
3868:     xchl1,          /* 2,13 swiss nrc to latin-1 */
3869:     NULL,           /* 2,14 latin-1 to latin-1 */
3870:     xl2l1,          /* 2,15 latin-2 to latin-1 */
3871:     xdml1,          /* 2,16 dec mcs to latin-1 */
3872:     xnel1,                      /* 2,17 NeXT to Latin-1 */
3873:     x43l1,                      /* 2,18 CP437 to Latin-1 */
3874:     x85l1,                      /* 2,19 CP850 to Latin-1 */
3875:     x52l1,                      /* 2,20 CP852 to Latin-1 */
3876:     xaql1,                      /* 2,21 Macintosh Latin to Latin-1 */
3877:     xdgl1,                      /* 2,22 DGI to Latin-1 */
3878:     xlcas,                      /* 2,23 Latin/Cyrillic to Latin-1 */
3879:     xacas,                      /* 2,24 CP866 to Latin-1 */
3880:     xskas,                      /* 2,25 Short KOI to Latin-1 */
3881:     xk8as,                      /* 2,26 Old KOI-8 Cyrillic to Latin-1 */
3882:     NULL,           /* 2,27 Kanji ... */
3883:     NULL,           /* 2,28 */
3884:     NULL,           /* 2,29 */
3885:     NULL,           /* 2,30 */
3886:     NULL,           /* 3,0 us ascii to latin-2 */
3887:     NULL,           /* 3,1 uk ascii to latin-2 */
3888:     xduas,          /* 3,2 dutch nrc to latin-2 */
3889:     xfias,          /* 3,3 finnish nrc to latin-2 */
3890:     xfras,          /* 3,4 french nrc to latin-2 */
3891:     xfcas,          /* 3,5 french canadian nrc to latin-2 */
3892:     xgel2,          /* 3,6 german nrc to latin-2 */
3893:     xhul2,          /* 3,7 hungarian nrc to latin-2 */
3894:     xitas,          /* 3,8 italian nrc to latin-2 */
3895:     xnoas,          /* 3,9 norwegian/danish nrc to latin-2 */
3896:     xpoas,          /* 3,10 portuguese nrc to latin-2 */
3897:     xspas,          /* 3,11 spanish nrc to latin-2 */
3898:     xswas,          /* 3,12 swedish nrc to latin-2 */
3899:     xchas,          /* 3,13 swiss nrc to latin-2 */
3900:     xl1l2,          /* 3,14 latin-1 to latin-2 */
3901:     NULL,           /* 3,15 latin-2 to latin-2 */
3902:     xl1l2,          /* 3,16 dec mcs to latin-2 */
3903:     xnel2,                      /* 3,17 NeXT to Latin-2 */
3904:     x43l2,                      /* 3,18 CP437 to Latin-2 */
3905:     x85l2,                      /* 3,19 CP850 to Latin-2 */
3906:     x52l2,                      /* 3,20 CP852 to Latin-2 */
3907:     xaql2,                      /* 3,21 Macintosh Latin to Latin-2 */
3908:     xdgl2,                      /* 3,22 DGI to Latin-2 */
3909:     xlcas,                      /* 3,23 Latin/Cyrillic to Latin-2 */
3910:     xacas,                      /* 3,24 CP866 to Latin-2 */
3911:     xskas,                      /* 3,25 Short KOI to Latin-2 */
3912:     xk8as,                      /* 3,26 Old KOI-8 Cyrillic to Latin-2 */
3913:     NULL,           /* 3,27 Kanji ... */
3914:     NULL,           /* 3,28 */
3915:     NULL,           /* 3,29 */
3916:     NULL,           /* 3,30 */
3917:     xaslc,          /* 4,0 us ascii to latin/cyrillic */
3918:     xaslc,          /* 4,1 uk ascii to latin/cyrillic */
3919:     xduas,          /* 4,2 dutch nrc to latin/cyrillic */
3920:     xfias,          /* 4,3 finnish nrc to latin/cyrillic */
3921:     xfras,          /* 4,4 french nrc to latin/cyrillic */
3922:     xfcas,          /* 4,5 french canadian nrc to latin/cyrillic */
3923:     xgeas,          /* 4,6 german nrc to latin/cyrillic */
3924:     xhuas,          /* 4,7 hungarian nrc to latin/cyrillic */
3925:     xitas,          /* 4,8 italian nrc to latin/cyrillic */
3926:     xnoas,          /* 4,9 norge/danish nrc to latin/cyrillic */
3927:     xpoas,          /* 4,10 portuguese nrc to latin/cyrillic */
3928:     xspas,          /* 4,11 spanish nrc to latin/cyrillic */
3929:     xswas,          /* 4,12 swedish nrc to latin/cyrillic */
3930:     xchas,          /* 4,13 swiss nrc to latin/cyrillic */
3931:     xl1as,          /* 4,14 latin-1 to latin/cyrillic */
3932:     xl2as,          /* 4,15 latin-2 to latin/cyrillic */
3933:     xdmas,          /* 4,16 dec mcs to latin/cyrillic */
3934:     xneas,          /* 4,17 NeXT to latin/cyrillic */
3935:     x43as,          /* 4,18 CP437 to latin/cyrillic */
3936:     x85as,          /* 4,19 CP850 to latin/cyrillic */
3937:     x52as,          /* 4,20 CP852 to latin/cyrillic */
3938:     xaqas,          /* 4,21 Macintosh Latin to latin/cyrillic */
3939:     xdgas,          /* 4,22 DGI to Latin/Cyrillic */
3940:     NULL,                       /* 4,23 Latin/Cyrillic to Latin/Cyrillic */
3941:     xaclc,                      /* 4,24 CP866 to Latin/Cyrillic */
3942:     xskcy,                      /* 4,25 Short KOI to Latin/Cyrillic */
3943:     xk8lc,                      /* 4,26 Old KOI-8 Cyrillic to Latin/Cyrillic */
3944:     NULL,           /* 4,27 Kanji... */
3945:     NULL,           /* 4,28 */
3946:     NULL,           /* 4,29 */
3947:     NULL,           /* 4,30 */
3948:     NULL,           /* 5,00 */
3949:     NULL,           /* 5,01 */
3950:     NULL,           /* 5,02 */
3951:     NULL,           /* 5,03 */
3952:     NULL,           /* 5,04 */
3953:     NULL,           /* 5,05 */
3954:     NULL,           /* 5,06 */
3955:     NULL,           /* 4.07 */
3956:     NULL,           /* 5,08 */
3957:     NULL,           /* 5,09 */
3958:     NULL,           /* 5,10 */
3959:     NULL,           /* 5,11 */
3960:     NULL,           /* 5,12 */
3961:     NULL,           /* 5,13 */
3962:     NULL,           /* 5,14 */
3963:     NULL,           /* 5,15 */
3964:     NULL,           /* 5,16 */
3965:     NULL,           /* 5,17 */
3966:     NULL,           /* 5,18 */
3967:     NULL,           /* 5,19 */
3968:     NULL,           /* 5,20 */
3969:     NULL,           /* 5,21 */
3970:     NULL,           /* 5,22 */
3971:     NULL,           /* 5,23 */
3972:     NULL,           /* 5,24 */
3973:     NULL,           /* 5,25 */
3974:     NULL,           /* 5,26 */
3975:     NULL,           /* 5,27 */
3976:     NULL,           /* 5,28 */
3977:     NULL,           /* 5,29 */
3978:     NULL,           /* 5,30 */
3979: };
3980: #endif /* NOCSETS */

Defined functions

ident defined in line 1614; never used
jpnxas defined in line 3226; used 4 times
jpnxkn defined in line 3284; used 2 times
jpnxkt defined in line 3257; used 2 times
x43as defined in line 2588; used 2 times
x43l1 defined in line 2548; used 1 times
x43l2 defined in line 2835; never used
x52as defined in line 2713; never used
x52l1 defined in line 2723; never used
x52l2 defined in line 2703; never used
x85as defined in line 2599; used 2 times
x85l1 defined in line 2558; used 1 times
x85l2 defined in line 2845; never used
xacas defined in line 3088; never used
xaclc defined in line 3046; never used
xaqas defined in line 2629; used 2 times
xaql1 defined in line 2610; used 1 times
xaql2 defined in line 2855; never used
xasac defined in line 3158; never used
xascy defined in line 3076; never used
xask8 defined in line 3171; never used
xaslc defined in line 3146; never used
xassk defined in line 3124; never used
xchas defined in line 2033; used 3 times
xchl1 defined in line 2368; used 1 times
xdgas defined in line 2103; used 2 times
xdgl1 defined in line 2447; used 1 times
xdgl2 defined in line 2870; never used
xdmas defined in line 2084; used 2 times
xdml1 defined in line 2428; used 1 times
xduas defined in line 1786; used 3 times
xdul1 defined in line 2189; used 1 times
xfcas defined in line 1869; used 3 times
xfcl1 defined in line 2219; used 1 times
xfias defined in line 1808; used 3 times
xfil1 defined in line 2199; used 1 times
xfras defined in line 1849; used 3 times
xfrl1 defined in line 2169; used 1 times
xgeas defined in line 1753; used 2 times
xgel1 defined in line 1743; used 1 times
xgel2 defined in line 2910; never used
xhuas defined in line 2063; used 2 times
xhul1 defined in line 2388; used 1 times
xhul2 defined in line 2952; never used
xitas defined in line 1891; used 3 times
xitl1 defined in line 2239; used 1 times
xk8as defined in line 3111; never used
xk8lc defined in line 3056; never used
xkanjf defined in line 3329; used 1 times
xkanji defined in line 3364; used 1 times
xkanjz defined in line 3337; never used
xl143 defined in line 2568; used 3 times
xl152 defined in line 2733; never used
xl185 defined in line 2578; used 1 times
xl1aq defined in line 2649; used 1 times
xl1as defined in line 1624; used 5 times
xl1ch defined in line 2378; used 1 times
xl1dg defined in line 2418; used 1 times
xl1dm defined in line 2408; used 1 times
xl1du defined in line 2179; used 1 times
xl1fc defined in line 2229; used 1 times
xl1fi defined in line 2209; used 1 times
xl1fr defined in line 2158; used 1 times
xl1ge defined in line 1733; used 1 times
xl1hu defined in line 2398; used 1 times
xl1it defined in line 2249; used 1 times
xl1l2 defined in line 2673; never used
xl1ne defined in line 2278; used 1 times
xl1no defined in line 2298; used 1 times
xl1po defined in line 2318; used 1 times
xl1sk defined in line 3135; never used
xl1sp defined in line 2338; used 1 times
xl1sw defined in line 2358; used 1 times
xl1uk defined in line 2146; used 1 times
xl243 defined in line 2764; never used
xl252 defined in line 2693; never used
xl285 defined in line 2774; never used
xl2aq defined in line 2784; never used
xl2as defined in line 2683; never used
xl2dg defined in line 2794; never used
xl2ge defined in line 2890; never used
xl2hu defined in line 2930; never used
xl2l1 defined in line 2663; never used
xl2ne defined in line 2743; never used
xl2sk defined in line 2804; never used
xlcac defined in line 3003; never used
xlcas defined in line 3033; never used
xlck8 defined in line 3013; never used
xlcsk defined in line 3023; never used
xneas defined in line 1911; used 2 times
xnel1 defined in line 2259; used 3 times
xnel2 defined in line 2814; never used
xnoas defined in line 1931; used 3 times
xnol1 defined in line 2288; used 1 times
xpoas defined in line 1957; used 3 times
xpol1 defined in line 2308; used 1 times
xskas defined in line 3101; never used
xskcy defined in line 3066; never used
xskl2 defined in line 2880; never used
xspas defined in line 1975; used 3 times
xspl1 defined in line 2328; used 1 times
xswas defined in line 1993; used 3 times
xswl1 defined in line 2348; used 1 times
xukl1 defined in line 2134; used 1 times
zkanjf defined in line 3430; used 1 times
zkanji defined in line 3441; used 2 times
zkanjz defined in line 3436; never used
zl1as defined in line 2468; used 6 times

Defined variables

fcstab defined in line 211; used 7 times
jpncnt defined in line 3223; used 5 times
jpnlst defined in line 3224; used 5 times
jpnpbf defined in line 3428; used 15 times
jpnpnd defined in line 3426; used 23 times
jpnpnt defined in line 3427; used 12 times
jpnstz defined in line 3425; used 6 times
lngtab defined in line 405; used 2 times
nlangs defined in line 395; used 2 times
nlng defined in line 431; used 1 times
ntcs defined in line 158; used 1 times
ntcsets defined in line 131; used 4 times
ntermc defined in line 356; used 1 times
tcstab defined in line 133; used 2 times
ttcstab defined in line 282; used 8 times
xlav defined in line 2; used 1 times
y43l1 defined in line 798; used 4 times
y52l2 defined in line 1532; used 3 times
y85l1 defined in line 745; used 4 times
yaclc defined in line 1435; used 2 times
yaql1 defined in line 1166; used 3 times
yasl1 defined in line 1153; never used
ychl1 defined in line 1327; used 1 times
ydgl1 defined in line 1371; used 4 times
ydml1 defined in line 1351; used 1 times
ydul1 defined in line 1186; used 1 times
yfcl1 defined in line 1222; used 1 times
yfil1 defined in line 1198; used 1 times
yfrl1 defined in line 1210; used 1 times
ygel1 defined in line 1234; used 1 times
yhul1 defined in line 1339; used 1 times
yitl1 defined in line 1246; used 1 times
yk8lc defined in line 1456; used 2 times
yl143 defined in line 770; used 1 times
yl185 defined in line 719; used 1 times
yl1aq defined in line 821; used 2 times
yl1as defined in line 448; used 13 times
yl1ch defined in line 1089; used 1 times
yl1dg defined in line 1129; used 1 times
yl1dm defined in line 1109; used 1 times
yl1du defined in line 841; used 1 times
yl1fc defined in line 901; used 1 times
yl1fi defined in line 861; used 1 times
yl1fr defined in line 881; used 1 times
yl1ge defined in line 921; used 1 times
yl1hu defined in line 941; used 1 times
yl1it defined in line 961; used 1 times
yl1l2 defined in line 1572; used 10 times
yl1ne defined in line 981; used 2 times
yl1no defined in line 1009; used 1 times
yl1po defined in line 1029; used 1 times
yl1sp defined in line 1049; used 1 times
yl1sw defined in line 1069; used 1 times
yl252 defined in line 1512; used 2 times
yl2as defined in line 1592; used 4 times
yl2l1 defined in line 1552; used 4 times
ylcac defined in line 1395; used 2 times
ylck8 defined in line 1415; used 2 times
ylcsk defined in line 1476; used 4 times
ynel1 defined in line 1258; used 2 times
ynol1 defined in line 1279; used 1 times
ypol1 defined in line 1291; used 1 times
yskcy defined in line 1495; used 3 times
yspl1 defined in line 1303; used 1 times
yswl1 defined in line 1315; used 1 times

Defined macros

x43l2 defined in line 2989; used 1 times
x52as defined in line 2979; used 2 times
x52l1 defined in line 2980; used 1 times
x52l2 defined in line 2978; used 1 times
x85l2 defined in line 2990; used 1 times
xacas defined in line 3184; used 3 times
xaclc defined in line 3185; used 1 times
xaql2 defined in line 2991; used 1 times
xasac defined in line 3186; used 1 times
xascy defined in line 3187; never used
xask8 defined in line 3188; used 1 times
xaslc defined in line 3189; used 3 times
xassk defined in line 3190; used 3 times
xdgl2 defined in line 2992; used 1 times
xgel2 defined in line 2995; used 1 times
xhul2 defined in line 2997; used 1 times
xk8as defined in line 3191; used 3 times
xk8lc defined in line 3192; used 1 times
xl152 defined in line 2981; used 1 times
xl1l2 defined in line 2975; used 3 times
xl1sk defined in line 3193; used 1 times
xl243 defined in line 2983; used 2 times
xl252 defined in line 2977; used 1 times
xl285 defined in line 2984; used 1 times
xl2aq defined in line 2985; used 1 times
xl2as defined in line 2976; used 20 times
xl2dg defined in line 2986; used 1 times
xl2ge defined in line 2994; never used
xl2hu defined in line 2996; never used
xl2l1 defined in line 2974; used 3 times
xl2ne defined in line 2982; used 1 times
xl2sk defined in line 2987; used 1 times
xlcac defined in line 3194; used 1 times
xlcas defined in line 3195; used 26 times
xlck8 defined in line 3196; used 1 times
xlcsk defined in line 3197; used 1 times
xnel2 defined in line 2988; used 2 times
xskas defined in line 3198; used 3 times
xskcy defined in line 3199; used 4 times
xskl2 defined in line 2993; never used
Last modified: 1992-11-24
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 15604
Valid CSS Valid XHTML 1.0 Strict