ckuxla.c
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:255k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. #endif /* CK_ANSIC */
  2. { /* xll252 */
  3.     return(yl252[c]);
  4. }
  5. CHAR /* Latin-2 to Mazovia */
  6. #ifdef CK_ANSIC
  7. xl2mz(CHAR c)
  8. #else
  9. xl2mz(c) CHAR c;
  10. #endif /* CK_ANSIC */
  11. { /* xll2mz */
  12.     return(yl2mz[c]);
  13. }
  14. CHAR /* Latin-1 to Mazovia */
  15. #ifdef CK_ANSIC
  16. xl1mz(CHAR c)
  17. #else
  18. xl1mz(c) CHAR c;
  19. #endif /* CK_ANSIC */
  20. { /* xll1mz */
  21.     return(yl2mz[yl1l2[c]]);
  22. }
  23. CHAR /* Mazovia to Latin-1 */
  24. #ifdef CK_ANSIC
  25. xmzl1(CHAR c)
  26. #else
  27. xmzl1(c) CHAR c;
  28. #endif /* CK_ANSIC */
  29. { /* xmzl1 */
  30.     return(yl2l1[ymzl2[c]]);
  31. }
  32. CHAR /* Mazovia to Latin-9 */
  33. #ifdef CK_ANSIC
  34. xmzl9(CHAR c)
  35. #else
  36. xmzl9(c) CHAR c;
  37. #endif /* CK_ANSIC */
  38. { /* xmzl9 */
  39.     return(xl2l9(ymzl2[c]));
  40. }
  41. CHAR /* CP852 to Latin-2 */
  42. #ifdef CK_ANSIC
  43. x52l2(CHAR c)
  44. #else
  45. x52l2(c) CHAR c;
  46. #endif /* CK_ANSIC */
  47. { /* x52l2 */
  48.     return(y52l2[c]);
  49. }
  50. CHAR /* Mazovia to Latin-2 */
  51. #ifdef CK_ANSIC
  52. xmzl2(CHAR c)
  53. #else
  54. xmzl2(c) CHAR c;
  55. #endif /* CK_ANSIC */
  56. { /* xmzl2 */
  57.     return(ymzl2[c]);
  58. }
  59. CHAR /* Latin-2 to CP1250 */
  60. #ifdef CK_ANSIC
  61. xl21250(CHAR c)
  62. #else
  63. xl21250(c) CHAR c;
  64. #endif /* CK_ANSIC */
  65. { /* xll21250 */
  66.     return(yl21250[c]);
  67. }
  68. CHAR /* CP1250 to Latin-2 */
  69. #ifdef CK_ANSIC
  70. x1250l2(CHAR c)
  71. #else
  72. x1250l2(c) CHAR c;
  73. #endif /* CK_ANSIC */
  74. { /* x1250l2 */
  75.     return(y1250l2[c]);
  76. }
  77. CHAR /* CP852 to ASCII */
  78. #ifdef CK_ANSIC
  79. x52as(CHAR c)
  80. #else
  81. x52as(c) CHAR c;
  82. #endif /* CK_ANSIC */
  83. { /* xl52as */
  84.     return(yl2as[y52l2[c]]); /* CP852 -> Latin-2 -> ASCII */
  85. }
  86. CHAR /* CP1250 to ASCII */
  87. #ifdef CK_ANSIC
  88. x1250as(CHAR c)
  89. #else
  90. x1250as(c) CHAR c;
  91. #endif /* CK_ANSIC */
  92. { /* xl1250as */
  93.     return(yl2as[y1250l2[c]]); /* CP81250 -> Latin-2 -> ASCII */
  94. }
  95. CHAR /* CP852 to Latin-1 */
  96. #ifdef CK_ANSIC
  97. x52l1(CHAR c)
  98. #else
  99. x52l1(c) CHAR c;
  100. #endif /* CK_ANSIC */
  101. { /* xl52l1 */
  102.     return(yl2l1[y52l2[c]]); /* CP852 -> Latin-2 -> Latin-1 */
  103. }
  104. CHAR /* CP1250 to Latin-1 */
  105. #ifdef CK_ANSIC
  106. x1250l1(CHAR c)
  107. #else
  108. x1250l1(c) CHAR c;
  109. #endif /* CK_ANSIC */
  110. { /* xl1250l1 */
  111.     return(yl2l1[y1250l2[c]]); /* CP1250 -> Latin-2 -> Latin-1 */
  112. }
  113. CHAR /* CP1250 to Latin-9 */
  114. #ifdef CK_ANSIC
  115. x1250l9(CHAR c)
  116. #else
  117. x1250l9(c) CHAR c;
  118. #endif /* CK_ANSIC */
  119. { /* x1250l9 */
  120.     if (c == (CHAR)128) /* Euro */
  121.       return((CHAR)164);
  122.     else
  123.       return(xl2l9(y1250l2[c])); /* CP1250 -> Latin-2 -> Latin-9 */
  124. }
  125. CHAR /* Latin-1 to CP852 */
  126. #ifdef CK_ANSIC
  127. xl152(CHAR c)
  128. #else
  129. xl152(c) CHAR c;
  130. #endif /* CK_ANSIC */
  131. { /* xll152 */
  132.     return(yl252[yl1l2[c]]); /* Latin-1 -> Latin-2 -> CP852 */
  133. }
  134. CHAR /* Latin-1 to CP1250 */
  135. #ifdef CK_ANSIC
  136. xl11250(CHAR c)
  137. #else
  138. xl11250(c) CHAR c;
  139. #endif /* CK_ANSIC */
  140. { /* xll11250 */
  141.     return(yl21250[yl1l2[c]]); /* Latin-1 -> Latin-2 -> CP1250 */
  142. }
  143. CHAR /* Latin-9 to CP1250 */
  144. #ifdef CK_ANSIC
  145. xl91250(CHAR c)
  146. #else
  147. xl91250(c) CHAR c;
  148. #endif /* CK_ANSIC */
  149. { /* xll91250 */
  150.     if (c == (CHAR)164) /* Euro */
  151.       return((CHAR)128);
  152.     else
  153.       return(yl21250[xl9l2(c)]); /* Latin-9 -> Latin-2 -> CP1250 */
  154. }
  155. CHAR /* Latin-9 to Mazovia */
  156. #ifdef CK_ANSIC
  157. xl9mz(CHAR c)
  158. #else
  159. xl9mz(c) CHAR c;
  160. #endif /* CK_ANSIC */
  161. { /* xll9mz */
  162.     return(yl2mz[xl9l2(c)]); /* Latin-9 -> Latin-2 -> Mazovia */
  163. }
  164. CHAR /* Latin-9 to Mazovia */
  165. #ifdef CK_ANSIC
  166. xmzas(CHAR c)
  167. #else
  168. xmzas(c) CHAR c;
  169. #endif /* CK_ANSIC */
  170. { /* xmzas */
  171.     return(yl2as[xmzl2(c)]); /* Mazovia -> Latin-2 -> ASCII */
  172. }
  173. CHAR /* Latin-2 to NeXT */
  174. #ifdef CK_ANSIC
  175. xl2ne(CHAR c)
  176. #else
  177. xl2ne(c) CHAR c;
  178. #endif /* CK_ANSIC */
  179. { /* xll2ne */
  180.     switch(c) {
  181.       case 162: return(198); /* Breve */
  182.       case 163: return(232); /* L with stroke */
  183.       case 178: return(206); /* Ogonek */
  184.       case 179: return(248); /* l with stroke */
  185.       case 183: return(207); /* Caron */
  186.       case 189: return(205); /* Double acute */
  187.       case 208: return(144); /* D stroke = Eth */
  188.       case 240: return(230); /* d stroke = eth */
  189.       case 255: return(199); /* Dot above */
  190.       default:  return(yl1ne[yl2l1[c]]);
  191.     }
  192. }
  193. CHAR /* Latin-2 to CP437 */
  194. #ifdef CK_ANSIC
  195. xl243(CHAR c)
  196. #else
  197. xl243(c) CHAR c;
  198. #endif /* CK_ANSIC */
  199. { /* xll243 */
  200.     return(yl1l2[y43l1[c]]);
  201. }
  202. CHAR /* Latin-2 to CP850 */
  203. #ifdef CK_ANSIC
  204. xl285(CHAR c)
  205. #else
  206. xl285(c) CHAR c;
  207. #endif /* CK_ANSIC */
  208. { /* xll285 */
  209.     return(yl1l2[y85l1[c]]);
  210. }
  211. CHAR /* Latin-2 to Apple */
  212. #ifdef CK_ANSIC
  213. xl2aq(CHAR c)
  214. #else
  215. xl2aq(c) CHAR c;
  216. #endif /* CK_ANSIC */
  217. { /* xl2aq */
  218.     return(yl1aq[yl2l1[c]]); /* Could do more... */
  219. }
  220. CHAR /* Latin-2 to DGI */
  221. #ifdef CK_ANSIC
  222. xl2dg(CHAR c)
  223. #else
  224. xl2dg(c) CHAR c;
  225. #endif /* CK_ANSIC */
  226. { /* xll2dg */
  227.     return(ydgl1[yl1l2[c]]);
  228. }
  229. CHAR /* Latin-2 to Short KOI */
  230. #ifdef CK_ANSIC
  231. xl2sk(CHAR c)
  232. #else
  233. xl2sk(c) CHAR c;
  234. #endif /* CK_ANSIC */
  235. { /* xll2sk */
  236.     return(islower(c) ? toupper(c) : c);
  237. }
  238. CHAR /* NeXT to Latin-2 */
  239. #ifdef CK_ANSIC
  240. xnel2(CHAR c)
  241. #else
  242. xnel2(c) CHAR c;
  243. #endif /* CK_ANSIC */
  244. { /* xnel2 */
  245.     switch (c) {
  246.       case 144: return(208); /* D stroke = Eth */
  247.       case 198: return(162); /* Breve */
  248.       case 199: return(255); /* Dot above */
  249.       case 205: return(189); /* Double acute */
  250.       case 206: return(178); /* Ogonek */
  251.       case 207: return(183); /* Caron */
  252.       case 230: return(240); /* d stroke = eth */
  253.       case 232: return(163); /* L with stroke */
  254.       case 248: return(179); /* l with stroke */
  255.       default:  return(yl1l2[ynel1[c]]); /* Others, go thru Latin-1 */
  256.     }
  257. }
  258. CHAR /* CP437 to Latin-2 */
  259. #ifdef CK_ANSIC
  260. x43l2(CHAR c)
  261. #else
  262. x43l2(c) CHAR c;
  263. #endif /* CK_ANSIC */
  264. { /* xl43l2 */
  265.     return(yl1l2[y43l1[c]]);
  266. }
  267. CHAR /* CP850 to Latin-2 */
  268. #ifdef CK_ANSIC
  269. x85l2(CHAR c)
  270. #else
  271. x85l2(c) CHAR c;
  272. #endif /* CK_ANSIC */
  273. { /* xl85l2 */
  274.     return(yl1l2[y85l1[c]]);
  275. }
  276. CHAR /* Apple to Latin-2 */
  277. #ifdef CK_ANSIC
  278. xaql2(CHAR c)
  279. #else
  280. xaql2(c) CHAR c;
  281. #endif /* CK_ANSIC */
  282. { /* xlaql2 */
  283.     switch (c) {
  284.       case 249: return(162); /* Breve accent */
  285.       case 250: return(255); /* Dot accent */
  286.       case 253: return(189); /* Double acute */
  287.       default: return(yl1l2[yaql1[c]]);
  288.     }
  289. }
  290. CHAR /* DGI to Latin-2 */
  291. #ifdef CK_ANSIC
  292. xdgl2(CHAR c)
  293. #else
  294. xdgl2(c) CHAR c;
  295. #endif /* CK_ANSIC */
  296. { /* xldgl2 */
  297.     return(yl1l2[ydgl1[c]]); /* (for now) */
  298. }
  299. CHAR /* Short KOI to Latin-2 */
  300. #ifdef CK_ANSIC
  301. xskl2(CHAR c)
  302. #else
  303. xskl2(c) CHAR c;
  304. #endif /* CK_ANSIC */
  305. { /* xlskl2 */
  306.     return(islower(c) ? toupper(c) : c);
  307. }
  308. CHAR /* Latin-2 to German */
  309. #ifdef CK_ANSIC
  310. xl2ge(CHAR c)
  311. #else
  312. xl2ge(c) CHAR c;
  313. #endif /* CK_ANSIC */
  314. { /* xll2ge */
  315.     switch(c) {
  316.       case 167: return(64); /* Paragraph sign */
  317.       case 196: return(91); /* A-diaeresis */
  318.       case 214: return(92); /* O-diaeresis */
  319.       case 220: return(93); /* U-diaeresis */
  320.       case 223: return(126); /* double-s */
  321.       case 228: return(123); /* a-diaeresis */
  322.       case 246: return(124); /* o-diaeresis */
  323.       case 252: return(125); /* u-diaeresis */
  324.       default:  return(yl2as[c]); /* Others */
  325.     }
  326. }
  327. CHAR /* German to Latin-2 */
  328. #ifdef CK_ANSIC
  329. xgel2(CHAR c)
  330. #else
  331. xgel2(c) CHAR c;
  332. #endif /* CK_ANSIC */
  333. { /* xlgel2 */
  334.     switch(c) {
  335.       case 64:  return(167); /* Paragraph sign */
  336.       case 91:  return(196); /* A-diaeresis */
  337.       case 92:  return(214); /* O-diaeresis */
  338.       case 93:  return(220); /* U-diaeresis */
  339.       case 123: return(228); /* a-diaeresis */
  340.       case 126: return(223); /* double-s */
  341.       case 124: return(246); /* o-diaeresis */
  342.       case 125: return(252); /* u-diaeresis */
  343.       default:  return(c); /* Others */
  344.     }
  345. }
  346. CHAR /* Latin-2 to Hungarian */
  347. #ifdef CK_ANSIC
  348. xl2hu(CHAR c)
  349. #else
  350. xl2hu(c) CHAR c;
  351. #endif /* CK_ANSIC */
  352. { /* xll2hu */
  353.     switch(c) {
  354.       case 164: return(36); /* Currency symbol */
  355.       case 189: return(126); /* Double acute accent */
  356.       case 193: return(64); /* A-acute */
  357.       case 201: return(91); /* E-acute */
  358.       case 214: return(92); /* O-diaeresis */
  359.       case 220: return(93); /* U-diaeresis */
  360.       case 225: return(96); /* a-acute */
  361.       case 233: return(123); /* e-acute */
  362.       case 246: return(124); /* o-diaeresis */
  363.       case 252: return(125); /* u-diaeresis */
  364.       default:  return(yl2as[c]); /* Others */
  365.     }
  366. }
  367. CHAR /* Hungarian to Latin-2 */
  368. #ifdef CK_ANSIC
  369. xhul2(CHAR c)
  370. #else
  371. xhul2(c) CHAR c;
  372. #endif /* CK_ANSIC */
  373. { /* xlhul2 */
  374.     switch(c) {
  375.       case 36:  return(164); /* Currency symbol */
  376.       case 64:  return(193); /* A-acute */
  377.       case 91:  return(201); /* E-acute */
  378.       case 92:  return(214); /* O-diaeresis */
  379.       case 93:  return(220); /* U-diaeresis */
  380.       case 96:  return(225); /* a-acute */
  381.       case 123: return(233); /* e-acute */
  382.       case 124: return(246); /* o-diaeresis */
  383.       case 125: return(252); /* u-diaeresis */
  384.       case 126: return(189); /* Double acute accent */
  385.       default:  return(c); /* Others */
  386.     }
  387. }
  388. CHAR
  389. #ifdef CK_ANSIC
  390. xr8l2(CHAR c)
  391. #else
  392. xr8l2(c) CHAR c;
  393. #endif /* CK_ANSIC */
  394. { /* xr8l2 */ /* Hewlett Packard Roman8 to Latin-2 */
  395.     switch (c) {
  396.       case 235: return(169); /* S caron */
  397.       case 236: return(185); /* s caron */
  398.       default:  return(yl1l2[yr8l1[c]]);
  399.     }
  400. }
  401. CHAR
  402. #ifdef CK_ANSIC
  403. xl2r8(CHAR c)
  404. #else
  405. xl2r8(c) CHAR c;
  406. #endif /* CK_ANSIC */
  407. { /* xl2r8 */ /* Latin-2 to Hewlett Packard Roman8 Character Set */
  408.     switch (c) {
  409.       case 169: return(235); /* S caron */
  410.       case 185: return(236); /* s caron */
  411.       default:  return(yr8l1[yl1l2[c]]);
  412.     }
  413. }
  414. #else /* NOLATIN2 */
  415. #define xl1mz NULL
  416. #define xmzl1 NULL
  417. #define xl2mz NULL
  418. #define xmzl2 NULL
  419. #define xl9mz NULL
  420. #define xmzl9 NULL
  421. #define xmzas NULL
  422. #define xl11250 NULL
  423. #define xl21250 NULL
  424. #define xl91250 NULL
  425. #define x1250as NULL
  426. #define x1250l1 NULL
  427. #define x1250l2 NULL
  428. #define x1250l9 NULL
  429. #define xl2l1 NULL
  430. #define xl1l2 NULL
  431. #define xl2as NULL
  432. #define xl252 NULL
  433. #define x52l2 NULL
  434. #define x52as NULL
  435. #define x52l1 NULL
  436. #define xl152 NULL
  437. #define xl2ne NULL
  438. #define xl243 NULL
  439. #define xl285 NULL
  440. #define xl2aq NULL
  441. #define xl2dg NULL
  442. #define xl2sk NULL
  443. #define xnel2 NULL
  444. #define x43l2 NULL
  445. #define x85l2 NULL
  446. #define xaql2 NULL
  447. #define xdgl2 NULL
  448. #define xskl2 NULL
  449. #define xl2ge NULL
  450. #define xgel2 NULL
  451. #define xl2hu NULL
  452. #define xhul2 NULL
  453. #define xl2r8 NULL
  454. #define xr8l2 NULL
  455. #endif /* LATIN2 */
  456. /* This one can also be used for ELOT 927, Hebrew 7, etc */
  457. CHAR
  458. #ifdef CK_ANSIC
  459. xassk(CHAR c)
  460. #else
  461. xassk(c) CHAR c;
  462. #endif /* CK_ANSIC */
  463. { /* xassk */ /* ASCII to Short KOI */
  464.     c &= 0x77; /* Force it to be ASCII */
  465.     return((c > 95) ? (c - 32) : c); /* Fold columns 6-7 to 4-5 */
  466. }
  467. #ifdef CYRILLIC
  468. /* Translation functions for Cyrillic character sets */
  469. CHAR /* Latin/Cyrillic to */
  470. #ifdef CK_ANSIC
  471. xlcac(CHAR c)
  472. #else
  473. xlcac(c) CHAR c;
  474. #endif /* CK_ANSIC */
  475. { /* xlcac */ /* PC Code Page 866 */
  476.     return(ylcac[c]);
  477. }
  478. CHAR /* Latin/Cyrillic to */
  479. #ifdef CK_ANSIC
  480. xlc55(CHAR c)
  481. #else
  482. xlc55(c) CHAR c;
  483. #endif /* CK_ANSIC */
  484. { /* xlc55 */ /* PC Code Page 855 */
  485.     return(ylc55[c]);
  486. }
  487. CHAR /* Latin/Cyrillic to */
  488. #ifdef CK_ANSIC
  489. xlc1251(CHAR c)
  490. #else
  491. xlc1251(c) CHAR c;
  492. #endif /* CK_ANSIC */
  493. { /* xlc1251 */ /* PC Code Page 81251 */
  494.     return(ylc1251[c]);
  495. }
  496. CHAR /* Latin/Cyrillic to... */
  497. #ifdef CK_ANSIC
  498. xlcbu(CHAR c)
  499. #else
  500. xlcbu(c) CHAR c;
  501. #endif /* CK_ANSIC */
  502. { /* xlcbu */ /* Bulgarian PC Code Page */
  503.     return(ylcbu[c]);
  504. }
  505. CHAR /* Latin/Cyrillic to Old KOI-8 */
  506. #ifdef CK_ANSIC
  507. xlck8(CHAR c)
  508. #else
  509. xlck8(c) CHAR c;
  510. #endif /* CK_ANSIC */
  511. { /* xlck8 */
  512.     return(ylck8[c]);
  513. }
  514. CHAR /* Latin/Cyrillic to KOI8-R */
  515. #ifdef CK_ANSIC
  516. xlckr(CHAR c)
  517. #else
  518. xlckr(c) CHAR c;
  519. #endif /* CK_ANSIC */
  520. { /* xlckr */
  521.     switch(c) {
  522.       case 0xa1: return(0xb3); /* Io */
  523.       case 0xf1: return(0xa3); /* io */
  524.       default:
  525. if (c > 0x7f && c < 0xc0)
  526.   return(UNK);
  527. return(ylck8[c]);
  528.     }
  529. }
  530. CHAR /* Latin/Cyrillic to  KOI8-U */
  531. #ifdef CK_ANSIC
  532. xlcku(CHAR c)
  533. #else
  534. xlcku(c) CHAR c;
  535. #endif /* CK_ANSIC */
  536. { /* xlcku */
  537.     switch(c) {
  538.       case 0xa1: return(0xb3); /* Io */
  539.       case 0xf1: return(0xa3); /* io */
  540.       case 0xf4: return(0xa4); /* Ukrainian ie */
  541.       case 0xf6: return(0xa6); /* Ukrainian i */
  542.       case 0xf7: return(0xa7); /* Ukrainian yi */
  543.       case 0xf3: return(0xad); /* Ukrainian ghe with upturn */
  544.       case 0xa4: return(0xb4); /* Ukrainian Ie */
  545.       case 0xa6: return(0xb6); /* Ukrainian I */
  546.       case 0xa7: return(0xb7); /* Ukrainian Yi */
  547.       case 0xa3: return(0xbd); /* Ukrainian Ghe with upturn */
  548.       default:
  549. if (c > 0x7f && c < 0xc0)
  550.   return(UNK);
  551. return(ylck8[c]);
  552.     }
  553. }
  554. CHAR
  555. #ifdef CK_ANSIC
  556. xlcsk(CHAR c)
  557. #else
  558. xlcsk(c) CHAR c;
  559. #endif /* CK_ANSIC */
  560. { /* xlcsk */ /* Latin/Cyrillic to Short KOI */
  561.     return(ylcsk[c]);
  562. }
  563. CHAR
  564. #ifdef CK_ANSIC
  565. xlcas(CHAR c)
  566. #else
  567. xlcas(c) CHAR c;
  568. #endif /* CK_ANSIC */
  569. { /* xlcas */ /* Latin/Cyrillic to ASCII */
  570.     if (langs[language].id == L_RUSSIAN)
  571.       return(ylcsk[c]);
  572.     else
  573.       return((c > 127) ? '?' : c);
  574. }
  575. CHAR /* CP866 */
  576. #ifdef CK_ANSIC
  577. xaclc(CHAR c)
  578. #else
  579. xaclc(c) CHAR c;
  580. #endif /* CK_ANSIC */
  581. { /* xaclc */ /* to Latin/Cyrillic */
  582.     return(yaclc[c]);
  583. }
  584. CHAR /* CP855 */
  585. #ifdef CK_ANSIC
  586. x55lc(CHAR c)
  587. #else
  588. x55lc(c) CHAR c;
  589. #endif /* CK_ANSIC */
  590. { /* x55lc */ /* to Latin/Cyrillic */
  591.     return(y55lc[c]);
  592. }
  593. CHAR /* Bulgarian PC Code Page ... */
  594. #ifdef CK_ANSIC
  595. xbulc(CHAR c)
  596. #else
  597. xbulc(c) CHAR c;
  598. #endif /* CK_ANSIC */
  599. { /* xbulc */ /* to Latin/Cyrillic */
  600.     return(ybulc[c]);
  601. }
  602. CHAR /* CP1251 */
  603. #ifdef CK_ANSIC
  604. x1251lc(CHAR c)
  605. #else
  606. x1251lc(c) CHAR c;
  607. #endif /* CK_ANSIC */
  608. { /* x1251lc */ /* to Latin/Cyrillic */
  609.     return(y1251lc[c]);
  610. }
  611. CHAR /* Old KOI-8 to Latin/Cyrillic */
  612. #ifdef CK_ANSIC
  613. xk8lc(CHAR c)
  614. #else
  615. xk8lc(c) CHAR c;
  616. #endif /* CK_ANSIC */
  617. { /* xk8lc */
  618.     return(yk8lc[c]);
  619. }
  620. CHAR /* KOI8-R to Latin/Cyrillic */
  621. #ifdef CK_ANSIC
  622. xkrlc(CHAR c)
  623. #else
  624. xkrlc(c) CHAR c;
  625. #endif /* CK_ANSIC */
  626. { /* xkrlc */
  627.     if (c == 0xb3) return(0xa1);
  628.     else if (c == 0xa3) return(0xf1);
  629.     else if (c > 0x7f && c < 0xc0)
  630.       return(UNK);
  631.     return(yk8lc[c]);
  632. }
  633. CHAR /* KOI8-U to Latin/Cyrillic */
  634. #ifdef CK_ANSIC
  635. xkulc(CHAR c)
  636. #else
  637. xkulc(c) CHAR c;
  638. #endif /* CK_ANSIC */
  639. { /* xkulc */
  640.     switch (c) {
  641.       case 0xb3: return(0xa1); /* Io */
  642.       case 0xa3: return(0xf1); /* io */
  643.       case 0xa4: return(0xf4); /* Ukrainian ie */
  644.       case 0xa6: return(0xf6); /* Ukrainian i */
  645.       case 0xa7: return(0xf7); /* Ukrainian yi */
  646.       case 0xad: return(0xf3); /* Ukrainian ghe with upturn */
  647.       case 0xb4: return(0xa4); /* Ukrainian Ie */
  648.       case 0xb6: return(0xa6); /* Ukrainian I */
  649.       case 0xb7: return(0xa7); /* Ukrainian Yi */
  650.       case 0xbd: return(0xa3); /* Ukrainian Ghe with upturn */
  651.       /* Note substitution of Gje for Ghe-Upturn, which is not in 8859-5 */
  652.       default:
  653. if (c > 0x7f && c < 0xc0)
  654.   return(UNK);
  655. return(yk8lc[c]);
  656.     }
  657. }
  658. CHAR
  659. #ifdef CK_ANSIC
  660. xskcy(CHAR c)
  661. #else
  662. xskcy(c) CHAR c;
  663. #endif /* CK_ANSIC */
  664. { /* xskcy */ /* Short KOI to Latin/Cyrillic */
  665.     return(yskcy[c & 0x7f]);
  666. }
  667. CHAR
  668. #ifdef CK_ANSIC
  669. xascy(CHAR c)
  670. #else
  671. xascy(c) CHAR c;
  672. #endif /* CK_ANSIC */
  673. { /* xascy */ /* ASCII to Latin/Cyrillic */
  674.     if (langs[language].id == L_RUSSIAN) { /* If LANGUAGE == RUSSIAN  */
  675. return(yskcy[c & 0x7f]); /* treat ASCII as Short KOI */
  676.     } else return((c > 127) ? '?' : c);
  677. }
  678. CHAR
  679. #ifdef CK_ANSIC
  680. xacas(CHAR c)
  681. #else
  682. xacas(c) CHAR c;
  683. #endif /* CK_ANSIC */
  684. { /* xacas */ /* CP866 to ASCII */
  685.     if (langs[language].id == L_RUSSIAN) {
  686. c = yaclc[c]; /* First to Latin/Cyrillic */
  687. return(ylcsk[c]); /* Then to Short KOI */
  688.     } else return((c > 127) ? '?' : c);
  689. }
  690. CHAR
  691. #ifdef CK_ANSIC
  692. x55as(CHAR c)
  693. #else
  694. x55as(c) CHAR c;
  695. #endif /* CK_ANSIC */
  696. { /* x55as */ /* CP855 to ASCII */
  697.     if (langs[language].id == L_RUSSIAN) {
  698. c = y55lc[c]; /* First to Latin/Cyrillic */
  699. return(ylcsk[c]); /* Then to Short KOI */
  700.     } else return((c > 127) ? '?' : c);
  701. }
  702. CHAR
  703. #ifdef CK_ANSIC
  704. x1251as(CHAR c)
  705. #else
  706. x1251as(c) CHAR c;
  707. #endif /* CK_ANSIC */
  708. { /* x1251as */ /* CP81251 to ASCII */
  709.     if (langs[language].id == L_RUSSIAN) {
  710. c = y1251lc[c]; /* First to Latin/Cyrillic */
  711. return(ylcsk[c]); /* Then to Short KOI */
  712.     } else return((c > 127) ? '?' : c);
  713. }
  714. CHAR
  715. #ifdef CK_ANSIC
  716. xskas(CHAR c)
  717. #else
  718. xskas(c) CHAR c;
  719. #endif /* CK_ANSIC */
  720. { /* xskas */ /* Short KOI to ASCII */
  721.     return((c > 95) ? '?' : c);
  722. }
  723. CHAR
  724. #ifdef CK_ANSIC
  725. xk8as(CHAR c)
  726. #else
  727. xk8as(c) CHAR c;
  728. #endif /* CK_ANSIC */
  729. { /* xk8as */ /* Old KOI-8 Cyrillic to ASCII */
  730.     if (langs[language].id == L_RUSSIAN) {
  731. c = yk8lc[c]; /* First to Latin/Cyrillic */
  732. return(ylcsk[c]); /* Then to Short KOI */
  733.     } else return((c > 127) ? '?' : c);
  734. }
  735. CHAR
  736. #ifdef CK_ANSIC
  737. xl1sk(CHAR c)
  738. #else
  739. xl1sk(c) CHAR c;
  740. #endif /* CK_ANSIC */
  741. { /* xl1sk */ /* Latin-1 to Short KOI */
  742.     c = zl1as(c); /* Convert to ASCII */
  743.     return(c = xassk(c)); /* Convert ASCII to Short KOI */
  744. }
  745. CHAR
  746. #ifdef CK_ANSIC
  747. xaslc(CHAR c)
  748. #else
  749. xaslc(c) CHAR c;
  750. #endif /* CK_ANSIC */
  751. { /* xaslc */ /* ASCII to Latin/Cyrillic */
  752.     if (langs[language].id == L_RUSSIAN)
  753.       return(yskcy[c & 0x7f]);
  754.     else return(c & 0x7f);
  755. }
  756. CHAR
  757. #ifdef CK_ANSIC
  758. xasac(CHAR c)
  759. #else
  760. xasac(c) CHAR c;
  761. #endif /* CK_ANSIC */
  762. { /* xasac */ /* ASCII to CP866 */
  763.     if (langs[language].id == L_RUSSIAN) { /* Use Short KOI */
  764. c = xskcy(c); /* Translate to Latin/Cyrillic */
  765. return(ylcac[c]); /* Then to CP866 */
  766.     } else return(c & 0x7f);
  767. }
  768. CHAR
  769. #ifdef CK_ANSIC
  770. xas55(CHAR c)
  771. #else
  772. xas55(c) CHAR c;
  773. #endif /* CK_ANSIC */
  774. { /* xas55 */ /* ASCII to CP855 */
  775.     if (langs[language].id == L_RUSSIAN) { /* Use Short KOI */
  776. c = xskcy(c); /* Translate to Latin/Cyrillic */
  777. return(ylc55[c]); /* Then to CP866 */
  778.     } else return(c & 0x7f);
  779. }
  780. CHAR
  781. #ifdef CK_ANSIC
  782. xas1251(CHAR c)
  783. #else
  784. xas1251(c) CHAR c;
  785. #endif /* CK_ANSIC */
  786. { /* xas1251 */ /* ASCII to CP81251 */
  787.     if (langs[language].id == L_RUSSIAN) { /* Use Short KOI */
  788. c = xskcy(c); /* Translate to Latin/Cyrillic */
  789. return(ylc1251[c]); /* Then to CP866 */
  790.     } else return(c & 0x7f);
  791. }
  792. CHAR
  793. #ifdef CK_ANSIC
  794. xask8(CHAR c)
  795. #else
  796. xask8(c) CHAR c;
  797. #endif /* CK_ANSIC */
  798. { /* xask8 */ /* ASCII to KOI-8 */
  799.     if (langs[language].id == L_RUSSIAN) { /* Use Short KOI */
  800. c = xskcy(c); /* Translate to Latin/Cyrillic */
  801. return(ylck8[c]); /* Then to KOI-8 */
  802.     } else return(c & 0x7f);
  803. }
  804. #else /* No Cyrillic */
  805. #define xacas NULL
  806. #define x55as NULL
  807. #define x1251as NULL
  808. #define xaclc NULL
  809. #define x55lc NULL
  810. #define x1251lc NULL
  811. #define xasac NULL
  812. #define xas55 NULL
  813. #define xas1251 NULL
  814. #define xascy NULL
  815. #define xask8 NULL
  816. #define xaslc NULL
  817. #define xassk NULL
  818. #define xk8as NULL
  819. #define xk8lc NULL
  820. #define xkrlc NULL
  821. #define xkulc NULL
  822. #define xl1sk NULL
  823. #define xlcac NULL
  824. #define xlc55 NULL
  825. #define xlc1251 NULL
  826. #define xlcas NULL
  827. #define xlck8 NULL
  828. #define xlckr NULL
  829. #define xlcku NULL
  830. #define xlch7 NULL
  831. #define xlcsk NULL
  832. #define xskas NULL
  833. #define xskcy NULL
  834. #define xbulc NULL
  835. #define xlcbu NULL
  836. #endif /* CYRILLIC */
  837. /* Translation functions for Hebrew character sets */
  838. #ifdef HEBREW
  839. CHAR
  840. #ifdef CK_ANSIC
  841. xash7(CHAR c)
  842. #else
  843. xash7(c) CHAR c;
  844. #endif /* CK_ANSIC */
  845. { /* xash7 */ /* ASCII to Hebrew-7 */
  846.     if (c == 96) return('?');
  847.     if (c > 96 && c < 123) return(c - 32);
  848.     else return(c);
  849. }
  850. CHAR
  851. #ifdef CK_ANSIC
  852. xl1h7(CHAR c)
  853. #else
  854. xl1h7(c) CHAR c;
  855. #endif /* CK_ANSIC */
  856. { /* xl1h7 */ /* Latin-1 to Hebrew-7 */
  857.     return(xash7(xl1as(c)));
  858. }
  859. CHAR
  860. #ifdef CK_ANSIC
  861. xl1lh(CHAR c)
  862. #else
  863. xl1lh(c) CHAR c;
  864. #endif /* CK_ANSIC */
  865. { /* xl1lh */ /* Latin-1 to Latin/Hebrew */
  866.     switch(c) {
  867.       case 170: return('a'); /* Feminine ordinal */
  868.       case 186: return('o'); /* Masculine ordinal */
  869.       case 215: return(170); /* Times */
  870.       case 247: return(186); /* Divide */
  871.       default:  return( (c > 190) ? xl1as(c) : c );
  872.     }
  873. }
  874. #ifdef LATIN2
  875. CHAR
  876. #ifdef CK_ANSIC
  877. xl2h7(CHAR c)
  878. #else
  879. xl2h7(c) CHAR c;
  880. #endif /* CK_ANSIC */
  881. { /* xl2h7 */ /* Latin-2 to Hebrew-7 */
  882.     return(xash7(xl2as(c)));
  883. }
  884. #else
  885. #define xl2h7 NULL
  886. #endif /* LATIN2 */
  887. #ifndef NOCYRIL
  888. CHAR
  889. #ifdef CK_ANSIC
  890. xlch7(CHAR c)
  891. #else
  892. xlch7(c) CHAR c;
  893. #endif /* CK_ANSIC */
  894. { /* xlch7 */ /* Latin/Cyrillic to Hebrew-7 */
  895.     return(xash7(xlcas(c)));
  896. }
  897. #endif /* NOCYRIL */
  898. CHAR
  899. #ifdef CK_ANSIC
  900. xlhas(CHAR c)
  901. #else
  902. xlhas(c) CHAR c;
  903. #endif /* CK_ANSIC */
  904. { /* xlhas */ /* Latin/Hebrew to ASCII */
  905.     return( (c > 127) ? '?' : c );
  906. }
  907. CHAR
  908. #ifdef CK_ANSIC
  909. xlhl1(CHAR c)
  910. #else
  911. xlhl1(c) CHAR c;
  912. #endif /* CK_ANSIC */
  913. { /* xlhl1 */ /* Latin/Hebrew to Latin-1 */
  914.     switch (c) {
  915.       case 170: return(215);
  916.       case 186: return(247);
  917.       default: return( (c > 190) ? '?' : c );
  918.     }
  919. }
  920. CHAR
  921. #ifdef CK_ANSIC
  922. xlh62(CHAR c)
  923. #else
  924. xlh62(c) CHAR c;
  925. #endif /* CK_ANSIC */
  926. { /* xlh62 */ /* Latin/Hebrew to CP862 */
  927.     return(ylh62[c]);
  928. }
  929. CHAR
  930. #ifdef CK_ANSIC
  931. xl162(CHAR c)
  932. #else
  933. xl162(c) CHAR c;
  934. #endif /* CK_ANSIC */
  935. { /* xl162 */ /* Latin-1 to CP862 */
  936.     return(xlh62(xl1lh(c))); /* Via Latin/Hebrew */
  937. }
  938. CHAR
  939. #ifdef CK_ANSIC
  940. xlhh7(CHAR c)
  941. #else
  942. xlhh7(c) CHAR c;
  943. #endif /* CK_ANSIC */
  944. { /* xlhh7 */ /* Latin/Hebrew to Hebrew-7 */
  945.     return(ylhh7[c]);
  946. }
  947. CHAR
  948. #ifdef CK_ANSIC
  949. xh7as(CHAR c)
  950. #else
  951. xh7as(c) CHAR c;
  952. #endif /* CK_ANSIC */
  953. { /* xh7as */ /* Hebrew-7 to ASCII */
  954.     return( (c > 95 && c < 123) ? '?' : c );
  955. }
  956. CHAR
  957. #ifdef CK_ANSIC
  958. x62lh(CHAR c)
  959. #else
  960. x62lh(c) CHAR c;
  961. #endif /* CK_ANSIC */
  962. { /* x62lh */ /* CP862 to Latin/Hebrew */
  963.     return(y62lh[c]);
  964. }
  965. CHAR
  966. #ifdef CK_ANSIC
  967. x62as(CHAR c)
  968. #else
  969. x62as(c) CHAR c;
  970. #endif /* CK_ANSIC */
  971. { /* x62as */ /* CP862 to ASCII */
  972.     return( xlhas(x62lh(c)) );
  973. }
  974. CHAR
  975. #ifdef CK_ANSIC
  976. x62l1(CHAR c)
  977. #else
  978. x62l1(c) CHAR c;
  979. #endif /* CK_ANSIC */
  980. { /* x62l1 */ /* CP862 to Latin-1 */
  981.     return( xlhl1(x62lh(c)) );
  982. }
  983. CHAR
  984. #ifdef CK_ANSIC
  985. xh7lh(CHAR c)
  986. #else
  987. xh7lh(c) CHAR c;
  988. #endif /* CK_ANSIC */
  989. { /* xh7lh */ /* Hebrew-7 to Latin/Hebrew */
  990.     return(yh7lh[c]);
  991. }
  992. #else /* No Hebrew */
  993. #define xash7 NULL
  994. #define xl1h7 NULL
  995. #define xl2h7 NULL
  996. #define xlch7 NULL
  997. #define xl1lh NULL
  998. #define xlhas NULL
  999. #define xlhl1 NULL
  1000. #define xl162 NULL
  1001. #define xlhh7 NULL
  1002. #define xlh62 NULL
  1003. #define xh7as NULL
  1004. #define x62as NULL
  1005. #define x62l1 NULL
  1006. #define xh7lh NULL
  1007. #define x62lh NULL
  1008. #endif /* HEBREW */
  1009. /* Translation functions for Greek character sets */
  1010. #ifdef GREEK
  1011. CHAR
  1012. #ifdef CK_ANSIC
  1013. xaseg(CHAR c)
  1014. #else
  1015. xaseg(c) CHAR c;
  1016. #endif /* CK_ANSIC */
  1017. { /* xaseg */ /* ASCII to ELOT 927 */
  1018.     if (c > 96 && c < 123) return(c - 32);
  1019.     else return(c);
  1020. }
  1021. CHAR
  1022. #ifdef CK_ANSIC
  1023. xl1eg(CHAR c)
  1024. #else
  1025. xl1eg(c) CHAR c;
  1026. #endif /* CK_ANSIC */
  1027. { /* xl1ge */ /* Latin-1 to ELOT 927 */
  1028.     return(xaseg(xl1as(c)));
  1029. }
  1030. CHAR
  1031. #ifdef CK_ANSIC
  1032. xl2lg(CHAR c)
  1033. #else
  1034. xl2lg(c) CHAR c;
  1035. #endif /* CK_ANSIC */
  1036. { /* xl2lg */ /* Latin-1 to Latin/Greek */
  1037.     if (c < 160) return(c);
  1038.     else if (c == 160 || c == 168 || c == 173 || c == 174)
  1039.       return(c);
  1040.     else return('?');
  1041. }
  1042. CHAR
  1043. #ifdef CK_ANSIC
  1044. xl1lg(CHAR c)
  1045. #else
  1046. xl1lg(c) CHAR c;
  1047. #endif /* CK_ANSIC */
  1048. { /* xl1lg */ /* Latin-1 to Latin/Greek */
  1049.     if (c < 160) return(c);
  1050.     switch(c) {
  1051.       case 160: /* Themselves */
  1052.       case 164:
  1053.       case 166:
  1054.       case 167:
  1055.       case 168:
  1056.       case 169:
  1057.       case 171:
  1058.       case 172:
  1059.       case 173:
  1060.       case 176:
  1061.       case 177:
  1062.       case 178:
  1063.       case 179:
  1064.       case 180:
  1065.       case 187:
  1066.       case 189:
  1067. return(c);
  1068.       case 181: /* Lowercase mu */
  1069. return(236);
  1070.       default:
  1071. return(UNK);
  1072.     }
  1073. }
  1074. #ifdef LATIN2
  1075. CHAR
  1076. #ifdef CK_ANSIC
  1077. xl2eg(CHAR c)
  1078. #else
  1079. xl2eg(c) CHAR c;
  1080. #endif /* CK_ANSIC */
  1081. { /* xl2eg */ /* Latin-2 to ELOT 927 */
  1082.     return(xaseg(xl2as(c)));
  1083. }
  1084. #else
  1085. #define xl2eg NULL
  1086. #endif /* LATIN2 */
  1087. #ifndef NOCYRIL
  1088. CHAR
  1089. #ifdef CK_ANSIC
  1090. xlceg(CHAR c)
  1091. #else
  1092. xlceg(c) CHAR c;
  1093. #endif /* CK_ANSIC */
  1094. { /* xlceg */ /* Latin/Cyrillic to ELOT 927 */
  1095.     return(xaseg(xlcas(c)));
  1096. }
  1097. #endif /* NOCYRIL */
  1098. CHAR
  1099. #ifdef CK_ANSIC
  1100. xlgas(CHAR c)
  1101. #else
  1102. xlgas(c) CHAR c;
  1103. #endif /* CK_ANSIC */
  1104. { /* xlgas */ /* Latin/Greek to ASCII */
  1105.     return( (c > 127) ? '?' : c );
  1106. }
  1107. CHAR
  1108. #ifdef CK_ANSIC
  1109. xlgl1(CHAR c)
  1110. #else
  1111. xlgl1(c) CHAR c;
  1112. #endif /* CK_ANSIC */
  1113. { /* xlgl1 */ /* Latin/Greek to Latin-1 */
  1114.     if (c == 236)
  1115.       return(181);
  1116.     else
  1117.       return(xl1lg(c));
  1118. }
  1119. CHAR
  1120. #ifdef CK_ANSIC
  1121. xlg69(CHAR c)
  1122. #else
  1123. xlg69(c) CHAR c;
  1124. #endif /* CK_ANSIC */
  1125. { /* xlg69 */ /* Latin/Greek to CP869 */
  1126.     return(ylg69[c]);
  1127. }
  1128. CHAR
  1129. #ifdef CK_ANSIC
  1130. xl169(CHAR c)
  1131. #else
  1132. xl169(c) CHAR c;
  1133. #endif /* CK_ANSIC */
  1134. { /* xl169 */ /* Latin-1 to CP869 */
  1135.     return(xlg69(xl1lg(c))); /* Via Latin/Greek */
  1136. }
  1137. CHAR
  1138. #ifdef CK_ANSIC
  1139. xlgeg(CHAR c)
  1140. #else
  1141. xlgeg(c) CHAR c;
  1142. #endif /* CK_ANSIC */
  1143. { /* xlgeg */ /* Latin/Greek to ELOT 927 */
  1144.     return(ylgeg[c]);
  1145. }
  1146. CHAR
  1147. #ifdef CK_ANSIC
  1148. xegas(CHAR c)
  1149. #else
  1150. xegas(c) CHAR c;
  1151. #endif /* CK_ANSIC */
  1152. { /* xegas */ /* ELOT 927 to ASCII */
  1153.     return( (c > 96 && c < 123) ? '?' : c );
  1154. }
  1155. CHAR
  1156. #ifdef CK_ANSIC
  1157. x69lg(CHAR c)
  1158. #else
  1159. x69lg(c) CHAR c;
  1160. #endif /* CK_ANSIC */
  1161. { /* x69lg */ /* CP869 to Latin/Greek */
  1162.     return(y69lg[c]);
  1163. }
  1164. CHAR
  1165. #ifdef CK_ANSIC
  1166. x69as(CHAR c)
  1167. #else
  1168. x69as(c) CHAR c;
  1169. #endif /* CK_ANSIC */
  1170. { /* x69as */ /* CP869 to ASCII */
  1171.     return( xlgas(x69lg(c)) );
  1172. }
  1173. CHAR
  1174. #ifdef CK_ANSIC
  1175. x69l1(CHAR c)
  1176. #else
  1177. x69l1(c) CHAR c;
  1178. #endif /* CK_ANSIC */
  1179. { /* x69l1 */ /* CP869 to Latin-1 */
  1180.     return( xlgl1(x69lg(c)) );
  1181. }
  1182. CHAR
  1183. #ifdef CK_ANSIC
  1184. xeglg(CHAR c)
  1185. #else
  1186. xeglg(c) CHAR c;
  1187. #endif /* CK_ANSIC */
  1188. { /* xeglg */ /* ELOT 927 to Latin/Greek */
  1189.     return(yeglg[c]);
  1190. }
  1191. #else /* No Greek */
  1192. #define xasge NULL
  1193. #define xl1ge NULL
  1194. #define xl2ge NULL
  1195. #define xlcge NULL
  1196. #define xl1lg NULL
  1197. #define xlgas NULL
  1198. #define xlgl1 NULL
  1199. #define xl169 NULL
  1200. #define xlgge NULL
  1201. #define xlg69 NULL
  1202. #define xegas NULL
  1203. #define x69as NULL
  1204. #define x69l1 NULL
  1205. #define xeglg NULL
  1206. #define x69lg NULL
  1207. #endif /* GREEK */
  1208. /* Translation functions for Japanese Kanji character sets */
  1209. #ifdef KANJI
  1210. /*
  1211.   Translate Kanji Transfer Character Set (EUC) to local file character set,
  1212.   contributed by Dr. Hirofumi Fujii, Japan High Energy Research Laboratory
  1213.   (KEK), Tokyo, Japan.
  1214.   a is a byte to be translated, which may be a single-byte character,
  1215.   the Katakana prefix, the first byte of a two-byte Kanji character, or the
  1216.   second byte of 2-byte Kanji character.
  1217.   fn is the output function.
  1218.   Returns 0 on success, -1 on failure.
  1219. */
  1220. _PROTOTYP(static int jpnxas, (int, int[]) );
  1221. _PROTOTYP(static int jpnxkt, (int, int[]) );
  1222. _PROTOTYP(static int jpnxkn, (int[], int[]) );
  1223. static int jpncnt; /* Byte count for Japanese */
  1224. static int jpnlst; /* Last status (for JIS7) */
  1225. static int
  1226. jpnxas(a, obuf) int a; int obuf[]; { /* Translate ASCII to local file code */
  1227.     int r;
  1228.     r = 0;
  1229.     if (fcharset == FC_JIS7) {
  1230. switch (jpnlst) {
  1231.   case 1:
  1232.     obuf[0] = 0x0f;
  1233.     obuf[1] = a;
  1234.     r = 2;
  1235.     break;
  1236.   case 2:
  1237.     obuf[0] = 0x1b;
  1238.     obuf[1] = 0x28;
  1239.     obuf[2] = 0x4a;
  1240.     obuf[3] = a;
  1241.     r = 4;
  1242.     break;
  1243.   default:
  1244.     obuf[0] = a;
  1245.     r = 1;
  1246.     break;
  1247. }
  1248.     } else {
  1249. obuf[0] = a;
  1250. r = 1;
  1251.     }
  1252.     return(r);
  1253. }
  1254. static int
  1255. jpnxkt(a, obuf) int a; int obuf[]; {
  1256. /* Translate JIS X 201 Katakana to local code */
  1257.     int r;
  1258.     r = 0;
  1259.     if (fcharset == FC_JIS7) {
  1260. switch (jpnlst) {
  1261.   case 2: /* from Kanji */
  1262.     obuf[r++] = 0x1b;
  1263.     obuf[r++] = 0x28;
  1264.     obuf[r++] = 0x4a;
  1265.   case 0: /* from Roman */
  1266.     obuf[r++] = 0x0e;
  1267.   default:
  1268.     obuf[r++] = (a & 0x7f);
  1269.   break;
  1270. }
  1271.     } else {
  1272. if (fcharset == FC_JEUC)
  1273.   obuf[r++] = 0x8e;
  1274. obuf[r++] = (a | 0x80);
  1275.     }
  1276.     return(r);
  1277. }
  1278. static int
  1279. jpnxkn(ibuf, obuf) int ibuf[], obuf[]; {
  1280.     /* Translate JIS X 0208 Kanji to local code */
  1281.     int c1, c2;
  1282.     int r;
  1283.     c1 = ibuf[0] & 0x7f;
  1284.     c2 = ibuf[1] & 0x7f;
  1285.     if (fcharset == FC_SHJIS) {
  1286. if (c1 & 1)
  1287.   c2 += 0x1f;
  1288. else
  1289.   c2 += 0x7d;
  1290.         if (c2 >= 0x7f) c2++;
  1291.         c1 = ((c1 - 0x21) >> 1) + 0x81;
  1292.         if (c1 > 0x9f) c1 += 0x40;
  1293.         obuf[0] = c1;
  1294.         obuf[1] = c2;
  1295.         r = 2;
  1296.     } else if (fcharset == FC_JIS7) {
  1297.         r = 0;
  1298.         switch (jpnlst) {
  1299.      case 1:
  1300.     obuf[r++] = 0x0f; /* From Katakana */
  1301.      case 0:
  1302.     obuf[r++] = 0x1b;
  1303.     obuf[r++] = 0x24;
  1304.     obuf[r++] = 0x42;
  1305.   default:
  1306.     obuf[r++] = c1;
  1307.     obuf[r++] = c2;
  1308.     break;
  1309. }
  1310.     } else {
  1311.         obuf[0] = (c1 | 0x80);
  1312.         obuf[1] = (c2 | 0x80);
  1313.         r = 2;
  1314.     }
  1315.     return(r);
  1316. }
  1317. int
  1318. xkanjf() {
  1319. /* Initialize parameters for xkanji */
  1320. /* This function should be called when F/X-packet is received */
  1321.     jpncnt = jpnlst = 0;
  1322.     return(0);
  1323. }
  1324. int
  1325. #ifdef CK_ANSIC
  1326. xkanjz(int (*fn)(char))
  1327. #else
  1328. xkanjz(fn) int (*fn)();
  1329. #endif /* CK_ANSIC */
  1330. { /* xkanjz */
  1331. /*
  1332.   Terminate xkanji
  1333.   This function must be called when Z-packet is received
  1334.   (before closing the file).
  1335. */
  1336.     static int obuf[6];
  1337.     int r, i, c;
  1338.     if (fcharset == FC_JIS7) {
  1339.         c = 'A'; /* Dummy Roman character */
  1340.         r = jpnxas(c, obuf) - 1; /* -1 removes Dummy character */
  1341.         if (r > 0) {
  1342.     for (i = 0; i < r; i++)
  1343.       if (((*fn)((char) obuf[i])) < 0)
  1344. return(-1);
  1345. }
  1346.     }
  1347.     return(0);
  1348. }
  1349. int
  1350. #ifdef CK_ANSIC
  1351. xkanji(int a, int (*fn)(char))
  1352. #else
  1353. xkanji(a, fn) int a; int (*fn)();
  1354. #endif /* CK_ANSIC */
  1355. { /* xkanji */
  1356.     static int xbuf[2];
  1357.     static int obuf[8];
  1358.     int i, r;
  1359.     int c7;
  1360.     int state=0;
  1361.     r = 0;
  1362.     if (jpncnt == 0) {
  1363. /* 1st byte */
  1364. if ((a & 0x80) == 0) {
  1365.     /* 8th bit is 0, i.e., single-byte code */
  1366.     r = jpnxas(a, obuf);
  1367.     state = 0;
  1368. } else {
  1369.     /* 8th bit is 1, check the range */
  1370.     c7 = a & 0x7f;
  1371.     if (((c7 > 0x20) && (c7 < 0x7f)) || (c7 == 0x0e)) {
  1372.         /* double byte code */
  1373.         xbuf[jpncnt++] = a;
  1374.     } else {
  1375.         /* single byte code */
  1376.         r = jpnxas(a, obuf);
  1377.         state = 0;
  1378.     }
  1379. }
  1380.     } else {
  1381. /* not the 1st byte */
  1382. xbuf[jpncnt++] = a;
  1383. if (xbuf[0] == 0x8e) {
  1384.     r = jpnxkt(xbuf[1], obuf);
  1385.     state = 1;
  1386. } else {
  1387.     r = jpnxkn(xbuf, obuf);
  1388.     state = 2;
  1389. }
  1390.     }
  1391.     if (r > 0) {
  1392.         for (i = 0; i < r; i++ )
  1393.   if (((*fn)((char) obuf[i])) < 0)
  1394.     return(-1);
  1395.         jpnlst = state;
  1396.         jpncnt = 0;
  1397.     }
  1398.     return(0);
  1399. }
  1400. /*
  1401.   Function for translating from Japanese file character set
  1402.   to Japanese EUC transfer character set.
  1403.   Returns a pointer to a string containing 0, 1, or 2 bytes.
  1404. */
  1405. /* zkanji */
  1406. static int jpnstz; /* status for JIS-7 */
  1407. static int jpnpnd; /* number of pending bytes */
  1408. static int jpnpnt; /* pending buffer index */
  1409. static int jpnpbf[8]; /* pending buffer */
  1410. /* There is some duplication here between the old and new JIS-7 parsers */
  1411. /* to be cleaned up later... */
  1412. VOID
  1413. j7init() { /* Initialize JIS-7 parser */
  1414.     jpnstz = 0;
  1415.     jpnpnd = 0;
  1416.     jpnpnt = 0;
  1417. }
  1418. int
  1419. getj7() { /* Reads JIS-7 returns next EUC byte */
  1420.     int x;
  1421.     if (jpnpnd > 0) { /* If something is pending */
  1422. x = (unsigned) jpnpbf[jpnpnt++]; /* Get it */
  1423. jpnpnd--;
  1424. if (jpnpnd < 0) jpnpnd = 0;
  1425. return((unsigned)x);
  1426.     }
  1427.     jpnpnt = 0;
  1428.     if ((x = zminchar()) < 0) return(x);
  1429.     while (jpnpnd == 0) { /* While something is pending... */
  1430. if ((x > 0x20) && (x < 0x7f)) { /* 7-bit graphic character */
  1431.     switch (jpnstz) {
  1432.       case 1:  /* Katakana */
  1433. #ifdef COMMENT
  1434. /* This can't be right... */
  1435. jpnpbf[jpnpnd++] = 0x80; /* Insert flag (NOT SS2???) */
  1436. #else
  1437. jpnpbf[jpnpnd++] = 0x8e; /* Insert SS2 */
  1438. #endif /* COMMENT */
  1439. jpnpbf[jpnpnd++] = (x | 0x80); /* Insert Kana + 8th bit */
  1440. break;
  1441.       case 2: /* Kanji */
  1442. jpnpbf[jpnpnd++] = (x | 0x80); /* Get another byte */
  1443. if ((x = zminchar()) < 0) return(x);
  1444. jpnpbf[jpnpnd++] = (x | 0x80);
  1445. break;
  1446.       default: /* ASCII / JIS Roman */
  1447. jpnpbf[jpnpnd++] = x;
  1448. break;
  1449.     }
  1450. } else if (x == 0x0e) { /* ^N = SO */
  1451.     jpnstz = 1; /* Katakana */
  1452.     if ((x = zminchar()) < 0) return(x);
  1453. } else if (x == 0x0f) { /* ^O = SI */
  1454.     jpnstz = 0; /* ASCII / JIS Roman */
  1455.     if ((x = zminchar()) < 0) return(x);
  1456. } else if (x == 0x1b) { /* Escape */
  1457.     jpnpbf[jpnpnd++] = x; /* Save in buffer */
  1458.     if ((x = zminchar()) < 0) return(x);
  1459.     jpnpbf[jpnpnd++] = x; /* Save in buffer */
  1460.     if (x == '$') { /* <ESC>$ */
  1461. if ((x = zminchar()) < 0) return(x);
  1462. jpnpbf[jpnpnd++] = x;
  1463. if ((x == '@') || (x == 'B')) { /* Kanji */
  1464.     jpnstz = 2;
  1465.     jpnpnt = jpnpnd = 0;
  1466.     if ((x = zminchar()) < 0) return(x);
  1467. }
  1468.     } else if (x == '(') { /* <ESC>( == 94-byte single-byte set */
  1469. if ((x = zminchar()) < 0) return(x);
  1470. jpnpbf[jpnpnd++] = x;
  1471. if ((x == 'B') || (x == 'J')) { /* ASCII or JIS Roman */
  1472.     jpnstz = 0;         /* Set state */
  1473.     jpnpnt = jpnpnd = 0;        /* Reset pointers */
  1474.     if ((x = zminchar()) < 0) return(x);
  1475. }
  1476.     } else if (x == 0x1b) { /* <ESC><ESC> */
  1477. jpnpnt = jpnpnd = 0; /* Reset pointers, stay in state */
  1478. if ((x = zminchar()) < 0) return(x);
  1479.     }
  1480. } else { /* Not <ESC> - just save it */
  1481.     jpnpbf[jpnpnd++] = x;
  1482. }
  1483.     }
  1484.     jpnpnt = 0;
  1485.     x = (unsigned)jpnpbf[jpnpnt++];
  1486.     jpnpnd--;
  1487.     return((unsigned)x);
  1488. }
  1489. USHORT
  1490. #ifdef CK_ANSIC
  1491. eu_to_sj(USHORT eu) /* EUC-JP to Shift-JIS */
  1492. #else
  1493. eu_to_sj(eu) USHORT eu;
  1494. #endif /* CK_ANSIC */
  1495. {
  1496.     int c1, c2;
  1497.     union ck_short jcode,scode;
  1498.     jcode.x_short = eu;
  1499.     c1 = (jcode.x_char[byteorder] & 0x7f);
  1500.     c2 = (jcode.x_char[1-byteorder] & 0x7f);
  1501.     if (c1 & 1)
  1502.       c2 += 0x1f;
  1503.     else
  1504.       c2 += 0x7d;
  1505.     if (c2 >= 0x7f)
  1506.       c2++;
  1507.     c1 = ((c1 - 0x21) >> 1) + 0x81;
  1508.     if (c1 > 0x9f)
  1509.       c1 += 0x40;
  1510.     scode.x_char[byteorder] = c1;
  1511.     scode.x_char[1-byteorder] = c2;
  1512.     return(scode.x_short);
  1513. }
  1514. USHORT
  1515. #ifdef CK_ANSIC
  1516. sj_to_eu(USHORT sj) /* Shift-JIS to EUC-JP */
  1517. #else
  1518. sj_to_eu(sj) USHORT sj;
  1519. #endif /* CK_ANSIC */
  1520. {
  1521.     union ck_short jcode, scode;
  1522.     int c0, c1;
  1523.     scode.x_short = sj;
  1524.     c0 = scode.x_char[byteorder]; /* Left (hi order) byte */
  1525.     c1 = scode.x_char[1-byteorder]; /* Right (lo order) byte */
  1526.     if (((c0 >= 0x81) && (c0 <= 0x9f)) || /* High order byte has 8th bit set */
  1527.         ((c0 >= 0xe0) && (c0 <= 0xfc))) { /* Kanji */
  1528. if (c0 <= 0x9f)   /* Two bytes in */
  1529.   c0 -= 0x71;   /* Do the shifting... */
  1530. else
  1531.   c0 -= 0xb1;
  1532. c0 = c0 * 2 + 1;
  1533. if (c1 > 0x7f) c1 -= 1;
  1534. if (c1 >= 0x9e) {
  1535.     c1 -= 0x7d;
  1536.     c0 += 1;
  1537. } else {
  1538.     c1 -= 0x1f;
  1539. }
  1540. jcode.x_char[byteorder] = (c0 | 0x80); /* Two bytes out */
  1541. jcode.x_char[1-byteorder] = (c1 | 0x80);
  1542.     } else if (c0 == 0) { /* Single byte */
  1543. if (c1 >= 0xa1 && c1 <= 0xdf) { /* Katakana */
  1544.     jcode.x_char[byteorder] = 0x8e; /* SS2 */
  1545.     jcode.x_char[1-byteorder] = c1; /* Kana code */
  1546. } else { /* ASCII or C0 */
  1547.     jcode.x_short = c1;
  1548. }
  1549.     } else { /* Something bad */
  1550. debug(F001,"sj_to_eu bad sj","",sj);
  1551. jcode.x_short = 0xffff;
  1552.     }
  1553.     return(jcode.x_short);
  1554. }
  1555. int
  1556. zkanjf() { /* Initialize */
  1557.     jpnstz = jpnpnd = jpnpnt = 0;
  1558.     return(0);
  1559. }
  1560. int
  1561. zkanjz() {
  1562.     return(0);
  1563. }
  1564. int
  1565. #ifdef CK_ANSIC
  1566. zkanji(int (*fn)(void))
  1567. #else
  1568. zkanji(fn) int (*fn)();
  1569. #endif /* CK_ANSIC */
  1570. { /* zkanji */
  1571.     /* Read Japanese local code and translate to Japanese EUC */
  1572.     int a;
  1573.     int sc[3];
  1574.     /* No pending characters */
  1575.     if (fcharset == FC_SHJIS) { /* Translating from Shift-JIS */
  1576.         if (jpnpnd) {
  1577.             jpnpnd--;
  1578.             return(jpnpbf[jpnpnt++]);
  1579.         }
  1580.         a = (*fn)();
  1581. jpnpnd = jpnpnt = 0;
  1582. if (((a >= 0x81) && (a <= 0x9f)) ||
  1583.     ((a >= 0xe0) && (a <= 0xfc))) { /* 2-byte Kanji code */
  1584.     sc[0] = a;
  1585.     if ((sc[1] = (*fn)()) < 0) /* Get second byte */
  1586.       return(sc[1]);
  1587.     if (sc[0] <= 0x9f)
  1588.       sc[0] -= 0x71;
  1589.     else
  1590.       sc[0] -= 0xb1;
  1591.     sc[0] = sc[0] * 2 + 1;
  1592.     if (sc[1] > 0x7f)
  1593.       sc[1]--;
  1594.     if (sc[1] >= 0x9e) {
  1595.         sc[1] -= 0x7d;
  1596.         sc[0]++;
  1597.     } else {
  1598.         sc[1] -= 0x1f;
  1599.     }
  1600.     a = (sc[0] | 0x80);
  1601.     jpnpbf[0] = (sc[1] | 0x80);
  1602.     jpnpnd = 1;
  1603.     jpnpnt = 0;
  1604. } else if ((a >= 0xa1) && (a <= 0xdf)) { /* Katakana */
  1605.     jpnpbf[0] = a;
  1606.     jpnpnd = 1;
  1607.     jpnpnt = 0;
  1608.     a = 0x8e;
  1609. }
  1610. return(a);
  1611.     } else if (fcharset == FC_JIS7 ) { /* 7-bit JIS X 0208 */
  1612.         if (jpnpnd) {
  1613.             a = jpnpbf[jpnpnt++];
  1614.     jpnpnd--;
  1615.             return(a);
  1616.         }
  1617.         jpnpnt = 0;
  1618.         if ((a = (*fn)()) < 0)
  1619.   return(a);
  1620.         while (jpnpnd == 0) {
  1621.             if ((a > 0x20) && (a < 0x7f)) {
  1622.                 switch (jpnstz) {
  1623.   case 1:
  1624.     jpnpbf[jpnpnd++] = 0x80; /* Katakana */
  1625.     jpnpbf[jpnpnd++] = (a | 0x80);
  1626.     break;
  1627.   case 2:
  1628.     jpnpbf[jpnpnd++] = (a | 0x80); /* Kanji */
  1629.     if ((a = (*fn)()) < 0)
  1630.       return(a);
  1631.     jpnpbf[jpnpnd++] = (a | 0x80);
  1632.     break;
  1633.   default:
  1634.     jpnpbf[jpnpnd++] = a; /* Single byte */
  1635.     break;
  1636.                 }
  1637.             } else if (a == 0x0e) {
  1638.                 jpnstz = 1;
  1639.                 if ((a = (*fn)()) < 0)
  1640.   return(a);
  1641.             } else if (a == 0x0f) {
  1642.                 jpnstz = 0;
  1643.                 if ((a = (*fn)()) < 0)
  1644.   return(a);
  1645.             } else if (a == 0x1b) {
  1646.                 jpnpbf[jpnpnd++] = a; /* Escape */
  1647.                 if ((a = (*fn)()) < 0)
  1648.   return(a);
  1649.                 jpnpbf[jpnpnd++] = a;
  1650.                 if (a == '$') {
  1651.                     if ((a = (*fn)()) < 0)
  1652.       return(a);
  1653.                     jpnpbf[jpnpnd++] = a;
  1654.                     if ((a == '@') || (a == 'B')) {
  1655.                         jpnstz = 2;
  1656. jpnpnt = jpnpnd = 0;
  1657.                         if ((a = (*fn)()) < 0)
  1658.   return(a);
  1659.                     }
  1660.                 } else if (a == '(') {
  1661.                     if ((a = (*fn)()) < 0)
  1662.       return(a);
  1663.                     jpnpbf[jpnpnd++] = a;
  1664.                     if ((a == 'B') || (a == 'J')) {
  1665.                         jpnstz = 0;
  1666. jpnpnt = jpnpnd = 0;
  1667.                         if ((a = (*fn)()) < 0)
  1668.   return(a);
  1669.                     }
  1670.                 } else if (a == 0x1b) {
  1671.                     jpnpnt = jpnpnd = 0;
  1672.                     if ((a = (*fn)()) < 0)
  1673.       return(a);
  1674.                 }
  1675.             } else {
  1676.                 jpnpbf[jpnpnd++] = a;
  1677.             }
  1678.         }
  1679.         jpnpnt = 0;
  1680.         a = jpnpbf[jpnpnt++];
  1681. jpnpnd--;
  1682.         return(a);
  1683.     } else {
  1684.         a = (*fn)();
  1685.         return(a);
  1686.     }
  1687. }
  1688. #endif /* KANJI */
  1689. /* Euro functions */
  1690. #ifdef LATIN2
  1691. CHAR
  1692. #ifdef CK_ANSIC
  1693. xl2l9(CHAR c)
  1694. #else
  1695. xl2l9(c) CHAR c;
  1696. #endif /* CK_ANSIC */
  1697. { /* xl2l9 */  /* Latin-2 to Latin-9... */
  1698.     switch (c) {
  1699.       case 169: return((CHAR)166); /* S caron */
  1700.       case 185: return((CHAR)168); /* s caron */
  1701.       case 174: return((CHAR)180); /* Z caron */
  1702.       case 190: return((CHAR)184); /* z caron */
  1703.       default:
  1704. return(yl2l1[c]);
  1705.     }
  1706. }
  1707. _PROTOTYP( CHAR xl258, ( CHAR ) );
  1708. CHAR
  1709. #ifdef CK_ANSIC
  1710. xl258(CHAR c)
  1711. #else
  1712. xl258(c) CHAR c;
  1713. #endif /* CK_ANSIC */
  1714. { /* xl258 */  /* Latin-2 to CP858... */
  1715.     return(c);
  1716. }
  1717. #else
  1718. #define xl2l9 NULL
  1719. #define xl258 NULL
  1720. #endif /* LATIN2 */
  1721. CHAR
  1722. #ifdef CK_ANSIC
  1723. zl9as(CHAR c)
  1724. #else
  1725. zl9as(c) CHAR c;
  1726. #endif /* CK_ANSIC */
  1727. { /* zl9as */  /* Latin-9 to US ASCII... */
  1728.     if (c < (CHAR)0x80) return(c); /* Save a function call */
  1729.     switch (c) {
  1730.       case 0xa4: return(UNK); /* Euro */
  1731.       case 0xa6: return('S'); /* S Caron */
  1732.       case 0xa8: return('s'); /* s Caron */
  1733.       case 0xb4: return('Z'); /* Z Caron */
  1734.       case 0xbc: return('O'); /* OE digraph */
  1735.       case 0xbd: return('o'); /* oe digraph */
  1736.       case 0xbe: return('Y'); /* Y diaeresis */
  1737.       default:   return(zl1as(c)); /* The rest is like Latin-1 */
  1738.     }
  1739. }
  1740. _PROTOTYP( CHAR xl9as, ( CHAR ) );
  1741. CHAR
  1742. #ifdef CK_ANSIC
  1743. xl9as(CHAR c)
  1744. #else
  1745. xl9as(c) CHAR c;
  1746. #endif /* CK_ANSIC */
  1747. { /* xl9as */  /* Latin-9 to US ASCII... */
  1748.     if (c < (CHAR)0x80) return(c); /* Save a function call */
  1749.     switch (c) {
  1750.       case 0xa4: return(UNK); /* Euro */
  1751.       case 0xa6: return('S'); /* S Caron */
  1752.       case 0xa8: return('s'); /* s Caron */
  1753.       case 0xb4: return('Z'); /* Z Caron */
  1754.       case 0xb8: return('z'); /* z Caron */
  1755.       case 0xbc: return('O'); /* OE digraph */
  1756.       case 0xbd: return('o'); /* oe digraph */
  1757.       case 0xbe: return('Y'); /* Y diaeresis */
  1758.       default:   return(xl1as(c)); /* The rest is like Latin-1 */
  1759.     }
  1760. }
  1761. #ifdef LATIN2
  1762. CHAR
  1763. #ifdef CK_ANSIC
  1764. xl9l2(CHAR c)
  1765. #else
  1766. xl9l2(c) CHAR c;
  1767. #endif /* CK_ANSIC */
  1768. { /* xl9l2 */  /* Latin-9 to Latin-2... */
  1769.     if (c < (CHAR)0x80) return(c); /* Save a function call */
  1770.     switch (c) {
  1771.       case 0xa4: return(UNK); /* Euro */
  1772.       case 0xa6: return((CHAR)0xa9); /* S Caron */
  1773.       case 0xa8: return((CHAR)0xb9); /* s Caron */
  1774.       case 0xb4: return((CHAR)0xae); /* Z Caron */
  1775.       case 0xb8: return((CHAR)0xaf); /* z Caron */
  1776.       case 0xbc: return('O'); /* OE digraph */
  1777.       case 0xbd: return('o'); /* oe digraph */
  1778.       case 0xbe: return('Y'); /* Y diaeresis */
  1779.       default:   return(xl1l2(c)); /* The rest is like Latin-1 */
  1780.     }
  1781. }
  1782. #else
  1783. #define xl9l2 NULL
  1784. #endif /* LATIN2 */
  1785. CHAR
  1786. #ifdef CK_ANSIC
  1787. xl958(CHAR c)
  1788. #else
  1789. xl958(c) CHAR c;
  1790. #endif /* CK_ANSIC */
  1791. { /* xl958 */  /* Latin-9 to CP858... */
  1792.     if (c == 0xa4) /* Euro Symbol */
  1793.       return((CHAR)0xd5);
  1794.     else if (c == 0x9e) /* This was currency symbol */
  1795.       return((CHAR)0xcf);
  1796.     c = yl185[c];
  1797.     return(c);
  1798. }
  1799. CHAR
  1800. #ifdef CK_ANSIC
  1801. x58as(CHAR c)
  1802. #else
  1803. x58as(c) CHAR c;
  1804. #endif /* CK_ANSIC */
  1805. { /* x58as */  /* CP858 to US ASCII... */
  1806.     if (c == 0xd5) /* Euro rather than dotless i */
  1807.       return(UNK);
  1808.     else
  1809.       return(x85as(c)); /* The rest is like CP850 */
  1810. }
  1811. CHAR
  1812. #ifdef CK_ANSIC
  1813. x58l1(CHAR c)
  1814. #else
  1815. x58l1(c) CHAR c;
  1816. #endif /* CK_ANSIC */
  1817. { /* x58l1 */  /* CP858 to Latin-1... */
  1818.     if (c == 0xd5) /* Euro rather than dotless i */
  1819.       return((CHAR)0xa4); /* Return currency symbol */
  1820.     else if (c == 0xcf) /* This keeps it invertible */
  1821.       return((CHAR)0x9e);
  1822.     else
  1823.       return(x85l1(c));
  1824. }
  1825. #ifdef LATIN2
  1826. CHAR
  1827. #ifdef CK_ANSIC
  1828. x58l2(CHAR c)
  1829. #else
  1830. x58l2(c) CHAR c;
  1831. #endif /* CK_ANSIC */
  1832. { /* x58l2 */  /* CP858 to Latin-2... */
  1833.     if (c == 0xd5) /* Euro rather than dotless i */
  1834.       return((CHAR)0xa4); /* Return currency symbol */
  1835.     else if (c == 0xcf) /* This keeps it invertible */
  1836.       return((CHAR)0x9e); /* (if it ever was...) */
  1837.     else /* Otherwise like CP850 */
  1838.       return(x85l2(c));
  1839. }
  1840. #else
  1841. #define x58l2 NULL
  1842. #endif /* LATIN2 */
  1843. CHAR
  1844. #ifdef CK_ANSIC
  1845. x58l9(CHAR c)
  1846. #else
  1847. x58l9(c) CHAR c;
  1848. #endif /* CK_ANSIC */
  1849. { /* x58l9 */  /* CP-858 to Latin-9... */
  1850.     if (c == 0xd5) /* Euro rather than dotless i */
  1851.       return((CHAR)0xa4); /* Return currency symbol */
  1852.     else if (c == 0xcf) /* This keeps it invertible */
  1853.       return((CHAR)0x9e); /* (if it ever was...) */
  1854.     else /* Otherwise like CP850 */
  1855.       return(x85l1(c)); /* to Latin-1 */
  1856. }
  1857. /* End Euro functions */
  1858. /*  TABLES OF TRANSLATION FUNCTIONS */
  1859. /*
  1860.   First, the table of translation functions for RECEIVING files.  That is,
  1861.   *from* the TRANSFER character set *to* the FILE character set, an array of
  1862.   pointers to functions.  The first index is the TRANSFER CHARACTER-SET
  1863.   number, the second index is the FILE CHARACTER-SET number.
  1864.   These arrays must be fully populated, even if (as is the case with Kanji
  1865.   character sets), all the entries are NULL.  Otherwise, subscript
  1866.   calculations will be wrong and we'll use the wrong functions.
  1867. */
  1868. /* Pointers to byte-for-byte translation functions */
  1869. _PROTOTYP( CHAR (*rx), (CHAR) );
  1870. _PROTOTYP( CHAR (*sx), (CHAR) );
  1871. #ifdef UNICODE
  1872. _PROTOTYP( int (*xut), (USHORT) ); /* Translation function UCS to TCS */
  1873. _PROTOTYP( int (*xuf), (USHORT) ); /* Translation function UCS to FCS */
  1874. _PROTOTYP( USHORT (*xtu), (CHAR) ); /* Translation function TCS to UCS */
  1875. _PROTOTYP( USHORT (*xfu), (CHAR) ); /* Translation function FCS to UCS */
  1876. #endif /* UNICODE */
  1877. #ifdef CK_ANSIC
  1878. CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])(CHAR) =
  1879. #else
  1880. CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])() =
  1881. #endif /* CK_ANSIC */
  1882. {
  1883.     NULL, /* 0,0 transparent to us ascii */
  1884.     NULL, /* 0,1 transparent to uk ascii */
  1885.     NULL, /* 0,2 transparent to dutch nrc */
  1886.     NULL, /* 0,3 transparent to finnish nrc */
  1887.     NULL, /* 0,4 transparent to french nrc */
  1888.     NULL, /* 0,5 transparent to fr-canadian nrc */
  1889.     NULL, /* 0,6 transparent to german nrc */
  1890.     NULL, /* 0,7 transparent to hungarian nrc */
  1891.     NULL, /* 0,8 transparent to italian nrc */
  1892.     NULL, /* 0,9 transparent to norge/danish nrc */
  1893.     NULL, /* 0,10 transparent to portuguese nrc */
  1894.     NULL, /* 0,11 transparent to spanish nrc */
  1895.     NULL, /* 0,12 transparent to swedish nrc */
  1896.     NULL, /* 0,13 transparent to swiss nrc */
  1897.     NULL, /* 0,14 transparent to latin-1 */
  1898.     NULL, /* 0,15 transparent to latin-2 */
  1899.     NULL, /* 0,16 transparent to DEC MCS */
  1900.     NULL, /* 0,17 transparent to NeXT */
  1901.     NULL, /* 0,18 transparent to CP437 */
  1902.     NULL, /* 0,19 transparent to CP850 */
  1903.     NULL, /* 0,20 transparent to CP852 */
  1904.     NULL, /* 0,21 transparent to Macintosh Latin */
  1905.     NULL, /* 0,22 transparent to DGI */
  1906.     NULL, /* 0,23 transparent to HP */
  1907.     NULL, /* 0,24 transparent to Latin/Cyrillic */
  1908.     NULL,                       /* 0,25 transparent to CP866 */
  1909.     NULL, /* 0,26 transparent to Short KOI-7 */
  1910.     NULL,                       /* 0,27 transparent to Old KOI-8 Cyrillic */
  1911.     NULL, /* 0,28 transparent to JIS-7 */
  1912.     NULL, /* 0,29 transparent to Shift-JIS */
  1913.     NULL, /* 0,30 transparent to J-EUC */
  1914.     NULL, /* 0,31 transparent to DEC Kanji */
  1915.     NULL, /* 0,32 transparent to Hebrew-7 */
  1916.     NULL, /* 0,33 transparent to Latin/Hebrew */
  1917.     NULL, /* 0,34 transparent to CP862 Hebrew */
  1918.     NULL, /* 0,35 transparent to ELOT 927 Greek */
  1919.     NULL, /* 0,36 transparent to Latin/Greek */
  1920.     NULL, /* 0,37 transparent to CP869 */
  1921.     NULL, /* 0,38 transparent to Latin-9 */
  1922.     NULL, /* 0,39 transparent to CP858 */
  1923.     NULL, /* 0,40 transparent to CP855 */
  1924.     NULL, /* 0,41 transparent to CP1251 */
  1925.     NULL, /* 0,42 transparent to Bulgarian */
  1926.     NULL, /* 0,43 transparent to CP1250 */
  1927.     NULL, /* 0,44 transparent to Mazovia */
  1928.     NULL, /* 0,45 transparent to UCS-2 */
  1929.     NULL, /* 0,46 transparent to UTF-8 */
  1930.     NULL, /* 0,47 transparent to KOI8R */
  1931.     NULL, /* 0,48 transparent to KOI8U */
  1932.     NULL, /* 1,0 ascii to us ascii */
  1933.     NULL, /* 1,1 ascii to uk ascii */
  1934.     NULL, /* 1,2 ascii to dutch nrc */
  1935.     NULL, /* 1,3 ascii to finnish nrc */
  1936.     NULL, /* 1,4 ascii to french nrc */
  1937.     NULL, /* 1,5 ascii to fr-canadian nrc */
  1938.     NULL, /* 1,6 ascii to german nrc */
  1939.     NULL, /* 1,7 ascii to hungarian nrc */
  1940.     NULL, /* 1,8 ascii to italian nrc */
  1941.     NULL, /* 1,9 ascii to norge/danish nrc */
  1942.     NULL, /* 1,10 ascii to portuguese nrc */
  1943.     NULL, /* 1,11 ascii to spanish nrc */
  1944.     NULL, /* 1,12 ascii to swedish nrc */
  1945.     NULL, /* 1,13 ascii to swiss nrc */
  1946.     NULL, /* 1,14 ascii to latin-1 */
  1947.     NULL, /* 1,15 ascii to latin-2 */
  1948.     NULL, /* 1,16 ascii to DEC MCS */
  1949.     NULL, /* 1,17 ascii to NeXT */
  1950.     NULL, /* 1,18 ascii to CP437 */
  1951.     NULL, /* 1,19 ascii to CP850 */
  1952.     NULL, /* 1,20 ascii to CP852 */
  1953.     NULL, /* 1,21 ascii to Macintosh Latin */
  1954.     NULL, /* 1,22 ascii to DGI */
  1955.     NULL, /* 1,23 ascii to HP */
  1956.     xaslc,                      /* 1,24 ascii to Latin/Cyrillic */
  1957.     xasac,                      /* 1,25 ascii to CP866 */
  1958.     xassk,                      /* 1,26 ascii to Short KOI */
  1959.     xask8,                      /* 1,27 ascii to Old KOI-8 Cyrillic */
  1960.     NULL, /* 1,28 ascii to JIS-7 */
  1961.     NULL, /* 1,29 ascii to Shift-JIS */
  1962.     NULL, /* 1,30 ascii to J-EUC */
  1963.     NULL, /* 1,31 ascii to DEC Kanji */
  1964.     xash7, /* 1,32 ascii to Hebrew-7 */
  1965.     NULL, /* 1,33 ascii to Latin/Hebrew */
  1966.     NULL, /* 1,34 ascii to CP862 Hebrew */
  1967.     xaseg, /* 1,35 ascii to ELOT 927 Greek */
  1968.     NULL, /* 1,36 ascii to Latin/Greek */
  1969.     NULL, /* 1,37 ascii to CP869 */
  1970.     NULL, /* 1,38 ascii to Latin-9 */
  1971.     NULL, /* 1,39 ascii to CP858 */
  1972.     xas55, /* 1,40 ascii to CP855 */
  1973.     xas1251, /* 1,41 ascii to CP1251 */
  1974.     xleft128, /* 1,42 ascii to bulgarian */
  1975.     xleft128, /* 1,43 ascii to CP1250 */
  1976.     xleft128, /* 1,44 ascii to Mazovia */
  1977.     NULL, /* 1,45 ascii to UCS-2 */
  1978.     NULL, /* 1,46 ascii to UTF-8 */
  1979.     NULL, /* 1,47 ascii to KOI8-R */
  1980.     NULL, /* 1,48 ascii to KOI8-U */
  1981.     zl1as, /* 2,0 latin-1 to us ascii */
  1982.     xl1uk, /* 2,1 latin-1 to uk ascii */
  1983.     xl1du, /* 2,2 latin-1 to dutch nrc */
  1984.     xl1fi, /* 2,3 latin-1 to finnish nrc */
  1985.     xl1fr, /* 2,4 latin-1 to french nrc */
  1986.     xl1fc, /* 2,5 latin-1 to fr-canadian nrc */
  1987.     xl1ge, /* 2,6 latin-1 to german nrc */
  1988.     xl1it, /* 2,7 latin-1 to italian nrc */
  1989.     xl1hu, /* 2,8 latin-1 to hungarian nrc */
  1990.     xl1no, /* 2,9 latin-1 to norge/danish nrc */
  1991.     xl1po, /* 2,10 latin-1 to portuguese nrc */
  1992.     xl1sp, /* 2,11 latin-1 to spanish nrc */
  1993.     xl1sw, /* 2,12 latin-1 to swedish nrc */
  1994.     xl1ch, /* 2,13 latin-1 to swiss nrc */
  1995.     NULL, /* 2,14 latin-1 to latin-1 */
  1996.     xl1l2, /* 2,15 latin-1 to latin-2 */
  1997.     xl1dm, /* 2,16 latin-1 to DEC MCS */
  1998.     xl1ne, /* 2,17 latin-1 to NeXT */
  1999.     xl143, /* 2,18 latin-1 to CP437 */
  2000.     xl185, /* 2,19 latin-1 to CP850 */
  2001.     xl152, /* 2,20 latin-1 to CP852 */
  2002.     xl1aq, /* 2,21 latin-1 to Macintosh Latin */
  2003.     xl1dg, /* 2,22 latin-1 to DGI */
  2004.     xl1r8, /* 2,23 latin-1 to HP Roman8 */
  2005.     zl1as, /* 2,24 latin-1 to Latin/Cyrillic */
  2006.     zl1as,                      /* 2,25 latin-1 to CP866 */
  2007.     xl1sk,                      /* 2,26 latin-1 to Short KOI */
  2008.     zl1as,         /* 2,27 latin-1 to Old KOI-8 Cyrillic */
  2009.     NULL, /* 2,28 latin-1 to JIS-7 */
  2010.     NULL, /* 2,29 latin-1 to Shift-JIS */
  2011.     NULL, /* 2,30 latin-1 to J-EUC */
  2012.     NULL, /* 2,31 latin-1 to DEC Kanji */
  2013.     xl1h7, /* 2,32 latin-1 to Hebrew-7 */
  2014.     xl1lh, /* 2,33 latin-1 to Latin/Hebrew */
  2015.     xl162, /* 2,34 latin-1 to CP862 Hebrew */
  2016.     xl1eg, /* 2,35 latin-1 to ELOT 927 Greek */
  2017.     xl1lg, /* 2,36 latin-1 to Latin/Greek */
  2018.     xl169, /* 2,37 latin-1 to CP869 */
  2019.     NULL, /* 2,38 latin-1 to Latin9 */
  2020.     xl185, /* 2,39 latin-1 to CP858 */
  2021.     zl1as, /* 2,40 latin-1 to CP855 */
  2022.     zl1as, /* 2,41 latin-1 to CP1251 */
  2023.     zl1as, /* 2,42 latin-1 to Bulgarian */
  2024.     xl11250, /* 2,43 latin-1 to CP1250 */
  2025.     xl1mz, /* 2,44 latin-1 to Mazovia */
  2026.     NULL, /* 2,45 latin-1 to UCS-2 */
  2027.     NULL, /* 2,46 latin-1 to UTF-8 */
  2028.     zl1as, /* 2,47 latin-1 to KOI8R */
  2029.     zl1as, /* 2,48 latin-1 to KOI8U */
  2030.     xl2as, /* 3,0 latin-2 to us ascii */
  2031.     xl2as, /* 3,1 latin-2 to uk ascii */
  2032.     xl2as, /* 3,2 latin-2 to dutch nrc */
  2033.     xl2as, /* 3,3 latin-2 to finnish nrc */
  2034.     xl2as, /* 3,4 latin-2 to french nrc */
  2035.     xl2as, /* 3,5 latin-2 to fr-canadian nrc */
  2036.     xl2as, /* 3,6 latin-2 to german nrc */
  2037.     xl2as, /* 3,7 latin-2 to italian nrc */
  2038.     xl2as, /* 3,8 latin-2 to hungarian nrc */
  2039.     xl2as, /* 3,9 latin-2 to norge/danish nrc */
  2040.     xl2as, /* 3,10 latin-2 to portuguese nrc */
  2041.     xl2as, /* 3,11 latin-2 to spanish nrc */
  2042.     xl2as, /* 3,12 latin-2 to swedish nrc */
  2043.     xl2as, /* 3,13 latin-2 to swiss nrc */
  2044.     xl2l1, /* 3,14 latin-2 to latin-1 */
  2045.     NULL, /* 3,15 latin-2 to latin-2 */
  2046.     xl2l1, /* 3,16 latin-2 to DEC MCS */
  2047.     xl2ne, /* 3,17 latin-2 to NeXT */
  2048.     xl243, /* 3,18 latin-2 to CP437 */
  2049.     xl285, /* 3,19 latin-2 to CP850 */
  2050.     xl252, /* 3,20 latin-2 to CP852 */
  2051.     xl2aq, /* 3,21 latin-2 to Macintosh Latin */
  2052.     xl2dg, /* 3,22 latin-2 to DGI */
  2053.     xl2r8, /* 3,23 latin-2 to HP */
  2054.     xl2as, /* 3,24 latin-2 to Latin/Cyrillic */
  2055.     xl2as,                      /* 3,25 latin-2 to CP866 */
  2056.     xl2sk,                      /* 3,26 latin-2 to Short KOI */
  2057.     xl2as,         /* 3,27 latin-2 to Old KOI-8 Cyrillic */
  2058.     NULL, /* 3,28 latin-2 to JIS-7 */
  2059.     NULL, /* 3,29 latin-2 to Shift-JIS */
  2060.     NULL, /* 3,30 latin-2 to J-EUC */
  2061.     NULL, /* 3,31 latin-2 to DEC Kanji */
  2062.     xl2h7, /* 3,32 latin-2 to Hebrew-7 */
  2063.     xl2as, /* 3,33 latin-2 to Latin/Hebrew */
  2064.     xl2as, /* 3,34 latin-2 to CP862 Hebrew */
  2065.     xassk, /* 3,35 latin-2 to ELOT 927 Greek */
  2066.     xl2as, /* 3,36 latin-2 to Latin/Greek */
  2067.     xl2as, /* 3,37 latin-2 to CP869 */
  2068.     xl2l9, /* 3,38 latin-2 to Latin-9 */
  2069.     xl258, /* 3,39 latin-2 to CP858 */
  2070.     xl2as, /* 3,40 latin-2 to CP855 */
  2071.     xl2as, /* 3,41 latin-2 to CP1251 */
  2072.     xl2as, /* 3,42 latin-2 to Bulgarian */
  2073.     xl21250, /* 3,43 latin-2 to CP1250 */
  2074.     xl2mz, /* 3,44 latin-2 to Mazovia */
  2075.     NULL, /* 3,45 latin-2 to UCS-2 */
  2076.     NULL, /* 3,46 latin-2 to UTF-8 */
  2077.     xl2as, /* 3,47 latin-2 to KOI8R */
  2078.     xl2as, /* 3,48 latin-2 to KOI8U */
  2079.     xlcas, /* 4,0 latin/cyrillic to us ascii */
  2080.     xlcas, /* 4,1 latin/cyrillic to uk ascii */
  2081.     xlcas,          /* 4,2 latin/cyrillic to dutch nrc */
  2082.     xlcas, /* 4,3 latin/cyrillic to finnish ascii */
  2083.     xlcas, /* 4,4 latin/cyrillic to french nrc */
  2084.     xlcas, /* 4,5 latin/cyrillic to fr-canadian nrc */
  2085.     xlcas, /* 4,6 latin/cyrillic to german nrc */
  2086.     xlcas, /* 4,7 latin/cyrillic to italian nrc */
  2087.     xlcas, /* 4,8 latin/cyrillic to hungarian nrc */
  2088.     xlcas, /* 4,9 latin/cyrillic to norge/danish nrc */
  2089.     xlcas, /* 4,10 latin/cyrillic to portuguese nrc */
  2090.     xlcas, /* 4,11 latin/cyrillic to spanish nrc */
  2091.     xlcas, /* 4,12 latin/cyrillic to swedish nrc */
  2092.     xlcas, /* 4,13 latin/cyrillic to swiss nrc */
  2093.     xlcas, /* 4,14 latin/cyrillic to latin-1 */
  2094.     xlcas, /* 4,15 latin/cyrillic to latin-2 */
  2095.     xlcas, /* 4,16 latin/cyrillic to DEC MCS */
  2096.     xlcas, /* 4,17 latin/cyrillic to NeXT */
  2097.     xlcas, /* 4,18 latin/cyrillic to CP437 */
  2098.     xlcas, /* 4,19 latin/cyrillic to CP850 */
  2099.     xlcas, /* 4,20 latin/cyrillic to CP852 */
  2100.     xlcas, /* 4,21 latin/cyrillic to Macintosh Latin */
  2101.     xlcas, /* 4,22 latin/cyrillic to DGI */
  2102.     xlcas, /* 4,23 latin/cyrillic to HP */
  2103.     NULL,                       /* 4,24 latin/cyrillic to Latin/Cyrillic */
  2104.     xlcac,                      /* 4,25 latin/cyrillic to CP866 */
  2105.     xlcsk,                      /* 4,26 latin/cyrillic to Short KOI */
  2106.     xlck8,         /* 4,27 latin/cyrillic to Old KOI-8 Cyrillic */
  2107.     NULL, /* 4,28 latin/cyril to JIS-7 */
  2108.     NULL, /* 4,29 latin/cyril to Shift-JIS */
  2109.     NULL, /* 4,30 latin/cyril to J-EUC */
  2110.     NULL, /* 4,31 latin/cyril to DEC Kanji */
  2111.     xlch7, /* 4,32 latin/cyril to Hebrew-7 */
  2112.     xlcas, /* 4,33 latin/cyril to Latin/Hebrew */
  2113.     xlcas, /* 4,34 latin/cyril to CP862 Hebrew */
  2114.     xassk, /* 4,35 latin/cyril to ELOT 927 Greek */
  2115.     xleft160, /* 4,36 latin/cyril to Latin/Greek */
  2116.     xleft128, /* 4,37 latin/cyril to CP869 */
  2117.     xlcas, /* 4,38 latin/cyril to latin-9 */
  2118.     xlcas, /* 4,39 latin/cyril to CP858 */
  2119.     xlc55, /* 4,40 latin/cyril to CP855 */
  2120.     xlc1251, /* 4,41 latin/cyril to CP1251 */
  2121.     xlcbu, /* 4,42 latin/cyril to Bulgarian */
  2122.     xlcas, /* 4,43 latin/cyril to CP1250 */
  2123.     xlcas, /* 4,44 latin/cyril to Mazovia */
  2124.     NULL, /* 4,45 latin/cyril to UCS-2 */
  2125.     NULL, /* 4,46 latin/cyril to UTF-8 */
  2126.     xlckr, /* 4,47 latin/cyril to KOI8R */
  2127.     xlcku, /* 4,48 latin/cyril to KOI8U */
  2128.     NULL, /* 5,00 */
  2129.     NULL, /* 5,01 */
  2130.     NULL, /* 5,02 */
  2131.     NULL, /* 5,03 */
  2132.     NULL, /* 5,04 */
  2133.     NULL, /* 5,05 */
  2134.     NULL, /* 5,06 */
  2135.     NULL, /* 5,07 */
  2136.     NULL, /* 5,08 */
  2137.     NULL, /* 5,09 */
  2138.     NULL, /* 5,10 */
  2139.     NULL, /* 5,11 */
  2140.     NULL, /* 5,12 */
  2141.     NULL, /* 5,13 */
  2142.     NULL, /* 5,14 */
  2143.     NULL, /* 5,15 */
  2144.     NULL, /* 5,16 */
  2145.     NULL, /* 5,17 */
  2146.     NULL, /* 5,18 */
  2147.     NULL, /* 5,19 */
  2148.     NULL, /* 5,20 */
  2149.     NULL, /* 5,21 */
  2150.     NULL, /* 5,22 */
  2151.     NULL, /* 5,23 */
  2152.     NULL, /* 5,24 */
  2153.     NULL, /* 5,25 */
  2154.     NULL, /* 5,26 */
  2155.     NULL, /* 5,27 */
  2156.     NULL, /* 5,28 */
  2157.     NULL, /* 5,29 */
  2158.     NULL, /* 5,30 */
  2159.     NULL, /* 5,31 */
  2160.     NULL, /* 5,32 */
  2161.     NULL, /* 5,33 */
  2162.     NULL, /* 5,34 */
  2163.     NULL, /* 5,35 */
  2164.     NULL, /* 5,36 */
  2165.     NULL, /* 5,37 */
  2166.     NULL, /* 5,38 */
  2167.     NULL, /* 5,39 */
  2168.     NULL, /* 5,40 */
  2169.     NULL, /* 5,41 */
  2170.     NULL, /* 5,42 */
  2171.     NULL, /* 5,43 */
  2172.     NULL, /* 5,44 */
  2173.     NULL, /* 5,45 */
  2174.     NULL, /* 5,46 */
  2175.     NULL, /* 5,47 */
  2176.     NULL, /* 5,48 */
  2177.     xlhas, /* 6,0 latin/hebrew to us ascii */
  2178.     xlhas, /* 6,1 latin/hebrew to uk ascii */
  2179.     xlhas,          /* 6,2 latin/hebrew to dutch nrc */
  2180.     xlhas, /* 6,3 latin/hebrew to finnish ascii */
  2181.     xlhas, /* 6,4 latin/hebrew to french nrc */
  2182.     xlhas, /* 6,5 latin/hebrew to fr-canadian nrc */
  2183.     xlhas, /* 6,6 latin/hebrew to german nrc */
  2184.     xlhas, /* 6,7 latin/hebrew to italian nrc */
  2185.     xlhas, /* 6,8 latin/hebrew to hungarian nrc */
  2186.     xlhas, /* 6,9 latin/hebrew to norge/danish nrc */
  2187.     xlhas, /* 6,10 latin/hebrew to portuguese nrc */
  2188.     xlhas, /* 6,11 latin/hebrew to spanish nrc */
  2189.     xlhas, /* 6,12 latin/hebrew to swedish nrc */
  2190.     xlhas, /* 6,13 latin/hebrew to swiss nrc */
  2191.     xlhl1, /* 6,14 latin/hebrew to latin-1 */
  2192.     xlhas, /* 6,15 latin/hebrew to latin-2 */
  2193.     xlhl1, /* 6,16 latin/hebrew to DEC MCS */
  2194.     xlhas, /* 6,17 latin/hebrew to NeXT */
  2195.     xlhas, /* 6,18 latin/hebrew to CP437 */
  2196.     xlhas, /* 6,19 latin/hebrew to CP850 */
  2197.     xlhas, /* 6,20 latin/hebrew to CP852 */
  2198.     xlhas, /* 6,21 latin/hebrew to Macintosh Latin */
  2199.     xlhas, /* 6,22 latin/hebrew to DGI */
  2200.     xlhas,                      /* 6,23 latin/hebrew to HP */
  2201.     xlhas,                      /* 6,24 latin/hebrew to Latin/Cyrillic */
  2202.     xlhas,                      /* 6,25 latin/hebrew to CP866 */
  2203.     NULL,                       /* 6,26 latin/hebrew to Short KOI */
  2204.     xlhas,         /* 6,27 latin/hebrew to Old KOI-8 Cyrillic */
  2205.     NULL, /* 6,28 latin/hebrew to JIS-7 */
  2206.     NULL, /* 6,29 latin/hebrew to Shift-JIS */
  2207.     NULL, /* 6,30 latin/hebrew to J-EUC */
  2208.     NULL, /* 6,31 latin/hebrew to DEC Kanji */
  2209.     xlhh7, /* 6,32 latin/hebrew to Hebrew-7 */
  2210.     NULL, /* 6,33 latin/hebrew to Latin/Hebrew */
  2211.     xlh62, /* 6,34 latin/hebrew to CP862 Hebrew */
  2212.     NULL, /* 6,35 latin/hebrew to ELOT 927 Greek */
  2213.     xlhas, /* 6,36 latin/hebrew to Latin/Greek */
  2214.     xlhas, /* 6,37 latin/hebrew to CP869 */
  2215.     xlhas, /* 6,38 latin/hebrew to Latin-9 */
  2216.     xlhas, /* 6,39 latin/hebrew to CP858 */
  2217.     xlhas, /* 6,40 latin/hebrew to CP855 */
  2218.     xlhas, /* 6,41 latin/hebrew to CP1251 */
  2219.     xlhas, /* 6,42 latin/hebrew to Bulgarian */
  2220.     xlhas, /* 6,43 latin/hebrew to CP1250 */
  2221.     xlhas, /* 6,44 latin/hebrew to Mazovia */
  2222.     NULL, /* 6,45 latin/hebrew to UCS-2 */
  2223.     NULL, /* 6,46 latin/hebrew to UTF-8 */
  2224.     NULL, /* 6,47 latin/hebrew to KOI8R */
  2225.     NULL, /* 6,48 latin/hebrew to KOI8U */
  2226.     xlgas, /* 7,0 latin/greek to us ascii */
  2227.     xlgas, /* 7,1 latin/greek to uk ascii */
  2228.     xlgas,          /* 7,2 latin/greek to dutch nrc */
  2229.     xlgas, /* 7,3 latin/greek to finnish ascii */
  2230.     xlgas, /* 7,4 latin/greek to french nrc */
  2231.     xlgas, /* 7,5 latin/greek to fr-canadian nrc */
  2232.     xlgas, /* 7,6 latin/greek to german nrc */
  2233.     xlgas, /* 7,7 latin/greek to italian nrc */
  2234.     xlgas, /* 7,8 latin/greek to hungarian nrc */
  2235.     xlgas, /* 7,9 latin/greek to norge/danish nrc */
  2236.     xlgas, /* 7,10 latin/greek to portuguese nrc */
  2237.     xlgas, /* 7,11 latin/greek to spanish nrc */
  2238.     xlgas, /* 7,12 latin/greek to swedish nrc */
  2239.     xlgas, /* 7,13 latin/greek to swiss nrc */
  2240.     xlgas, /* 7,14 latin/greek to latin-1 */
  2241.     xlgas, /* 7,15 latin/greek to latin-2 */
  2242.     xlgas, /* 7,16 latin/greek to DEC MCS */
  2243.     xlgas, /* 7,17 latin/greek to NeXT */
  2244.     xlgas, /* 7,18 latin/greek to CP437 */
  2245.     xlgas, /* 7,19 latin/greek to CP850 */
  2246.     xlgas, /* 7,20 latin/greek to CP852 */
  2247.     xlgas, /* 7,21 latin/greek to Macintosh Latin */
  2248.     xlgas, /* 7,22 latin/greek to DGI */
  2249.     xlgas, /* 7,23 latin/greek to HP */
  2250.     xleft160,                   /* 7,24 latin/greek to Latin/Cyrillic */
  2251.     xleft128,                   /* 7,25 latin/greek to CP866 */
  2252.     xassk,                      /* 7,26 latin/greek to Short KOI */
  2253.     xleft160,         /* 7,27 latin/greek to Old KOI-8 Greek */
  2254.     NULL, /* 7,28 latin/greek to JIS-7 */
  2255.     NULL, /* 7,29 latin/greek to Shift-JIS */
  2256.     NULL, /* 7,30 latin/greek to J-EUC */
  2257.     NULL, /* 7,31 latin/greek to DEC Kanji */
  2258.     NULL, /* 7,32 latin/greek to Hebrew-7 */
  2259.     xlgas, /* 7,33 latin/greek to Latin/Hebrew */
  2260.     xlgas, /* 7,34 latin/greek to CP862 Hebrew */
  2261.     xlgeg, /* 7,35 latin/greek to ELOT 927 Greek */
  2262.     NULL, /* 7,36 latin/greek to Latin/Greek */
  2263.     xlg69, /* 7,37 latin/greek to CP869 */
  2264.     xlgas, /* 7,38 latin/greek to Latin-9 */
  2265.     xlgas, /* 7,39 latin/greek to CP858 */
  2266.     xleft128, /* 7,40 latin/greek to CP855 */
  2267.     xleft128, /* 7,41 latin/greek to CP1251 */
  2268.     xleft128, /* 7,42 latin/greek to Bulgarian */
  2269.     xleft128, /* 7,43 latin/greek to CP1250 */
  2270.     xleft128, /* 7,44 latin/greek to Mazovia */
  2271.     NULL, /* 7,45 latin/greek to UCS-2 */
  2272.     NULL, /* 7,46 latin/greek to UTF-8 */
  2273.     NULL, /* 7,47 latin/greek to KOI8R */
  2274.     NULL, /* 7,48 latin/greek to KOI8U */
  2275.     zl9as, /* 8,0 latin-9 to us ascii */
  2276.     xl1uk, /* 8,1 latin-9 to uk ascii */
  2277.     xl1du, /* 8,2 latin-9 to dutch nrc */
  2278.     xl1fi, /* 8,3 latin-9 to finnish nrc */
  2279.     xl1fr, /* 8,4 latin-9 to french nrc */
  2280.     xl1fc, /* 8,5 latin-9 to fr-canadian nrc */
  2281.     xl1ge, /* 8,6 latin-9 to german nrc */
  2282.     xl1it, /* 8,7 latin-9 to italian nrc */
  2283.     xl1hu, /* 8,8 latin-9 to hungarian nrc */
  2284.     xl1no, /* 8,9 latin-9 to norge/danish nrc */
  2285.     xl1po, /* 8,10 latin-9 to portuguese nrc */
  2286.     xl1sp, /* 8,11 latin-9 to spanish nrc */
  2287.     xl1sw, /* 8,12 latin-9 to swedish nrc */
  2288.     xl1ch, /* 8,13 latin-9 to swiss nrc */
  2289.     NULL, /* 8,14 latin-9 to latin-1 */
  2290.     xl1l2, /* 8,15 latin-9 to latin-2 */
  2291.     xl9dm, /* 8,16 latin-9 to DEC MCS */
  2292.     xl9ne, /* 8,17 latin-9 to NeXT */
  2293.     xl143, /* 8,18 latin-9 to CP437 */
  2294.     xl185, /* 8,19 latin-9 to CP850 */
  2295.     xl152, /* 8,20 latin-9 to CP852 */
  2296.     xl1aq, /* 8,21 latin-9 to Macintosh Latin */
  2297.     xl1dg, /* 8,22 latin-9 to DGI */
  2298.     xl1r8, /* 8,23 latin-9 to HP Roman8 */
  2299.     zl1as, /* 8,24 latin-9 to Latin/Cyrillic */
  2300.     zl1as,                      /* 8,25 latin-9 to CP866 */
  2301.     xl1sk,                      /* 8,26 latin-9 to Short KOI */
  2302.     zl1as,         /* 8,27 latin-9 to Old KOI-8 Cyrillic */
  2303.     NULL, /* 8,28 latin-9 to JIS-7 */
  2304.     NULL, /* 8,29 latin-9 to Shift-JIS */
  2305.     NULL, /* 8,30 latin-9 to J-EUC */
  2306.     NULL, /* 8,31 latin-9 to DEC Kanji */
  2307.     xl1h7, /* 8,32 latin-9 to Hebrew-7 */
  2308.     xl1lh, /* 8,33 latin-9 to Latin/Hebrew */
  2309.     xl162, /* 8,34 latin-9 to CP862 Hebrew */
  2310.     xl1eg, /* 8,35 latin-9 to ELOT 927 Greek */
  2311.     xl1lg, /* 8,36 latin-9 to Latin/Greek */
  2312.     xl169, /* 8,37 latin-9 to CP869 */
  2313.     NULL, /* 8,38 latin-9 to Latin9 */
  2314.     xl958, /* 8,39 latin-9 to CP858 */
  2315.     zl1as, /* 8,40 latin-9 to CP855 */
  2316.     zl1as, /* 8,41 latin-9 to CP1251 */
  2317.     xl1as, /* 8,42 latin-9 to Bulgarian */
  2318.     xl91250, /* 8,43 latin-9 to CP1250 */
  2319.     xl9mz, /* 8,44 latin-9 to Mazovia */
  2320.     NULL, /* 8,45 latin-9 to UCS-2 */
  2321.     NULL, /* 8,46 latin-9 to UTF-8 */
  2322.     zl1as, /* 8,47 latin-9 to KOI8-R */
  2323.     zl1as, /* 8,48 latin-9 to KOI8-U */
  2324.     NULL, /* 9,00 Unicode... */
  2325.     NULL, /* 9,01 */
  2326.     NULL, /* 9,02 */
  2327.     NULL, /* 9,03 */
  2328.     NULL, /* 9,04 */
  2329.     NULL, /* 9,05 */
  2330.     NULL, /* 9,06 */
  2331.     NULL, /* 9,07 */
  2332.     NULL, /* 9,08 */
  2333.     NULL, /* 9,09 */
  2334.     NULL, /* 9,10 */
  2335.     NULL, /* 9,11 */
  2336.     NULL, /* 9,12 */
  2337.     NULL, /* 9,13 */
  2338.     NULL, /* 9,14 */
  2339.     NULL, /* 9,15 */
  2340.     NULL, /* 9,16 */
  2341.     NULL, /* 9,17 */
  2342.     NULL, /* 9,18 */
  2343.     NULL, /* 9,19 */
  2344.     NULL, /* 9,20 */
  2345.     NULL, /* 9,21 */
  2346.     NULL, /* 9,22 */
  2347.     NULL, /* 9,23 */
  2348.     NULL, /* 9,24 */
  2349.     NULL, /* 9,25 */
  2350.     NULL, /* 9,26 */
  2351.     NULL, /* 9,27 */
  2352.     NULL, /* 9,28 */
  2353.     NULL, /* 9,29 */
  2354.     NULL, /* 9,30 */
  2355.     NULL, /* 9,31 */
  2356.     NULL, /* 9,32 */
  2357.     NULL, /* 9,33 */
  2358.     NULL, /* 9,34 */
  2359.     NULL, /* 9,35 */
  2360.     NULL, /* 9,36 */
  2361.     NULL, /* 9,37 */
  2362.     NULL, /* 9,38 */
  2363.     NULL, /* 9,39 */
  2364.     NULL, /* 9,40 */
  2365.     NULL, /* 9,41 */
  2366.     NULL, /* 9,42 */
  2367.     NULL, /* 9,43 */
  2368.     NULL, /* 9,44 */
  2369.     NULL, /* 9,45 */
  2370.     NULL, /* 9,46 */
  2371.     NULL, /* 9,47 */
  2372.     NULL, /* 9,48 */
  2373.     NULL, /* 10,00 */
  2374.     NULL, /* 10,01 */
  2375.     NULL, /* 10,02 */
  2376.     NULL, /* 10,03 */
  2377.     NULL, /* 10,04 */
  2378.     NULL, /* 10,05 */
  2379.     NULL, /* 10,06 */
  2380.     NULL, /* 10,07 */
  2381.     NULL, /* 10,08 */
  2382.     NULL, /* 10,09 */
  2383.     NULL, /* 10,10 */
  2384.     NULL, /* 10,11 */
  2385.     NULL, /* 10,12 */
  2386.     NULL, /* 10,13 */
  2387.     NULL, /* 10,14 */
  2388.     NULL, /* 10,15 */
  2389.     NULL, /* 10,16 */
  2390.     NULL, /* 10,17 */
  2391.     NULL, /* 10,18 */
  2392.     NULL, /* 10,19 */
  2393.     NULL, /* 10,20 */
  2394.     NULL, /* 10,21 */
  2395.     NULL, /* 10,22 */
  2396.     NULL, /* 10,23 */
  2397.     NULL, /* 10,24 */
  2398.     NULL, /* 10,25 */
  2399.     NULL, /* 10,26 */
  2400.     NULL, /* 10,27 */
  2401.     NULL, /* 10,28 */
  2402.     NULL, /* 10,29 */
  2403.     NULL, /* 10,30 */
  2404.     NULL, /* 10,31 */
  2405.     NULL, /* 10,32 */
  2406.     NULL, /* 10,33 */
  2407.     NULL, /* 10,34 */
  2408.     NULL, /* 10,35 */
  2409.     NULL, /* 10,36 */
  2410.     NULL, /* 10,37 */
  2411.     NULL, /* 10,38 */
  2412.     NULL, /* 10,39 */
  2413.     NULL, /* 10,40 */
  2414.     NULL, /* 10,41 */
  2415.     NULL, /* 10,42 */
  2416.     NULL, /* 10,43 */
  2417.     NULL, /* 10,44 */
  2418.     NULL, /* 10,45 */
  2419.     NULL, /* 10,46 */
  2420.     NULL, /* 10,47 */
  2421.     NULL /* 10,48 */
  2422. };
  2423. int nxlr = (sizeof(xlr) / sizeof(CHAR *));
  2424. /*
  2425.   Translation function table for sending files.
  2426.   Array of pointers to functions for translating from the local file
  2427.   character set to the transfer character set.  Indexed in the same
  2428.   way as the xlr array above, but with the indices reversed.
  2429. */
  2430. #ifdef CK_ANSIC
  2431. CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])(CHAR) =
  2432. #else
  2433. CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])() =
  2434. #endif /* CK_ANSIC */
  2435. {
  2436.     NULL, /* 0,0 us ascii to transparent */
  2437.     NULL, /* 0,1 uk ascii to transparent */
  2438.     NULL, /* 0,2 dutch nrc to transparent */
  2439.     NULL, /* 0,3 finnish nrc to transparent */
  2440.     NULL, /* 0,4 french nrc to transparent */
  2441.     NULL, /* 0,5 fr-canadian nrc to transparent */
  2442.     NULL, /* 0,6 german nrc to transparent */
  2443.     NULL, /* 0,7 hungarian nrc to transparent */
  2444.     NULL, /* 0,8 italian nrc to transparent */
  2445.     NULL, /* 0,9 norge/danish nrc to transparent */
  2446.     NULL, /* 0,10 portuguese nrc to transparent */
  2447.     NULL, /* 0,11 spanish nrc to transparent */
  2448.     NULL, /* 0,12 swedish nrc to transparent */
  2449.     NULL, /* 0,13 swiss nrc to transparent */
  2450.     NULL, /* 0,14 latin-1 to transparent */
  2451.     NULL, /* 0,15 latin-2 to transparent */
  2452.     NULL, /* 0,16 DEC MCS to transparent */
  2453.     NULL, /* 0,17 NeXT to transparent */
  2454.     NULL, /* 0,18 CP437 to transparent */
  2455.     NULL, /* 0,19 CP850 to transparent */
  2456.     NULL, /* 0,20 CP852 to transparent */
  2457.     NULL, /* 0,21 Macintosh Latin to transparent */
  2458.     NULL, /* 0,22 DGI to transparent */
  2459.     NULL, /* 0,23 HP to transparent */
  2460.     NULL, /* 0,24 Latin/Cyrillic to transparent */
  2461.     NULL,                       /* 0,25 CP866 to transparent */
  2462.     NULL,                       /* 0,26 Short KOI to transparent */
  2463.     NULL,                       /* 0,27 Old KOI-8 to transparent */
  2464.     NULL, /* 0,28 JIS-7 to transparent */
  2465.     NULL, /* 0,29 Shift JIS to transparent */
  2466.     NULL, /* 0,30 Japanese EUC to transparent */
  2467.     NULL, /* 0,31 DEC Kanji to transparent */
  2468.     NULL, /* 0,32 Hebrew-7 to transparent */
  2469.     NULL, /* 0,33 Latin/Hebrew to transparent */
  2470.     NULL, /* 0,34 CP862 Hebrew to transparent */
  2471.     NULL, /* 0,35 ELOT 927 Greek to transparent */
  2472.     NULL, /* 0,36 Latin/Greek to transparent */
  2473.     NULL, /* 0,37 CP869 to transparent */
  2474.     NULL, /* 0,38 Latin-9 to transparent */
  2475.     NULL, /* 0,39 CP858 to transparent */
  2476.     NULL, /* 0,40 CP855 to transparent */
  2477.     NULL, /* 0,41 CP1251 to transparent */
  2478.     NULL, /* 0,42 Bulgarian to transparent */
  2479.     NULL, /* 0,43 CP1250 to transparent */
  2480.     NULL, /* 0,44 Mazovia to transparent */
  2481.     NULL, /* 0,45 UCS-2 to transparent */
  2482.     NULL, /* 0,46 UTF-8 to transparent */
  2483.     NULL, /* 0,47 KOI8R to transparent */
  2484.     NULL, /* 0,48 KOI8U to transparent */
  2485.     NULL, /* 1,0 us ascii to ascii */
  2486.     NULL, /* 1,1 uk ascii to ascii */
  2487.     xduas, /* 1,2 dutch nrc to ascii */
  2488.     xfias, /* 1,3 finnish nrc to ascii */
  2489.     xfras, /* 1,4 french nrc to ascii */
  2490.     xfcas, /* 1,5 french canadian nrc to ascii */
  2491.     xgeas, /* 1,6 german nrc to ascii */
  2492.     xhuas, /* 1,7 hungarian nrc to ascii */
  2493.     xitas, /* 1,8 italian nrc to ascii */
  2494.     xnoas, /* 1,9 norwegian/danish nrc to ascii */
  2495.     xpoas, /* 1,10 portuguese nrc to ascii */
  2496.     xspas, /* 1,11 spanish nrc to ascii */
  2497.     xswas, /* 1,12 swedish nrc to ascii */
  2498.     xchas, /* 1,13 swiss nrc to ascii */
  2499.     xl1as, /* 1,14 latin-1 to ascii */
  2500.     xl2as, /* 1,15 latin-2 to ascii */
  2501.     xdmas, /* 1,16 dec mcs to ascii */
  2502.     xneas, /* 1,17 NeXT to ascii */
  2503.     x43as, /* 1,18 CP437 to ascii */
  2504.     x85as, /* 1,19 CP850 to ascii */
  2505.     x52as, /* 1,20 CP850 to ascii */
  2506.     xaqas, /* 1,21 Macintosh Latin to ascii */
  2507.     xdgas, /* 1,22 DGI to ascii */
  2508.     xr8as, /* 1,23 HP to ASCII */
  2509.     xlcas, /* 1,24 Latin/Cyrillic to ASCII */
  2510.     xacas,                      /* 1,25 CP866 to ASCII */
  2511.     xskas, /* 1,26 Short KOI to ASCII */
  2512.     xk8as,                      /* 1,27 Old KOI-8 Cyrillic to ASCII */
  2513.     NULL, /* 1,28 */
  2514.     NULL, /* 1,29 */
  2515.     NULL, /* 1,30 */
  2516.     NULL, /* 1,31 */
  2517.     xh7as, /* 1,32 Hebrew-7 to ASCII */
  2518.     xlhas, /* 1,33 Latin/Hebrew to ASCII */
  2519.     x62as, /* 1,34 CP862 Hebrew to ASCII */
  2520.     xegas, /* 1,35 ELOT 927 Greek to ASCII */
  2521.     xlgas, /* 1,36 Latin/Greek to ASCII */
  2522.     x69as, /* 1,37 CP869 to ASCII */
  2523.     xl9as, /* 1,38 Latin-9 to ASCII */
  2524.     x58as, /* 1,39 CP858 to ASCII */
  2525.     x55as, /* 1,40 CP855 to ASCII */
  2526.     x1251as, /* 1,41 CP1251 to ASCII */
  2527.     xleft128, /* 1,42 Bulgarian to ASCII */
  2528.     x1250as, /* 1,43 CP1250 to ASCII */
  2529.     xmzas, /* 1,44 Mazovia to ASCII */
  2530.     NULL, /* 1,45 UCS-2 to ASCII */
  2531.     NULL, /* 1,46 UTF-8 to ASCII */
  2532.     xk8as, /* 1,47 KOI8R to ASCII */
  2533.     xk8as, /* 1,48 KOI8U to ASCII */
  2534.     NULL, /* 2,0 us ascii to latin-1 */
  2535.     xukl1, /* 2,1 uk ascii to latin-1 */
  2536.     xdul1, /* 2,2 dutch nrc to latin-1 */
  2537.     xfil1, /* 2,3 finnish nrc to latin-1 */
  2538.     xfrl1, /* 2,4 french nrc to latin-1 */
  2539.     xfcl1, /* 2,5 french canadian nrc to latin-1 */
  2540.     xgel1, /* 2,6 german nrc to latin-1 */
  2541.     xhul1, /* 2,7 hungarian nrc to latin-1 */
  2542.     xitl1, /* 2,8 italian nrc to latin-1 */
  2543.     xnol1, /* 2,9 norwegian/danish nrc to latin-1 */
  2544.     xpol1, /* 2,10 portuguese nrc to latin-1 */
  2545.     xspl1, /* 2,11 spanish nrc to latin-1 */
  2546.     xswl1, /* 2,12 swedish nrc to latin-1 */
  2547.     xchl1, /* 2,13 swiss nrc to latin-1 */
  2548.     NULL, /* 2,14 latin-1 to latin-1 */
  2549.     xl2l1, /* 2,15 latin-2 to latin-1 */
  2550.     xdml1, /* 2,16 dec mcs to latin-1 */
  2551.     xnel1,                      /* 2,17 NeXT to Latin-1 */
  2552.     x43l1,                      /* 2,18 CP437 to Latin-1 */
  2553.     x85l1,                      /* 2,19 CP850 to Latin-1 */
  2554.     x52l1,                      /* 2,20 CP852 to Latin-1 */
  2555.     xaql1,                      /* 2,21 Macintosh Latin to Latin-1 */
  2556.     xdgl1,                      /* 2,22 DGI to Latin-1 */
  2557.     xr8l1,                      /* 2,23 HP to Latin-1 */
  2558.     xlcas,                      /* 2,24 Latin/Cyrillic to Latin-1 */
  2559.     xacas,                      /* 2,25 CP866 to Latin-1 */
  2560.     xskas,                      /* 2,26 Short KOI to Latin-1 */
  2561.     xk8as,                      /* 2,27 Old KOI-8 Cyrillic to Latin-1 */
  2562.     NULL, /* 2,28 Kanji ... */
  2563.     NULL, /* 2,29 */
  2564.     NULL, /* 2,30 */
  2565.     NULL, /* 2,31 */
  2566.     xh7as, /* 2,32 Hebrew-7 to Latin-1 */
  2567.     xlhl1, /* 2,33 Latin/Hebrew to Latin-1 */
  2568.     x62l1, /* 2,34 CP862 Hebrew to Latin-1 */
  2569.     xegas, /* 2,35 ELOT 927 Greek to Latin-1 */
  2570.     xlgl1, /* 2,36 Latin/Greek to Latin-1 */
  2571.     NULL, /* 2,37 CP869 to Latin-1 */
  2572.     NULL, /* 2,38 Latin-9 to Latin-1 */
  2573.     x58l1, /* 2,39 CP858 to Latin-1 */
  2574.     x55as, /* 2,40 CP855 to Latin-1 */
  2575.     x1251as, /* 2,41 CP1251 to Latin-1 */
  2576.     xleft128, /* 2,42 Bulgarian to Latin-1 */
  2577.     x1250l1, /* 2,43 CP1250 to Latin-1 */
  2578.     xmzl1, /* 2,44 Mazovia to Latin-1 */
  2579.     NULL, /* 2,45 UCS-2 to Latin-1 */
  2580.     NULL, /* 2,46 UTF-8 to Latin-1 */
  2581.     xk8as, /* 2,47 KOI8R to Latin-1 */
  2582.     xk8as, /* 2,48 KOI8U to Latin-1 */
  2583.     NULL, /* 3,0 us ascii to latin-2 */
  2584.     NULL, /* 3,1 uk ascii to latin-2 */
  2585.     xduas, /* 3,2 dutch nrc to latin-2 */
  2586.     xfias, /* 3,3 finnish nrc to latin-2 */
  2587.     xfras, /* 3,4 french nrc to latin-2 */
  2588.     xfcas, /* 3,5 french canadian nrc to latin-2 */
  2589.     xgel2, /* 3,6 german nrc to latin-2 */
  2590.     xhul2, /* 3,7 hungarian nrc to latin-2 */
  2591.     xitas, /* 3,8 italian nrc to latin-2 */
  2592.     xnoas, /* 3,9 norwegian/danish nrc to latin-2 */
  2593.     xpoas, /* 3,10 portuguese nrc to latin-2 */
  2594.     xspas, /* 3,11 spanish nrc to latin-2 */
  2595.     xswas, /* 3,12 swedish nrc to latin-2 */
  2596.     xchas, /* 3,13 swiss nrc to latin-2 */
  2597.     xl1l2, /* 3,14 latin-1 to latin-2 */
  2598.     NULL, /* 3,15 latin-2 to latin-2 */
  2599.     xl1l2, /* 3,16 dec mcs to latin-2 */
  2600.     xnel2,                      /* 3,17 NeXT to Latin-2 */
  2601.     x43l2,                      /* 3,18 CP437 to Latin-2 */
  2602.     x85l2,                      /* 3,19 CP850 to Latin-2 */
  2603.     x52l2,                      /* 3,20 CP852 to Latin-2 */
  2604.     xaql2,                      /* 3,21 Macintosh Latin to Latin-2 */
  2605.     xdgl2,                      /* 3,22 DGI to Latin-2 */
  2606.     xr8l2,                      /* 3,23 HP to Latin-2 */
  2607.     xlcas,                      /* 3,24 Latin/Cyrillic to Latin-2 */
  2608.     xacas,                      /* 3,25 CP866 to Latin-2 */
  2609.     xskas,                      /* 3,26 Short KOI to Latin-2 */
  2610.     xk8as,                      /* 3,27 Old KOI-8 Cyrillic to Latin-2 */
  2611.     NULL, /* 3,28 Kanji ... */
  2612.     NULL, /* 3,29 */
  2613.     NULL, /* 3,30 */
  2614.     NULL, /* 3,31 */
  2615.     xh7as, /* 3,32 Hebrew-7 to Latin-2 */
  2616.     xlhas, /* 3,33 Latin/Hebrew to Latin-2 */
  2617.     x62as, /* 3,34 CP862 Hebrew to Latin-2 */
  2618.     xegas, /* 3,35 ELOT 927 Greek to Latin-2 */
  2619.     xl2lg, /* 3,36 Latin/Greek to Latin-2 */
  2620.     xleft128, /* 3,37 CP869 to Latin-2 */
  2621.     xl9l2, /* 3,38 Latin-9 to Latin-2 */
  2622.     x58l2, /* 3,39 CP858 to Latin-2 */
  2623.     x55as, /* 3,40 CP855 to Latin-2 */
  2624.     x1251as, /* 3,41 CP1251 to Latin-2 */
  2625.     xleft128, /* 3,42 Bulgarian to Latin-2 */
  2626.     x1250l2, /* 3,43 CP1250 to Latin-2 */
  2627.     xmzl2, /* 3,44 Mazovia to Latin-2 */
  2628.     NULL, /* 3,45 UCS-2 to Latin-2 */
  2629.     NULL, /* 3,46 UTF-8 to Latin-2 */
  2630.     xk8as, /* 3,47 KOI8R to Latin-2 */
  2631.     xk8as, /* 3,48 KOI8U to Latin-2 */
  2632.     xaslc, /* 4,0 us ascii to latin/cyrillic */
  2633.     xaslc, /* 4,1 uk ascii to latin/cyrillic */
  2634.     xduas, /* 4,2 dutch nrc to latin/cyrillic */
  2635.     xfias, /* 4,3 finnish nrc to latin/cyrillic */
  2636.     xfras, /* 4,4 french nrc to latin/cyrillic */
  2637.     xfcas, /* 4,5 french canadian nrc to latin/cyrillic */
  2638.     xgeas, /* 4,6 german nrc to latin/cyrillic */
  2639.     xhuas, /* 4,7 hungarian nrc to latin/cyrillic */
  2640.     xitas, /* 4,8 italian nrc to latin/cyrillic */
  2641.     xnoas, /* 4,9 norge/danish nrc to latin/cyrillic */
  2642.     xpoas, /* 4,10 portuguese nrc to latin/cyrillic */
  2643.     xspas, /* 4,11 spanish nrc to latin/cyrillic */
  2644.     xswas, /* 4,12 swedish nrc to latin/cyrillic */
  2645.     xchas, /* 4,13 swiss nrc to latin/cyrillic */
  2646.     xl1as, /* 4,14 latin-1 to latin/cyrillic */
  2647.     xl2as, /* 4,15 latin-2 to latin/cyrillic */
  2648.     xdmas, /* 4,16 dec mcs to latin/cyrillic */
  2649.     xneas, /* 4,17 NeXT to latin/cyrillic */
  2650.     x43as, /* 4,18 CP437 to latin/cyrillic */
  2651.     x85as, /* 4,19 CP850 to latin/cyrillic */
  2652.     x52as, /* 4,20 CP852 to latin/cyrillic */
  2653.     xaqas, /* 4,21 Macintosh Latin to latin/cyrillic */
  2654.     xdgas, /* 4,22 DGI to Latin/Cyrillic */
  2655.     xr8as, /* 4,23 HP to Latin/Cyrillic */
  2656.     NULL,                       /* 4,24 Latin/Cyrillic to Latin/Cyrillic */
  2657.     xaclc,                      /* 4,25 CP866 to Latin/Cyrillic */
  2658.     xskcy,                      /* 4,26 Short KOI to Latin/Cyrillic */
  2659.     xk8lc,                      /* 4,27 Old KOI-8 Cyrillic to Latin/Cyrillic */
  2660.     NULL, /* 4,28 Kanji... */
  2661.     NULL, /* 4,29 */
  2662.     NULL, /* 4,30 */
  2663.     NULL, /* 4,31 */
  2664.     xh7as, /* 4,32 Hebrew-7 to Latin/Cyrillic */
  2665.     xlhas, /* 4,33 Latin/Hebrew to Latin/Cyrillic */
  2666.     x62as, /* 4,34 CP862 Hebrew to Latin/Cyrillic */
  2667.     xegas, /* 4,35 ELOT 927 Greek to Latin/Cyrillic */
  2668.     xleft160, /* 4,36 Latin/Greek to Latin/Cyrillic */
  2669.     xleft128, /* 4,37 CP869 to Latin/Cyrillic */
  2670.     xl1as, /* 4,38 latin-9 to latin/cyrillic */
  2671.     xleft128, /* 4,39 CP858 to Latin/Cyrillic */
  2672.     x55lc, /* 4,40 CP855 to Latin/Cyrillic */
  2673.     x1251lc, /* 4,41 CP1251 to Latin/Cyrillic */
  2674.     xbulc, /* 4,42 Bulgarian to Latin/Cyrillic */
  2675.     x1250as, /* 4,43 CP1250 to Latin/Cyrillic */
  2676.     xmzas, /* 4,44 Mazovia to Latin/Cyrillic */
  2677.     NULL, /* 4,45 UCS-2 to Latin/Cyrillic */
  2678.     NULL, /* 4,46 UTF-8 to Latin/Cyrillic */
  2679.     xkrlc, /* 4,47 KOI8R to Latin/Cyrillic */
  2680.     xkulc, /* 4,48 KOI8U to Latin/Cyrillic */
  2681.     NULL, /* 5,00 */
  2682.     NULL, /* 5,01 */
  2683.     NULL, /* 5,02 */
  2684.     NULL, /* 5,03 */
  2685.     NULL, /* 5,04 */
  2686.     NULL, /* 5,05 */
  2687.     NULL, /* 5,06 */
  2688.     NULL, /* 4.07 */
  2689.     NULL, /* 5,08 */
  2690.     NULL, /* 5,09 */
  2691.     NULL, /* 5,10 */
  2692.     NULL, /* 5,11 */
  2693.     NULL, /* 5,12 */
  2694.     NULL, /* 5,13 */
  2695.     NULL, /* 5,14 */
  2696.     NULL, /* 5,15 */
  2697.     NULL, /* 5,16 */
  2698.     NULL, /* 5,17 */
  2699.     NULL, /* 5,18 */
  2700.     NULL, /* 5,19 */
  2701.     NULL, /* 5,20 */
  2702.     NULL, /* 5,21 */
  2703.     NULL, /* 5,22 */
  2704.     NULL, /* 5,23 */
  2705.     NULL, /* 5,24 */
  2706.     NULL, /* 5,25 */
  2707.     NULL, /* 5,26 */
  2708.     NULL, /* 5,27 */
  2709.     NULL, /* 5,28 */
  2710.     NULL, /* 5,29 */
  2711.     NULL, /* 5,30 */
  2712.     NULL, /* 5,31 */
  2713.     NULL, /* 5,32 */
  2714.     NULL, /* 5,33 */
  2715.     NULL, /* 5,34 */
  2716.     NULL, /* 5,35 */
  2717.     NULL, /* 5,36 */
  2718.     NULL, /* 5,37 */
  2719.     NULL, /* 5,38 */
  2720.     NULL, /* 5,39 */
  2721.     NULL, /* 5,40 */
  2722.     NULL, /* 5,41 */
  2723.     NULL, /* 5,42 */
  2724.     NULL, /* 5,43 */
  2725.     NULL, /* 5,44 */
  2726.     NULL, /* 5,45 */
  2727.     NULL, /* 5,46 */
  2728.     NULL, /* 5,47 */
  2729.     NULL, /* 5,48 */
  2730.     NULL, /* 6,0 us ascii to Latin/Hebrew */
  2731.     NULL, /* 6,1 uk ascii to Latin/Hebrew */
  2732.     xduas, /* 6,2 dutch nrc to Latin/Hebrew */
  2733.     xfias, /* 6,3 finnish nrc to Latin/Hebrew */
  2734.     xfras, /* 6,4 french nrc to Latin/Hebrew */
  2735.     xfcas, /* 6,5 french canadian nrc to Latin/Hebrew */
  2736.     xgeas, /* 6,6 german nrc to Latin/Hebrew */
  2737.     xhuas, /* 6,7 hungarian nrc to Latin/Hebrew */
  2738.     xitas, /* 6,8 italian nrc to Latin/Hebrew */
  2739.     xnoas, /* 6,9 norge/danish nrc to Latin/Hebrew */
  2740.     xpoas, /* 6,10 portuguese nrc to Latin/Hebrew */
  2741.     xspas, /* 6,11 spanish nrc to Latin/Hebrew */
  2742.     xswas, /* 6,12 swedish nrc to Latin/Hebrew */
  2743.     xchas, /* 6,13 swiss nrc to Latin/Hebrew */
  2744.     xl1lh, /* 6,14 latin-1 to Latin/Hebrew */
  2745.     xl2as, /* 6,15 latin-2 to Latin/Hebrew */
  2746.     xdmas, /* 6,16 dec mcs to Latin/Hebrew */
  2747.     xneas, /* 6,17 NeXT to Latin/Hebrew */
  2748.     x43as, /* 6,18 CP437 to Latin/Hebrew */
  2749.     x85as, /* 6,19 CP850 to Latin/Hebrew */
  2750.     x52as, /* 6,20 CP852 to Latin/Hebrew */
  2751.     xaqas, /* 6,21 Macintosh Latin to Latin/Hebrew */
  2752.     xdgas, /* 6,22 DGI to Latin/Hebrew */
  2753.     xr8as, /* 6,23 HP to Latin/Hebrew */
  2754.     xlcas,                      /* 6,24 Latin/Cyrillic to Latin/Hebrew */
  2755.     xacas,                      /* 6,25 CP866 to Latin/Hebrew */
  2756.     xskas,                      /* 6,26 Short KOI to Latin/Hebrew */
  2757.     xk8as,                      /* 6,27 Old KOI-8 Cyrillic to Latin/Hebrew */
  2758.     NULL, /* 6,28 Kanji... */
  2759.     NULL, /* 6,29 */
  2760.     NULL, /* 6,30 */
  2761.     NULL, /* 6,31 */
  2762.     xh7lh, /* 6,32 Hebrew-7 to Latin/Hebrew */
  2763.     NULL, /* 6,33 Latin/Hebrew to Latin/Hebrew */
  2764.     x62lh, /* 6,34 CP862 Hebrew to Latin/Hebrew */
  2765.     xegas, /* 6,35 ELOT 927 Greek to Latin/Hebrew */
  2766.     xlgas, /* 6,36 Latin/Greek to Latin/Hebrew */
  2767.     x69as, /* 6,37 CP869 to Latin/Hebrew */
  2768.     xl1as, /* 6,38 latin-9 to Latin/Hebrew */
  2769.     x58as, /* 6,39 CP858 to Latin/Hebrew */
  2770.     x55as, /* 6,40 CP855 to Latin/Hebrew */
  2771.     x1251as, /* 6,41 CP1251 to Latin/Hebrew */
  2772.     xleft128, /* 6,42 Bulgarian to Latin/Hebrew */
  2773.     x1250as, /* 6,43 CP1250 to Latin/Hebrew */
  2774.     xmzas, /* 6,44 Mazovia to Latin/Hebrew */
  2775.     NULL, /* 6,45 UCS-2 to Latin/Hebrew */
  2776.     NULL, /* 6,46 UTF-8 to Latin/Hebrew */
  2777.     NULL, /* 6,47 KOI8R to Latin/Hebrew */
  2778.     NULL, /* 6,48 KOI8U to Latin/Hebrew */
  2779.     NULL, /* 7,0 us ascii to Latin/Greek */
  2780.     NULL, /* 7,1 uk ascii to Latin/Greek */
  2781.     xduas, /* 7,2 dutch nrc to Latin/Greek */
  2782.     xfias, /* 7,3 finnish nrc to Latin/Greek */
  2783.     xfras, /* 7,4 french nrc to Latin/Greek */
  2784.     xfcas, /* 7,5 french canadian nrc to Latin/Greek */
  2785.     xgeas, /* 7,6 german nrc to Latin/Greek */
  2786.     xhuas, /* 7,7 hungarian nrc to Latin/Greek */
  2787.     xitas, /* 7,8 italian nrc to Latin/Greek */
  2788.     xnoas, /* 7,9 norge/danish nrc to Latin/Greek */
  2789.     xpoas, /* 7,10 portuguese nrc to Latin/Greek */
  2790.     xspas, /* 7,11 spanish nrc to Latin/Greek */
  2791.     xswas, /* 7,12 swedish nrc to Latin/Greek */
  2792.     xchas, /* 7,13 swiss nrc to Latin/Greek */
  2793.     xl1lg, /* 7,14 latin-1 to Latin/Greek */
  2794.     xl2lg, /* 7,15 latin-2 to Latin/Greek */
  2795.     xl1lg, /* 7,16 dec mcs to Latin/Greek */
  2796.     xneas, /* 7,17 NeXT to Latin/Greek */
  2797.     xleft128, /* 7,18 CP437 to Latin/Greek */
  2798.     x85as, /* 7,19 CP850 to Latin/Greek */
  2799.     x52as, /* 7,20 CP852 to Latin/Greek */
  2800.     xaqas, /* 7,21 Macintosh Latin to Latin/Greek */
  2801.     xdgas, /* 7,22 DGI to Latin/Greek */
  2802.     xr8as, /* 7,23 HP to Latin/Greek */
  2803.     xleft160,                   /* 7,24 Latin/Cyrillic to Latin/Greek */
  2804.     xleft128,                   /* 7,25 CP866 to Latin/Greek */
  2805.     xskas,                      /* 7,26 Short KOI to Latin/Greek */
  2806.     xk8as,                      /* 7,27 Old KOI-8 Cyrillic to Latin/Greek */
  2807.     NULL, /* 7,28 Kanji... */
  2808.     NULL, /* 7,29 */
  2809.     NULL, /* 7,30 */
  2810.     NULL, /* 7,31 */
  2811.     xh7as, /* 7,32 Hebrew-7 to Latin/Greek */
  2812.     NULL, /* 7,33 Latin/Hebrew to Latin/Greek */
  2813.     x62as, /* 7,34 CP862 Hebrew to Latin/Greek */
  2814.     xeglg, /* 7,35 ELOT 927 Greek to Latin/Greek */
  2815.     NULL, /* 7,36 Latin/Greek to Latin/Greek */
  2816.     x69lg, /* 7,37 CP869 to Latin/Greek */
  2817.     xl1as, /* 7,38 latin-9 to Latin/Greek */
  2818.     xl1as, /* 7,39 latin-9 to Latin/Hebrew*/
  2819.     xleft128, /* 7,40 CP855 to Latin/Greek */
  2820.     xleft128, /* 7,41 CP1251 to Latin/Greek */
  2821.     xleft128, /* 7,42 Bulgarian to Latin/Greek */
  2822.     x1250as, /* 7,43 CP1250 to Latin/Greek */
  2823.     xmzas, /* 7,44 Mazovia to Latin/Greek */
  2824.     NULL, /* 7,45 UCS-2 to Latin/Greek */
  2825.     NULL, /* 7,46 UTF-8 to Latin/Greek */
  2826.     NULL, /* 7,47 KOI8R to Latin/Greek */
  2827.     NULL, /* 7,48 KOI8U to Latin/Greek */
  2828.     NULL, /* 8,0 us ascii to latin-9 */
  2829.     xukl1, /* 8,1 uk ascii to latin-9 */
  2830.     xdul1, /* 8,2 dutch nrc to latin-9 */
  2831.     xfil1, /* 8,3 finnish nrc to latin-9 */
  2832.     xfrl1, /* 8,4 french nrc to latin-9 */
  2833.     xfcl1, /* 8,5 french canadian nrc to latin-9 */
  2834.     xgel1, /* 8,6 german nrc to latin-9 */
  2835.     xhul1, /* 8,7 hungarian nrc to latin-9 */
  2836.     xitl1, /* 8,8 italian nrc to latin-9 */
  2837.     xnol1, /* 8,9 norwegian/danish nrc to latin-9 */
  2838.     xpol1, /* 8,10 portuguese nrc to latin-9 */
  2839.     xspl1, /* 8,11 spanish nrc to latin-9 */
  2840.     xswl1, /* 8,12 swedish nrc to latin-9 */
  2841.     xchl1, /* 8,13 swiss nrc to latin-9 */
  2842.     NULL, /* 8,14 latin-1 to latin-9 */
  2843.     xl2l9, /* 8,15 latin-2 to latin-9 */
  2844.     xdml9, /* 8,16 dec mcs to latin-9 */
  2845.     xnel9,                      /* 8,17 NeXT To Latin-9 */
  2846.     x43l1,                      /* 8,18 CP437 To Latin-9 */
  2847.     x85l1,                      /* 8,19 CP850 To Latin-9 */
  2848.     x52l1,                      /* 8,20 CP852 To Latin-9 */
  2849.     xaql1,                      /* 8,21 Macintosh Latin To Latin-9 */
  2850.     xdgl1,                      /* 8,22 DGI To Latin-9 */
  2851.     xr8l1,                      /* 8,23 HP To Latin-9 */
  2852.     xlcas,                      /* 8,24 Latin/Cyrillic To Latin-9 */
  2853.     xacas,                      /* 8,25 CP866 To Latin-9 */
  2854.     xskas,                      /* 8,26 Short KOI To Latin-9 */
  2855.     xk8as,                      /* 8,27 Old KOI-8 Cyrillic To Latin-9 */
  2856.     NULL, /* 8,28 Kanji ... */
  2857.     NULL, /* 8,29 */
  2858.     NULL, /* 8,30 */
  2859.     NULL, /* 8,31 */
  2860.     xh7as, /* 8,32 Hebrew-7 To Latin-9 */
  2861.     xlhl1, /* 8,33 Latin/Hebrew To Latin-9 */
  2862.     x62l1, /* 8,34 CP862 Hebrew To Latin-9 */
  2863.     xegas, /* 8,35 ELOT 927 Greek To Latin-9 */
  2864.     xlgl1, /* 8,36 Latin/Greek To Latin-9 */
  2865.     xl169, /* 8,37 CP869 To Latin-9 */
  2866.     NULL, /* 8,38 Latin-9 To Latin-9 */
  2867.     x58l9, /* 8,39 cp858 To Latin-9 */
  2868.     x55as, /* 8,40 cp855 To Latin-9 */
  2869.     x55as, /* 8,41 cp1251 To Latin-9 */
  2870.     xleft128, /* 8,42 Bulgarian To Latin-9 */
  2871.     x1250l9, /* 8,43 CP1250 To Latin-9 */
  2872.     xmzl9, /* 8,44 Mazovia To Latin-9 */
  2873.     NULL, /* 8,45 UCS-2 to Latin-9 */
  2874.     NULL, /* 8,46 UTF-8 to Latin-9 */
  2875.     NULL, /* 8,47 KOI8R to Latin-9 */
  2876.     NULL, /* 8,48 KOI8U to Latin-9 */
  2877.     NULL, /* 9,00 Unicode... */
  2878.     NULL, /* 9,01 */
  2879.     NULL, /* 9,02 */
  2880.     NULL, /* 9,03 */
  2881.     NULL, /* 9,04 */
  2882.     NULL, /* 9,05 */
  2883.     NULL, /* 9,06 */
  2884.     NULL, /* 9,07 */
  2885.     NULL, /* 9,08 */
  2886.     NULL, /* 9,09 */
  2887.     NULL, /* 9,10 */
  2888.     NULL, /* 9,11 */
  2889.     NULL, /* 9,12 */
  2890.     NULL, /* 9,13 */
  2891.     NULL, /* 9,14 */
  2892.     NULL, /* 9,15 */
  2893.     NULL, /* 9,16 */
  2894.     NULL, /* 9,17 */
  2895.     NULL, /* 9,18 */
  2896.     NULL, /* 9,19 */
  2897.     NULL, /* 9,20 */
  2898.     NULL, /* 9,21 */
  2899.     NULL, /* 9,22 */
  2900.     NULL, /* 9,23 */
  2901.     NULL, /* 9,24 */
  2902.     NULL, /* 9,25 */
  2903.     NULL, /* 9,26 */
  2904.     NULL, /* 9,27 */
  2905.     NULL, /* 9,28 */
  2906.     NULL, /* 9,29 */
  2907.     NULL, /* 9,30 */
  2908.     NULL, /* 9,31 */
  2909.     NULL, /* 9,32 */
  2910.     NULL, /* 9,33 */
  2911.     NULL, /* 9,34 */
  2912.     NULL, /* 9,35 */
  2913.     NULL, /* 9,36 */
  2914.     NULL, /* 9,37 */
  2915.     NULL, /* 9,38 */
  2916.     NULL, /* 9,39 */
  2917.     NULL, /* 9,40 */
  2918.     NULL, /* 9,41 */
  2919.     NULL, /* 9,42 */
  2920.     NULL, /* 9,43 */
  2921.     NULL, /* 9,44 */
  2922.     NULL, /* 9,45 */
  2923.     NULL, /* 9,46 */
  2924.     NULL, /* 9,47 */
  2925.     NULL, /* 9,48 */
  2926.     NULL, /* 10,00 */
  2927.     NULL, /* 10,01 */
  2928.     NULL, /* 10,02 */
  2929.     NULL, /* 10,03 */
  2930.     NULL, /* 10,04 */
  2931.     NULL, /* 10,05 */
  2932.     NULL, /* 10,06 */
  2933.     NULL, /* 10,07 */
  2934.     NULL, /* 10,08 */
  2935.     NULL, /* 10,09 */
  2936.     NULL, /* 10,10 */
  2937.     NULL, /* 10,11 */
  2938.     NULL, /* 10,12 */
  2939.     NULL, /* 10,13 */
  2940.     NULL, /* 10,14 */
  2941.     NULL, /* 10,15 */
  2942.     NULL, /* 10,16 */
  2943.     NULL, /* 10,17 */
  2944.     NULL, /* 10,18 */
  2945.     NULL, /* 10,19 */
  2946.     NULL, /* 10,20 */
  2947.     NULL, /* 10,21 */
  2948.     NULL, /* 10,22 */
  2949.     NULL, /* 10,23 */
  2950.     NULL, /* 10,24 */
  2951.     NULL, /* 10,25 */
  2952.     NULL, /* 10,26 */
  2953.     NULL, /* 10,27 */
  2954.     NULL, /* 10,28 */
  2955.     NULL, /* 10,29 */
  2956.     NULL, /* 10,30 */
  2957.     NULL, /* 10,31 */
  2958.     NULL, /* 10,32 */
  2959.     NULL, /* 10,33 */
  2960.     NULL, /* 10,34 */
  2961.     NULL, /* 10,35 */
  2962.     NULL, /* 10,36 */
  2963.     NULL, /* 10,37 */
  2964.     NULL, /* 10,38 */
  2965.     NULL, /* 10,39 */
  2966.     NULL, /* 10,40 */
  2967.     NULL, /* 10,41 */
  2968.     NULL, /* 10,42 */
  2969.     NULL, /* 10,43 */
  2970.     NULL, /* 10,44 */
  2971.     NULL, /* 10,45 */
  2972.     NULL, /* 10,46 */
  2973.     NULL, /* 10,47 */
  2974.     NULL /* 10,48 */
  2975. };
  2976. int nxls = (sizeof(xls) / sizeof(CHAR *));
  2977. #ifndef NOLOCAL
  2978. /*
  2979.   The following routines are useful only for terminal character sets, and so
  2980.   ifdef'd out for NOLOCAL compilations.
  2981. */
  2982. /*
  2983.   C S _ I S _ N R C
  2984.   Returns nonzero if argument indicates a 7-bit national character set,
  2985.   zero otherwise.
  2986. */
  2987. int
  2988. cs_is_nrc(x) int x; {
  2989. #ifdef UNICODE
  2990.     if (x == TX_J201R || x == TX_DECSPEC || x == TX_DECTECH
  2991.         || txrinfo[x] == NULL)
  2992.       return(0);
  2993.     else
  2994.       return(txrinfo[x]->flags & X2U_STD && txrinfo[x]->size == 94);
  2995. #else /* UNICODE */
  2996.     if ((cs_size(x) == 94))
  2997.       return(1);
  2998.     else
  2999.       return(0);
  3000. #endif /* UNICODE */
  3001. }
  3002. /*
  3003.   C S _ I S _ S T D
  3004.   Returns nonzero if argument indicates an ISO 4873-standard-format
  3005.   character set, i.e. one in which the control region is NOT used for
  3006.   graphics; zero otherwise.
  3007. */
  3008. int
  3009. cs_is_std(x) int x; {
  3010. #ifdef UNICODE
  3011.     if (!txrinfo[x]) /* Even more safety */
  3012.       return(0);
  3013.     else if (txrinfo[x]->size == 128) /* Just for safety */
  3014.       return(0);
  3015.     else
  3016.       return(txrinfo[x]->flags & X2U_STD); /* Only this should be needed */
  3017. #else
  3018.     switch (x) {
  3019.       case FC_CP437: /* Code pages use C1 graphics */
  3020.       case FC_CP850:
  3021.       case FC_CP852:
  3022.       case FC_CP862:
  3023.       case FC_CP866:
  3024.       case FC_CP869:
  3025.       case FC_CP858:
  3026.       case FC_APPQD: /* So do Apple and NeXTSTEP */
  3027.       case FC_NEXT:
  3028. return(0);
  3029.       default: /* Others behave */
  3030. return(1);
  3031.     }
  3032. #endif /* CKOUINI */
  3033. }
  3034. int
  3035. cs_size(x) int x; {
  3036. #ifdef UNICODE
  3037.     if (!txrinfo[x])
  3038.       return(128);
  3039.     return(txrinfo[x]->size);
  3040. #else
  3041.     switch(x) {
  3042.       case FC_USASCII:
  3043.       case FC_UKASCII:
  3044.       case FC_DUASCII:
  3045.       case FC_FIASCII:
  3046.       case FC_FRASCII:
  3047.       case FC_FCASCII:
  3048.       case FC_GEASCII:
  3049.       case FC_HUASCII:
  3050.       case FC_ITASCII:
  3051.       case FC_NOASCII:
  3052.       case FC_POASCII:
  3053.       case FC_SPASCII:
  3054.       case FC_SWASCII:
  3055.       case FC_CHASCII:
  3056.       case FC_KOI7:
  3057.       case FC_HE7:
  3058.       case FC_ELOT:
  3059. return(94);
  3060.       case FC_1LATIN:
  3061.       case FC_2LATIN:
  3062.       case FC_DECMCS:
  3063.       case FC_DGMCS:
  3064.       case FC_HPR8:
  3065.       case FC_CYRILL:
  3066.       case FC_KOI8:
  3067.       case FC_HEBREW:
  3068.       case FC_GREEK:
  3069.       case FC_9LATIN:
  3070. return(96);
  3071.       case FC_NEXT:
  3072.       case FC_CP437:
  3073.       case FC_CP850:
  3074.       case FC_CP852:
  3075.       case FC_CP855:
  3076.       case FC_CP862:
  3077.       case FC_CP866:
  3078.       case FC_CP1251:
  3079.       case FC_APPQD:
  3080. return(128);
  3081. #ifdef KANJI
  3082.       case FC_JIS7:
  3083. return(-94);
  3084.       case FC_SHJIS:
  3085. return(-128);
  3086.       case FC_JEUC:
  3087.       case FC_JDEC:
  3088. return(-96);
  3089. #endif /* KANJI */
  3090.       case FC_CP858:
  3091.       default:
  3092. return(-1);
  3093.     }
  3094. #endif /* UNICODE */
  3095. }
  3096. #endif /* NOLOCAL */
  3097. /*
  3098.   S E T X L A T Y P E  --  Set Translation Type
  3099.   Sets global xlatype to indicate which kind of translation:
  3100.     XLA_NONE      No translation
  3101.     XLA_BYTE      Byte-for-Byte translation
  3102.     XLA_JAPAN     Japanese Kanji translation
  3103.     XLA_UNICODE   Unicode translations
  3104.   And sets up the appropriate translation function pointers as follows:
  3105.   For no translation:
  3106.     All function pointers are NULL.
  3107.   For Byte-for-Byte transation:
  3108.     rx  = TCS to FCS (these functions are in this module...)
  3109.     sx  = FCS to TCS
  3110.   For Unicode translations:
  3111.     xfu = FCS to UCS (these functions are in ckcuni.c...)
  3112.     xtu = TCS to UCS
  3113.     xuf = UCS to FCS
  3114.     xut = UCS to TCS
  3115. */
  3116. VOID
  3117. setxlatype(tcs, fcs) int tcs, fcs; {
  3118. #ifdef UNICODE
  3119.     xfu = NULL; /* Unicode <-> TCS/FCS functions */
  3120.     xtu = NULL;
  3121.     xuf = NULL;
  3122.     xut = NULL;
  3123. #endif /* UNICODE */
  3124.     rx = sx = NULL;
  3125.     debug(F101,"setxlatype fcs","",fcs);
  3126.     debug(F101,"setxlatype tcs","",tcs);
  3127.     if (tcs < 0 || tcs > MAXTCSETS) {
  3128. debug(F101,"setxlatype bad tcs","",tcs);
  3129. return;
  3130.     }
  3131.     if (fcs < 0 || fcs > MAXFCSETS) {
  3132. debug(F101,"setxlatype bad fcs","",fcs);
  3133. return;
  3134.     }
  3135.     if (tcs == TC_TRANSP) { /* Transfer charset is TRANSPARENT */
  3136. debug(F101,"setxlatype transparent because TCS==Transparent","",tcs);
  3137. xlatype = XLA_NONE; /* Translation type is None */
  3138. #ifdef UNICODE
  3139.     /* If any of our charsets is Unicode we use Unicode functions */
  3140.     /* even if TCS and FCS are the same because of BOM and byte swapping */
  3141.     } else if (tcs == TC_UCS2 || tcs == TC_UTF8 ||
  3142.        fcs == FC_UCS2 || fcs == FC_UTF8) {
  3143. debug(F101,"setxlatype Unicode tcs","",tcs);
  3144. debug(F101,"setxlatype Unicode fcs","",fcs);
  3145. /* Unicode <-> TCS/FCS functions */
  3146. xfu = xl_fcu[fcs]; /* FCS -> UCS */
  3147. xtu = xl_tcu[tcs]; /* TCS -> UCS */
  3148. xuf = xl_ufc[fcs]; /* UCS -> FCS */
  3149. xut = xl_utc[tcs]; /* UCS -> TCS */
  3150.         xlatype = XLA_UNICODE; /* Translation type is Unicode */
  3151. debug(F001,"setxlatype Unicode xfu","",(unsigned)xfu);
  3152. debug(F001,"setxlatype Unicode xuf","",(unsigned)xuf);
  3153. #endif /* UNICODE */
  3154.     } else if (cseqtab[tcs] == fcs) { /* Or if TCS == FCS */
  3155. debug(F101,"setxlatype transparent because TCS==FCS","",tcs);
  3156. xlatype = XLA_NONE; /* translation type is also None */
  3157. #ifdef KANJI
  3158.     /* Otherwise if any of them is Japanese, we use Kanji functions */
  3159.     } else if (tcs == TC_JEUC || fcsinfo[fcs].alphabet == AL_JAPAN) {
  3160. debug(F101,"setxlatype Japanese tcs","",tcs);
  3161. debug(F101,"setxlatype Japanese fcs","",fcs);
  3162.         xlatype = XLA_JAPAN; /* Translation type is Japanese */
  3163. #endif /* KANJI */
  3164.     /* Otherwise we use byte functions */
  3165.     } else { /* Otherwise... */
  3166. rx = xlr[tcs][fcs]; /* Input translation function */
  3167. sx = xls[tcs][fcs]; /* Output translation function */
  3168. debug(F101,"setxlatype Byte tcs","",tcs);
  3169. debug(F101,"setxlatype Byte fcs","",fcs);
  3170.         xlatype = XLA_BYTE; /* Translation type is Byte */
  3171.     }
  3172.     debug(F101,"setxlatype xlatype","",xlatype);
  3173. }
  3174. /* Set up translation between two file character sets with UCS intermediate */
  3175. #ifdef UNICODE
  3176. VOID
  3177. initxlate(csin, csout) int csin, csout; {
  3178.     xfu = NULL;
  3179.     xtu = NULL;
  3180.     xuf = NULL;
  3181.     xut = NULL;
  3182.     debug(F101,"initxlate csin","",csin);
  3183.     debug(F101,"initxlate csout","",csout);
  3184.     if (csin < 0 || csin > MAXFCSETS) {
  3185. debug(F101,"initxlate bad csin","",csin);
  3186. return;
  3187.     }
  3188.     if (csout < 0 || csout > MAXFCSETS) {
  3189. debug(F101,"initxlate bad csout","",csout);
  3190. return;
  3191.     }
  3192.     if (csin == csout && csin != FC_UCS2) {
  3193. xlatype = XLA_NONE; /* Translation type is None */
  3194. return;
  3195.     }
  3196.     xlatype = XLA_UNICODE; /* Translation type is Unicode */
  3197.     xfu = xl_fcu[csin]; /* FCS -> UCS */
  3198.     xuf = xl_ufc[csout]; /* UCS -> FCS */
  3199.     xpnbyte(-1,0,0,NULL); /* Reset UCS-2 */
  3200.     debug(F001,"initxlate Unicode xfu","",(unsigned)xfu);
  3201.     debug(F001,"initxlate Unicode xuf","",(unsigned)xuf);
  3202.     debug(F101,"initxlate xlatype","",xlatype);
  3203. }
  3204. #endif /* UNICODE */
  3205. int csetsinited = 0;
  3206. VOID
  3207. initcsets() { /* Routine to reset or initialize */
  3208.     int i; /* character-set associations. */
  3209. #ifdef UNICODE
  3210.     if (ucsorder < 0) /* for creating UCS-2 files. */
  3211.       ucsorder = byteorder;
  3212.     if (ucsorder < 0)
  3213.       ucsorder = 0;
  3214. #endif /* UNICODE */
  3215.     debug(F101,"initcsets nxls","",nxls);
  3216.     debug(F101,"initcsets nxlr","",nxlr);
  3217.     debug(F101,"initcsets TERM LOCAL CSET","",tcsl);
  3218.     debug(F101,"initcsets TERM REMOTE CSET","",tcsr);
  3219.     for (i = 0; i <= MAXFCSETS; i++) /* First clear them all... */
  3220.       afcset[i] = -1;
  3221.     for (i = 0; i <= MAXTCSETS; i++)
  3222.       axcset[i] = -1;
  3223.     /* Now set specific defaults for incoming files */
  3224.     xlatype = XLA_NONE;
  3225.     axcset[TC_TRANSP]  = FC_TRANSP;
  3226.     axcset[TC_USASCII] = FC_USASCII;
  3227. #ifdef OS2
  3228.     switch (fcharset) {
  3229.       case FC_CP850:
  3230.       case FC_CP858:
  3231.       case FC_CP437:
  3232.       case FC_1LATIN:
  3233. axcset[TC_1LATIN]  = fcharset;
  3234. break;
  3235.       default:
  3236. axcset[TC_1LATIN]  = FC_CP850;
  3237.     }
  3238. #else
  3239. #ifdef HPUX
  3240.     axcset[TC_1LATIN]  = FC_HPR8;
  3241. #else
  3242. #ifdef VMS
  3243.     axcset[TC_1LATIN]  = FC_DECMCS;
  3244. #else
  3245. #ifdef NEXT
  3246.     axcset[TC_1LATIN]  = FC_NEXT;
  3247. #else
  3248. #ifdef datageneral
  3249.     axcset[TC_1LATIN]  = FC_DGMCS;
  3250. #else
  3251.     /* Should we use code pages on some PC based UNIXes? */
  3252.     axcset[TC_1LATIN]  = FC_1LATIN;
  3253. #endif /* datageneral */
  3254. #endif /* NEXT */
  3255. #endif /* VMS */
  3256. #endif /* HPUX */
  3257. #endif /* OS2 */
  3258. #ifdef OS2
  3259.     axcset[TC_2LATIN]  = FC_CP852;
  3260.     axcset[TC_CYRILL]  = FC_CP866;
  3261.     axcset[TC_JEUC]    = FC_SHJIS;
  3262.     axcset[TC_HEBREW]  = FC_CP862;
  3263.     axcset[TC_GREEK]   = FC_CP869;
  3264.     axcset[TC_9LATIN]  = FC_CP858;
  3265.     axcset[TC_UCS2]    = FC_UCS2;
  3266.     axcset[TC_UTF8]    = FC_UCS2;
  3267. #else
  3268.     axcset[TC_2LATIN]  = FC_2LATIN;
  3269.     axcset[TC_CYRILL]  = FC_CYRILL;
  3270.     axcset[TC_JEUC]    = FC_JEUC;
  3271.     axcset[TC_HEBREW]  = FC_HEBREW;
  3272.     axcset[TC_GREEK]   = FC_GREEK;
  3273.     axcset[TC_9LATIN]  = FC_9LATIN;
  3274.     axcset[TC_UCS2]    = FC_UTF8;
  3275.     axcset[TC_UTF8]    = FC_UTF8;
  3276. #endif /* OS2 */
  3277.     /* And for outbound files */
  3278.     afcset[FC_USASCII] = TC_USASCII;
  3279.     afcset[FC_UKASCII] = TC_1LATIN;
  3280.     afcset[FC_DUASCII] = TC_1LATIN;
  3281.     afcset[FC_FIASCII] = TC_1LATIN;
  3282.     afcset[FC_FRASCII] = TC_1LATIN;
  3283.     afcset[FC_FCASCII] = TC_1LATIN;
  3284.     afcset[FC_GEASCII] = TC_1LATIN;
  3285.     afcset[FC_HUASCII] = TC_2LATIN;
  3286.     afcset[FC_ITASCII] = TC_1LATIN;
  3287.     afcset[FC_NOASCII] = TC_1LATIN;
  3288.     afcset[FC_POASCII] = TC_1LATIN;
  3289.     afcset[FC_SPASCII] = TC_1LATIN;
  3290.     afcset[FC_SWASCII] = TC_1LATIN;
  3291.     afcset[FC_CHASCII] = TC_1LATIN;
  3292.     afcset[FC_1LATIN]  = TC_1LATIN;
  3293.     afcset[FC_2LATIN]  = TC_2LATIN;
  3294.     afcset[FC_DECMCS]  = TC_1LATIN;
  3295.     afcset[FC_NEXT]    = TC_1LATIN;
  3296.     afcset[FC_CP437]   = TC_1LATIN;
  3297.     afcset[FC_CP850]   = TC_1LATIN;
  3298.     afcset[FC_CP852]   = TC_2LATIN;
  3299.     afcset[FC_APPQD]   = TC_1LATIN;
  3300.     afcset[FC_DGMCS]   = TC_1LATIN;
  3301.     afcset[FC_HPR8]    = TC_1LATIN;
  3302.     afcset[FC_CYRILL]  = TC_CYRILL;
  3303.     afcset[FC_CP866]   = TC_CYRILL;
  3304.     afcset[FC_KOI7]    = TC_CYRILL;
  3305.     afcset[FC_KOI8]    = TC_CYRILL;
  3306.     afcset[FC_JIS7]    = TC_JEUC;
  3307.     afcset[FC_SHJIS]   = TC_JEUC;
  3308.     afcset[FC_JEUC]    = TC_JEUC;
  3309.     afcset[FC_JDEC]    = TC_JEUC;
  3310.     afcset[FC_HE7]     = TC_HEBREW;
  3311.     afcset[FC_HEBREW]  = TC_HEBREW;
  3312.     afcset[FC_CP862]   = TC_HEBREW;
  3313.     afcset[FC_ELOT]    = TC_GREEK;
  3314.     afcset[FC_GREEK]   = TC_GREEK;
  3315.     afcset[FC_CP869]   = TC_GREEK;
  3316.     afcset[FC_9LATIN]  = TC_9LATIN;
  3317.     afcset[FC_CP923]   = TC_9LATIN;
  3318.     afcset[FC_CP858]   = TC_9LATIN;
  3319.     afcset[FC_CP855]   = TC_CYRILL;
  3320.     afcset[FC_CP1251]  = TC_CYRILL;
  3321.     afcset[FC_BULGAR]  = TC_CYRILL;
  3322.     afcset[FC_CP1250]  = TC_2LATIN;
  3323.     afcset[FC_MAZOVIA] = TC_2LATIN;
  3324. #ifdef COMMENT
  3325.     afcset[FC_UCS2]    = TC_UCS2;
  3326.     afcset[FC_UTF8]    = TC_UTF8;
  3327. #endif /* COMMENT */
  3328.     csetsinited++;
  3329.     return;
  3330. }
  3331. #endif /* NOCSETS */