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

通讯/手机编程

开发平台:

Windows_Unix

  1.       case 0x00d6: return((CHAR)(153 & 0xff));
  2.       case 0x00dc: return((CHAR)(154 & 0xff));
  3.       case 0x00f8: return((CHAR)(155 & 0xff));
  4.       case 0x00a3: return((CHAR)(156 & 0xff));
  5.       case 0x00d8: return((CHAR)(157 & 0xff));
  6.       case 0x015e: return((CHAR)(158 & 0xff));
  7.       case 0x015f: return((CHAR)(159 & 0xff));
  8.       case 0x00e1: return((CHAR)(160 & 0xff));
  9.       case 0x00ed: return((CHAR)(161 & 0xff));
  10.       case 0x00f3: return((CHAR)(162 & 0xff));
  11.       case 0x00fa: return((CHAR)(163 & 0xff));
  12.       case 0x00f1: return((CHAR)(164 & 0xff));
  13.       case 0x00d1: return((CHAR)(165 & 0xff));
  14.       case 0x011e: return((CHAR)(166 & 0xff));
  15.       case 0x011f: return((CHAR)(167 & 0xff));
  16.       case 0x00bf: return((CHAR)(168 & 0xff));
  17.       case 0x00ae: return((CHAR)(169 & 0xff));
  18.       case 0x00ac: return((CHAR)(170 & 0xff));
  19.       case 0x00bd: return((CHAR)(171 & 0xff));
  20.       case 0x00bc: return((CHAR)(172 & 0xff));
  21.       case 0x00a1: return((CHAR)(173 & 0xff));
  22.       case 0x00ab: return((CHAR)(174 & 0xff));
  23.       case 0x00bb: return((CHAR)(175 & 0xff));
  24.       case 0x20ac: return((CHAR)(213 & 0xff)); /* Euro */
  25.       case 0x2591: return((CHAR)(176 & 0xff));
  26.       case 0x2592: return((CHAR)(177 & 0xff));
  27.       case 0x2593: return((CHAR)(178 & 0xff));
  28.       case 0x2502: return((CHAR)(179 & 0xff));
  29.       case 0x2524: return((CHAR)(180 & 0xff));
  30.       case 0x00c1: return((CHAR)(181 & 0xff));
  31.       case 0x00c2: return((CHAR)(182 & 0xff));
  32.       case 0x00c0: return((CHAR)(183 & 0xff));
  33.       case 0x00a9: return((CHAR)(184 & 0xff));
  34.       case 0x2563: return((CHAR)(185 & 0xff));
  35.       case 0x2551: return((CHAR)(186 & 0xff));
  36.       case 0x2557: return((CHAR)(187 & 0xff));
  37.       case 0x255d: return((CHAR)(188 & 0xff));
  38.       case 0x00a2: return((CHAR)(189 & 0xff));
  39.       case 0x00a5: return((CHAR)(190 & 0xff));
  40.       case 0x2510: return((CHAR)(191 & 0xff));
  41.       case 0x2514: return((CHAR)(192 & 0xff));
  42.       case 0x2534: return((CHAR)(193 & 0xff));
  43.       case 0x252c: return((CHAR)(194 & 0xff));
  44.       case 0x251c: return((CHAR)(195 & 0xff));
  45.       case 0x2500: return((CHAR)(196 & 0xff));
  46.       case 0x253c: return((CHAR)(197 & 0xff));
  47.       case 0x00e3: return((CHAR)(198 & 0xff));
  48.       case 0x00c3: return((CHAR)(199 & 0xff));
  49.       case 0x255a: return((CHAR)(200 & 0xff));
  50.       case 0x2554: return((CHAR)(201 & 0xff));
  51.       case 0x2569: return((CHAR)(202 & 0xff));
  52.       case 0x2566: return((CHAR)(203 & 0xff));
  53.       case 0x2560: return((CHAR)(204 & 0xff));
  54.       case 0x2550: return((CHAR)(205 & 0xff));
  55.       case 0x256c: return((CHAR)(206 & 0xff));
  56.       case 0x00a4: return((CHAR)(207 & 0xff));
  57.       case 0x00ba: return((CHAR)(208 & 0xff));
  58.       case 0x00aa: return((CHAR)(209 & 0xff));
  59.       case 0x00ca: return((CHAR)(210 & 0xff));
  60.       case 0x00cb: return((CHAR)(211 & 0xff));
  61.       case 0x00c8: return((CHAR)(212 & 0xff));
  62.       case 0x00cd: return((CHAR)(214 & 0xff));
  63.       case 0x00ce: return((CHAR)(215 & 0xff));
  64.       case 0x00cf: return((CHAR)(216 & 0xff));
  65.       case 0x2518: return((CHAR)(217 & 0xff));
  66.       case 0x250c: return((CHAR)(218 & 0xff));
  67.       case 0x2588: return((CHAR)(219 & 0xff));
  68.       case 0x2584: return((CHAR)(220 & 0xff));
  69.       case 0x00a6: return((CHAR)(221 & 0xff));
  70.       case 0x00cc: return((CHAR)(222 & 0xff));
  71.       case 0x2580: return((CHAR)(223 & 0xff));
  72.       case 0x00d3: return((CHAR)(224 & 0xff));
  73.       case 0x00df: return((CHAR)(225 & 0xff));
  74.       case 0x00d4: return((CHAR)(226 & 0xff));
  75.       case 0x00d2: return((CHAR)(227 & 0xff));
  76.       case 0x00f5: return((CHAR)(228 & 0xff));
  77.       case 0x00d5: return((CHAR)(229 & 0xff));
  78.       case 0x00b5: return((CHAR)(230 & 0xff));
  79.       case 0x00d7: return((CHAR)(232 & 0xff));
  80.       case 0x00da: return((CHAR)(233 & 0xff));
  81.       case 0x00db: return((CHAR)(234 & 0xff));
  82.       case 0x00d9: return((CHAR)(235 & 0xff));
  83.       case 0x00ec: return((CHAR)(236 & 0xff));
  84.       case 0x00ff: return((CHAR)(237 & 0xff));
  85.       case 0x00af: return((CHAR)(238 & 0xff));
  86.       case 0x00b4: return((CHAR)(239 & 0xff));
  87.       case 0x00ad: return((CHAR)(240 & 0xff));
  88.       case 0x00b1: return((CHAR)(241 & 0xff));
  89.       case 0x00be: return((CHAR)(243 & 0xff));
  90.       case 0x00b6: return((CHAR)(244 & 0xff));
  91.       case 0x00a7: return((CHAR)(245 & 0xff));
  92.       case 0x00f7: return((CHAR)(246 & 0xff));
  93.       case 0x00b8: return((CHAR)(247 & 0xff));
  94.       case 0x00b0: return((CHAR)(248 & 0xff));
  95.       case 0x00a8: return((CHAR)(249 & 0xff));
  96.       case 0x00b7: return((CHAR)(250 & 0xff));
  97.       case 0x00b9: return((CHAR)(251 & 0xff));
  98.       case 0x00b3: return((CHAR)(252 & 0xff));
  99.       case 0x00b2: return((CHAR)(253 & 0xff));
  100.       case 0x25a0: return((CHAR)(254 & 0xff));
  101.       case 0x00a0: return((CHAR)(255 & 0xff));
  102.       default: return(tx_cpsub(c)); /* For box characters etc */
  103.     }
  104. }
  105. int /* PC Code Page 862 */
  106. #ifdef CK_ANSIC
  107. tx_cp862(USHORT c)
  108. #else
  109. tx_cp862(c) USHORT c;
  110. #endif /* CK_ANSIC */
  111. {
  112.     if (c < 0x80) /* Has C1 graphics */
  113.       return((CHAR)(c & 0xff));
  114.     switch (c) {
  115.       case 0x05d0: return((CHAR)(128 & 0xff));
  116.       case 0x05d1: return((CHAR)(129 & 0xff));
  117.       case 0x05d2: return((CHAR)(130 & 0xff));
  118.       case 0x05d3: return((CHAR)(131 & 0xff));
  119.       case 0x05d4: return((CHAR)(132 & 0xff));
  120.       case 0x05d5: return((CHAR)(133 & 0xff));
  121.       case 0x05d6: return((CHAR)(134 & 0xff));
  122.       case 0x05d7: return((CHAR)(135 & 0xff));
  123.       case 0x05d8: return((CHAR)(136 & 0xff));
  124.       case 0x05d9: return((CHAR)(137 & 0xff));
  125.       case 0x05da: return((CHAR)(138 & 0xff));
  126.       case 0x05db: return((CHAR)(139 & 0xff));
  127.       case 0x05dc: return((CHAR)(140 & 0xff));
  128.       case 0x05dd: return((CHAR)(141 & 0xff));
  129.       case 0x05de: return((CHAR)(142 & 0xff));
  130.       case 0x05df: return((CHAR)(143 & 0xff));
  131.       case 0x05e0: return((CHAR)(144 & 0xff));
  132.       case 0x05e1: return((CHAR)(145 & 0xff));
  133.       case 0x05e2: return((CHAR)(146 & 0xff));
  134.       case 0x05e3: return((CHAR)(147 & 0xff));
  135.       case 0x05e4: return((CHAR)(148 & 0xff));
  136.       case 0x05e5: return((CHAR)(149 & 0xff));
  137.       case 0x05e6: return((CHAR)(150 & 0xff));
  138.       case 0x05e7: return((CHAR)(151 & 0xff));
  139.       case 0x05e8: return((CHAR)(152 & 0xff));
  140.       case 0x05e9: return((CHAR)(153 & 0xff));
  141.       case 0x05ea: return((CHAR)(154 & 0xff));
  142.       case 0x00a2: return((CHAR)(155 & 0xff));
  143.       case 0x00a3: return((CHAR)(156 & 0xff));
  144.       case 0x00a5: return((CHAR)(157 & 0xff));
  145.       case 0x20a7: return((CHAR)(158 & 0xff));
  146.       case 0x0192: return((CHAR)(159 & 0xff));
  147.       case 0x00e1: return((CHAR)(160 & 0xff));
  148.       case 0x00ed: return((CHAR)(161 & 0xff));
  149.       case 0x00f3: return((CHAR)(162 & 0xff));
  150.       case 0x00fa: return((CHAR)(163 & 0xff));
  151.       case 0x00f1: return((CHAR)(164 & 0xff));
  152.       case 0x00d1: return((CHAR)(165 & 0xff));
  153.       case 0x00aa: return((CHAR)(166 & 0xff));
  154.       case 0x00ba: return((CHAR)(167 & 0xff));
  155.       case 0x00bf: return((CHAR)(168 & 0xff));
  156.       case 0x2310: return((CHAR)(169 & 0xff));
  157.       case 0x00ac: return((CHAR)(170 & 0xff));
  158.       case 0x00bd: return((CHAR)(171 & 0xff));
  159.       case 0x00bc: return((CHAR)(172 & 0xff));
  160.       case 0x00a1: return((CHAR)(173 & 0xff));
  161.       case 0x00ab: return((CHAR)(174 & 0xff));
  162.       case 0x00bb: return((CHAR)(175 & 0xff));
  163.       case 0x2591: return((CHAR)(176 & 0xff));
  164.       case 0x2592: return((CHAR)(177 & 0xff));
  165.       case 0x2593: return((CHAR)(178 & 0xff));
  166.       case 0x2502: return((CHAR)(179 & 0xff));
  167.       case 0x2524: return((CHAR)(180 & 0xff));
  168.       case 0x2561: return((CHAR)(181 & 0xff));
  169.       case 0x2562: return((CHAR)(182 & 0xff));
  170.       case 0x2556: return((CHAR)(183 & 0xff));
  171.       case 0x2555: return((CHAR)(184 & 0xff));
  172.       case 0x2563: return((CHAR)(185 & 0xff));
  173.       case 0x2551: return((CHAR)(186 & 0xff));
  174.       case 0x2557: return((CHAR)(187 & 0xff));
  175.       case 0x255d: return((CHAR)(188 & 0xff));
  176.       case 0x255c: return((CHAR)(189 & 0xff));
  177.       case 0x255b: return((CHAR)(190 & 0xff));
  178.       case 0x2510: return((CHAR)(191 & 0xff));
  179.       case 0x2514: return((CHAR)(192 & 0xff));
  180.       case 0x2534: return((CHAR)(193 & 0xff));
  181.       case 0x252c: return((CHAR)(194 & 0xff));
  182.       case 0x251c: return((CHAR)(195 & 0xff));
  183.       case 0x2500: return((CHAR)(196 & 0xff));
  184.       case 0x253c: return((CHAR)(197 & 0xff));
  185.       case 0x255e: return((CHAR)(198 & 0xff));
  186.       case 0x255f: return((CHAR)(199 & 0xff));
  187.       case 0x255a: return((CHAR)(200 & 0xff));
  188.       case 0x2554: return((CHAR)(201 & 0xff));
  189.       case 0x2569: return((CHAR)(202 & 0xff));
  190.       case 0x2566: return((CHAR)(203 & 0xff));
  191.       case 0x2560: return((CHAR)(204 & 0xff));
  192.       case 0x2550: return((CHAR)(205 & 0xff));
  193.       case 0x256c: return((CHAR)(206 & 0xff));
  194.       case 0x2567: return((CHAR)(207 & 0xff));
  195.       case 0x2568: return((CHAR)(208 & 0xff));
  196.       case 0x2564: return((CHAR)(209 & 0xff));
  197.       case 0x2565: return((CHAR)(210 & 0xff));
  198.       case 0x2559: return((CHAR)(211 & 0xff));
  199.       case 0x2558: return((CHAR)(212 & 0xff));
  200.       case 0x2552: return((CHAR)(213 & 0xff));
  201.       case 0x2553: return((CHAR)(214 & 0xff));
  202.       case 0x256b: return((CHAR)(215 & 0xff));
  203.       case 0x256a: return((CHAR)(216 & 0xff));
  204.       case 0x2518: return((CHAR)(217 & 0xff));
  205.       case 0x250c: return((CHAR)(218 & 0xff));
  206.       case 0x2588: return((CHAR)(219 & 0xff));
  207.       case 0x2584: return((CHAR)(220 & 0xff));
  208.       case 0x258c: return((CHAR)(221 & 0xff));
  209.       case 0x2590: return((CHAR)(222 & 0xff));
  210.       case 0x2580: return((CHAR)(223 & 0xff));
  211.       case 0x03b1: return((CHAR)(224 & 0xff));
  212.       case 0x00df: return((CHAR)(225 & 0xff));
  213.       case 0x0393: return((CHAR)(226 & 0xff));
  214.       case 0x03c0: return((CHAR)(227 & 0xff));
  215.       case 0x03a3: return((CHAR)(228 & 0xff));
  216.       case 0x03c3: return((CHAR)(229 & 0xff));
  217.       case 0x00b5: return((CHAR)(230 & 0xff));
  218.       case 0x03c4: return((CHAR)(231 & 0xff));
  219.       case 0x03a6: return((CHAR)(232 & 0xff));
  220.       case 0x0398: return((CHAR)(233 & 0xff));
  221.       case 0x03a9: return((CHAR)(234 & 0xff));
  222.       case 0x03b4: return((CHAR)(235 & 0xff));
  223.       case 0x221e: return((CHAR)(236 & 0xff));
  224.       case 0x03c6: return((CHAR)(237 & 0xff));
  225.       case 0x03b5: return((CHAR)(238 & 0xff));
  226.       case 0x2229: return((CHAR)(239 & 0xff));
  227.       case 0x2261: return((CHAR)(240 & 0xff));
  228.       case 0x00b1: return((CHAR)(241 & 0xff));
  229.       case 0x2265: return((CHAR)(242 & 0xff));
  230.       case 0x2264: return((CHAR)(243 & 0xff));
  231.       case 0x2320: return((CHAR)(244 & 0xff));
  232.       case 0x2321: return((CHAR)(245 & 0xff));
  233.       case 0x00f7: return((CHAR)(246 & 0xff));
  234.       case 0x2248: return((CHAR)(247 & 0xff));
  235.       case 0x00b0: return((CHAR)(248 & 0xff));
  236.       case 0x2219: return((CHAR)(249 & 0xff));
  237.       case 0x00b7: return((CHAR)(250 & 0xff));
  238.       case 0x221a: return((CHAR)(251 & 0xff));
  239.       case 0x207f: return((CHAR)(252 & 0xff));
  240.       case 0x00b2: return((CHAR)(253 & 0xff));
  241.       case 0x25a0: return((CHAR)(254 & 0xff));
  242.       case 0x00a0: return((CHAR)(255 & 0xff));
  243.       default: return(tx_cpsub(c)); /* For box characters etc */
  244.     }
  245. }
  246. int /* PC Code Page 864 */
  247. #ifdef CK_ANSIC
  248. tx_cp864(USHORT c)
  249. #else
  250. tx_cp864(c) USHORT c;
  251. #endif /* CK_ANSIC */
  252. {
  253.     if (c < 0x80) /* Has C1 graphics */
  254.       return((CHAR)(c & 0xff));
  255.     switch (c) {
  256.       case 0x00b0: return((CHAR)0x80 & 0xff);
  257.       case 0x00b7: return((CHAR)0x81 & 0xff);
  258.       case 0x2219: return((CHAR)0x82 & 0xff);
  259.       case 0x221a: return((CHAR)0x83 & 0xff);
  260.       case 0x2592: return((CHAR)0x84 & 0xff);
  261.       case 0x2500: return((CHAR)0x85 & 0xff);
  262.       case 0x2502: return((CHAR)0x86 & 0xff);
  263.       case 0x253c: return((CHAR)0x87 & 0xff);
  264.       case 0x2524: return((CHAR)0x88 & 0xff);
  265.       case 0x252c: return((CHAR)0x89 & 0xff);
  266.       case 0x251c: return((CHAR)0x8a & 0xff);
  267.       case 0x2534: return((CHAR)0x8b & 0xff);
  268.       case 0x2510: return((CHAR)0x8c & 0xff);
  269.       case 0x250c: return((CHAR)0x8d & 0xff);
  270.       case 0x2514: return((CHAR)0x8e & 0xff);
  271.       case 0x2518: return((CHAR)0x8f & 0xff);
  272.       case 0x03b2: return((CHAR)0x90 & 0xff);
  273.       case 0x221e: return((CHAR)0x91 & 0xff);
  274.       case 0x03c6: return((CHAR)0x92 & 0xff);
  275.       case 0x00b1: return((CHAR)0x93 & 0xff);
  276.       case 0x00bd: return((CHAR)0x94 & 0xff);
  277.       case 0x00bc: return((CHAR)0x95 & 0xff);
  278.       case 0x2248: return((CHAR)0x96 & 0xff);
  279.       case 0x00ab: return((CHAR)0x97 & 0xff);
  280.       case 0x00bb: return((CHAR)0x98 & 0xff);
  281.       case 0xfef7: return((CHAR)0x99 & 0xff);
  282.       case 0xfef8: return((CHAR)0x9a & 0xff);
  283.       case 0xfefb: return((CHAR)0x9d & 0xff);
  284.       case 0xfefc: return((CHAR)0x9e & 0xff);
  285.       case 0x00a0: return((CHAR)0xa0 & 0xff);
  286.       case 0x00ad: return((CHAR)0xa1 & 0xff);
  287.       case 0xfe82: return((CHAR)0xa2 & 0xff);
  288.       case 0x00a3: return((CHAR)0xa3 & 0xff);
  289.       case 0x00a4: return((CHAR)0xa4 & 0xff);
  290.       case 0xfe84: return((CHAR)0xa5 & 0xff);
  291.       case 0xfe8e: return((CHAR)0xa8 & 0xff);
  292.       case 0xfe8f: return((CHAR)0xa9 & 0xff);
  293.       case 0xfe95: return((CHAR)0xaa & 0xff);
  294.       case 0xfe99: return((CHAR)0xab & 0xff);
  295.       case 0x060c: return((CHAR)0xac & 0xff);
  296.       case 0xfe9d: return((CHAR)0xad & 0xff);
  297.       case 0xfea1: return((CHAR)0xae & 0xff);
  298.       case 0xfea5: return((CHAR)0xaf & 0xff);
  299.       case 0x0660: return((CHAR)0xb0 & 0xff);
  300.       case 0x0661: return((CHAR)0xb1 & 0xff);
  301.       case 0x0662: return((CHAR)0xb2 & 0xff);
  302.       case 0x0663: return((CHAR)0xb3 & 0xff);
  303.       case 0x0664: return((CHAR)0xb4 & 0xff);
  304.       case 0x0665: return((CHAR)0xb5 & 0xff);
  305.       case 0x0666: return((CHAR)0xb6 & 0xff);
  306.       case 0x0667: return((CHAR)0xb7 & 0xff);
  307.       case 0x0668: return((CHAR)0xb8 & 0xff);
  308.       case 0x0669: return((CHAR)0xb9 & 0xff);
  309.       case 0xfed1: return((CHAR)0xba & 0xff);
  310.       case 0x061b: return((CHAR)0xbb & 0xff);
  311.       case 0xfeb1: return((CHAR)0xbc & 0xff);
  312.       case 0xfeb5: return((CHAR)0xbd & 0xff);
  313.       case 0xfeb9: return((CHAR)0xbe & 0xff);
  314.       case 0x061f: return((CHAR)0xbf & 0xff);
  315.       case 0x00a2: return((CHAR)0xc0 & 0xff);
  316.       case 0xfe80: return((CHAR)0xc1 & 0xff);
  317.       case 0xfe81: return((CHAR)0xc2 & 0xff);
  318.       case 0xfe83: return((CHAR)0xc3 & 0xff);
  319.       case 0xfe85: return((CHAR)0xc4 & 0xff);
  320.       case 0xfeca: return((CHAR)0xc5 & 0xff);
  321.       case 0xfe8b: return((CHAR)0xc6 & 0xff);
  322.       case 0xfe8d: return((CHAR)0xc7 & 0xff);
  323.       case 0xfe91: return((CHAR)0xc8 & 0xff);
  324.       case 0xfe93: return((CHAR)0xc9 & 0xff);
  325.       case 0xfe97: return((CHAR)0xca & 0xff);
  326.       case 0xfe9b: return((CHAR)0xcb & 0xff);
  327.       case 0xfe9f: return((CHAR)0xcc & 0xff);
  328.       case 0xfea3: return((CHAR)0xcd & 0xff);
  329.       case 0xfea7: return((CHAR)0xce & 0xff);
  330.       case 0xfea9: return((CHAR)0xcf & 0xff);
  331.       case 0xfeab: return((CHAR)0xd0 & 0xff);
  332.       case 0xfead: return((CHAR)0xd1 & 0xff);
  333.       case 0xfeaf: return((CHAR)0xd2 & 0xff);
  334.       case 0xfeb3: return((CHAR)0xd3 & 0xff);
  335.       case 0xfeb7: return((CHAR)0xd4 & 0xff);
  336.       case 0xfebb: return((CHAR)0xd5 & 0xff);
  337.       case 0xfebf: return((CHAR)0xd6 & 0xff);
  338.       case 0xfec1: return((CHAR)0xd7 & 0xff);
  339.       case 0xfec5: return((CHAR)0xd8 & 0xff);
  340.       case 0xfecb: return((CHAR)0xd9 & 0xff);
  341.       case 0xfecf: return((CHAR)0xda & 0xff);
  342.       case 0x00a6: return((CHAR)0xdb & 0xff);
  343.       case 0x00ac: return((CHAR)0xdc & 0xff);
  344.       case 0x00f7: return((CHAR)0xdd & 0xff);
  345.       case 0x00d7: return((CHAR)0xde & 0xff);
  346.       case 0xfec9: return((CHAR)0xdf & 0xff);
  347.       case 0x0640: return((CHAR)0xe0 & 0xff);
  348.       case 0xfed3: return((CHAR)0xe1 & 0xff);
  349.       case 0xfed7: return((CHAR)0xe2 & 0xff);
  350.       case 0xfedb: return((CHAR)0xe3 & 0xff);
  351.       case 0xfedf: return((CHAR)0xe4 & 0xff);
  352.       case 0xfee3: return((CHAR)0xe5 & 0xff);
  353.       case 0xfee7: return((CHAR)0xe6 & 0xff);
  354.       case 0xfeeb: return((CHAR)0xe7 & 0xff);
  355.       case 0xfeed: return((CHAR)0xe8 & 0xff);
  356.       case 0xfeef: return((CHAR)0xe9 & 0xff);
  357.       case 0xfef3: return((CHAR)0xea & 0xff);
  358.       case 0xfebd: return((CHAR)0xeb & 0xff);
  359.       case 0xfecc: return((CHAR)0xec & 0xff);
  360.       case 0xfece: return((CHAR)0xed & 0xff);
  361.       case 0xfecd: return((CHAR)0xee & 0xff);
  362.       case 0xfee1: return((CHAR)0xef & 0xff);
  363.       case 0xfe7d: return((CHAR)0xf0 & 0xff);
  364.       case 0x0651: return((CHAR)0xf1 & 0xff);
  365.       case 0xfee5: return((CHAR)0xf2 & 0xff);
  366.       case 0xfee9: return((CHAR)0xf3 & 0xff);
  367.       case 0xfeec: return((CHAR)0xf4 & 0xff);
  368.       case 0xfef0: return((CHAR)0xf5 & 0xff);
  369.       case 0xfef2: return((CHAR)0xf6 & 0xff);
  370.       case 0xfed0: return((CHAR)0xf7 & 0xff);
  371.       case 0xfed5: return((CHAR)0xf8 & 0xff);
  372.       case 0xfef5: return((CHAR)0xf9 & 0xff);
  373.       case 0xfef6: return((CHAR)0xfa & 0xff);
  374.       case 0xfedd: return((CHAR)0xfb & 0xff);
  375.       case 0xfed9: return((CHAR)0xfc & 0xff);
  376.       case 0xfef1: return((CHAR)0xfd & 0xff);
  377.       case 0x25a0: return((CHAR)0xfe & 0xff);
  378.       default: return(tx_cpsub(c)); /* For box characters etc */
  379.     }
  380. }
  381. int /* PC Code Page 866 */
  382. #ifdef CK_ANSIC
  383. tx_cp866(USHORT c)
  384. #else
  385. tx_cp866(c) USHORT c;
  386. #endif /* CK_ANSIC */
  387. {
  388.     if (c < 0x80) /* Has C1 graphics */
  389.       return((CHAR)(c & 0xff));
  390.     switch (c) {
  391.       case 0x00a0: return((CHAR)(255 & 0xff));
  392.       case 0x00a4: return((CHAR)(253 & 0xff));
  393.       case 0x00b0: return((CHAR)(248 & 0xff));
  394.       case 0x00b7: return((CHAR)(250 & 0xff));
  395.       case 0x0401: return((CHAR)(240 & 0xff));
  396.       case 0x0404: return((CHAR)(242 & 0xff));
  397.       case 0x0407: return((CHAR)(244 & 0xff));
  398.       case 0x040e: return((CHAR)(246 & 0xff));
  399.       case 0x0410: return((CHAR)(128 & 0xff));
  400.       case 0x0411: return((CHAR)(129 & 0xff));
  401.       case 0x0412: return((CHAR)(130 & 0xff));
  402.       case 0x0413: return((CHAR)(131 & 0xff));
  403.       case 0x0414: return((CHAR)(132 & 0xff));
  404.       case 0x0415: return((CHAR)(133 & 0xff));
  405.       case 0x0416: return((CHAR)(134 & 0xff));
  406.       case 0x0417: return((CHAR)(135 & 0xff));
  407.       case 0x0418: return((CHAR)(136 & 0xff));
  408.       case 0x0419: return((CHAR)(137 & 0xff));
  409.       case 0x041a: return((CHAR)(138 & 0xff));
  410.       case 0x041b: return((CHAR)(139 & 0xff));
  411.       case 0x041c: return((CHAR)(140 & 0xff));
  412.       case 0x041d: return((CHAR)(141 & 0xff));
  413.       case 0x041e: return((CHAR)(142 & 0xff));
  414.       case 0x041f: return((CHAR)(143 & 0xff));
  415.       case 0x0420: return((CHAR)(144 & 0xff));
  416.       case 0x0421: return((CHAR)(145 & 0xff));
  417.       case 0x0422: return((CHAR)(146 & 0xff));
  418.       case 0x0423: return((CHAR)(147 & 0xff));
  419.       case 0x0424: return((CHAR)(148 & 0xff));
  420.       case 0x0425: return((CHAR)(149 & 0xff));
  421.       case 0x0426: return((CHAR)(150 & 0xff));
  422.       case 0x0427: return((CHAR)(151 & 0xff));
  423.       case 0x0428: return((CHAR)(152 & 0xff));
  424.       case 0x0429: return((CHAR)(153 & 0xff));
  425.       case 0x042a: return((CHAR)(154 & 0xff));
  426.       case 0x042b: return((CHAR)(155 & 0xff));
  427.       case 0x042c: return((CHAR)(156 & 0xff));
  428.       case 0x042d: return((CHAR)(157 & 0xff));
  429.       case 0x042e: return((CHAR)(158 & 0xff));
  430.       case 0x042f: return((CHAR)(159 & 0xff));
  431.       case 0x0430: return((CHAR)(160 & 0xff));
  432.       case 0x0431: return((CHAR)(161 & 0xff));
  433.       case 0x0432: return((CHAR)(162 & 0xff));
  434.       case 0x0433: return((CHAR)(163 & 0xff));
  435.       case 0x0434: return((CHAR)(164 & 0xff));
  436.       case 0x0435: return((CHAR)(165 & 0xff));
  437.       case 0x0436: return((CHAR)(166 & 0xff));
  438.       case 0x0437: return((CHAR)(167 & 0xff));
  439.       case 0x0438: return((CHAR)(168 & 0xff));
  440.       case 0x0439: return((CHAR)(169 & 0xff));
  441.       case 0x043a: return((CHAR)(170 & 0xff));
  442.       case 0x043b: return((CHAR)(171 & 0xff));
  443.       case 0x043c: return((CHAR)(172 & 0xff));
  444.       case 0x043d: return((CHAR)(173 & 0xff));
  445.       case 0x043e: return((CHAR)(174 & 0xff));
  446.       case 0x043f: return((CHAR)(175 & 0xff));
  447.       case 0x0440: return((CHAR)(224 & 0xff));
  448.       case 0x0441: return((CHAR)(225 & 0xff));
  449.       case 0x0442: return((CHAR)(226 & 0xff));
  450.       case 0x0443: return((CHAR)(227 & 0xff));
  451.       case 0x0444: return((CHAR)(228 & 0xff));
  452.       case 0x0445: return((CHAR)(229 & 0xff));
  453.       case 0x0446: return((CHAR)(230 & 0xff));
  454.       case 0x0447: return((CHAR)(231 & 0xff));
  455.       case 0x0448: return((CHAR)(232 & 0xff));
  456.       case 0x0449: return((CHAR)(233 & 0xff));
  457.       case 0x044a: return((CHAR)(234 & 0xff));
  458.       case 0x044b: return((CHAR)(235 & 0xff));
  459.       case 0x044c: return((CHAR)(236 & 0xff));
  460.       case 0x044d: return((CHAR)(237 & 0xff));
  461.       case 0x044e: return((CHAR)(238 & 0xff));
  462.       case 0x044f: return((CHAR)(239 & 0xff));
  463.       case 0x0451: return((CHAR)(241 & 0xff));
  464.       case 0x0454: return((CHAR)(243 & 0xff));
  465.       case 0x0457: return((CHAR)(245 & 0xff));
  466.       case 0x045e: return((CHAR)(247 & 0xff));
  467.       case 0x2116: return((CHAR)(252 & 0xff));
  468.       case 0x2219: return((CHAR)(249 & 0xff));
  469.       case 0x221a: return((CHAR)(251 & 0xff));
  470.       case 0x2500: return((CHAR)(196 & 0xff));
  471.       case 0x2502: return((CHAR)(179 & 0xff));
  472.       case 0x250c: return((CHAR)(218 & 0xff));
  473.       case 0x2510: return((CHAR)(191 & 0xff));
  474.       case 0x2514: return((CHAR)(192 & 0xff));
  475.       case 0x2518: return((CHAR)(217 & 0xff));
  476.       case 0x251c: return((CHAR)(195 & 0xff));
  477.       case 0x2524: return((CHAR)(180 & 0xff));
  478.       case 0x252c: return((CHAR)(194 & 0xff));
  479.       case 0x2534: return((CHAR)(193 & 0xff));
  480.       case 0x253c: return((CHAR)(197 & 0xff));
  481.       case 0x2550: return((CHAR)(205 & 0xff));
  482.       case 0x2551: return((CHAR)(186 & 0xff));
  483.       case 0x2552: return((CHAR)(213 & 0xff));
  484.       case 0x2553: return((CHAR)(214 & 0xff));
  485.       case 0x2554: return((CHAR)(201 & 0xff));
  486.       case 0x2555: return((CHAR)(184 & 0xff));
  487.       case 0x2556: return((CHAR)(183 & 0xff));
  488.       case 0x2557: return((CHAR)(187 & 0xff));
  489.       case 0x2558: return((CHAR)(212 & 0xff));
  490.       case 0x2559: return((CHAR)(211 & 0xff));
  491.       case 0x255a: return((CHAR)(200 & 0xff));
  492.       case 0x255b: return((CHAR)(190 & 0xff));
  493.       case 0x255c: return((CHAR)(189 & 0xff));
  494.       case 0x255d: return((CHAR)(188 & 0xff));
  495.       case 0x255e: return((CHAR)(198 & 0xff));
  496.       case 0x255f: return((CHAR)(199 & 0xff));
  497.       case 0x2560: return((CHAR)(204 & 0xff));
  498.       case 0x2561: return((CHAR)(181 & 0xff));
  499.       case 0x2562: return((CHAR)(182 & 0xff));
  500.       case 0x2563: return((CHAR)(185 & 0xff));
  501.       case 0x2564: return((CHAR)(209 & 0xff));
  502.       case 0x2565: return((CHAR)(210 & 0xff));
  503.       case 0x2566: return((CHAR)(203 & 0xff));
  504.       case 0x2567: return((CHAR)(207 & 0xff));
  505.       case 0x2568: return((CHAR)(208 & 0xff));
  506.       case 0x2569: return((CHAR)(202 & 0xff));
  507.       case 0x256a: return((CHAR)(216 & 0xff));
  508.       case 0x256b: return((CHAR)(215 & 0xff));
  509.       case 0x256c: return((CHAR)(206 & 0xff));
  510.       case 0x2580: return((CHAR)(223 & 0xff));
  511.       case 0x2584: return((CHAR)(220 & 0xff));
  512.       case 0x2588: return((CHAR)(219 & 0xff));
  513.       case 0x258c: return((CHAR)(221 & 0xff));
  514.       case 0x2590: return((CHAR)(222 & 0xff));
  515.       case 0x2591: return((CHAR)(176 & 0xff));
  516.       case 0x2592: return((CHAR)(177 & 0xff));
  517.       case 0x2593: return((CHAR)(178 & 0xff));
  518.       case 0x25a0: return((CHAR)(254 & 0xff));
  519.       default: return(tx_cpsub(c)); /* For box characters etc */
  520.     }
  521. }
  522. int /* PC Code Page 869 */
  523. #ifdef CK_ANSIC
  524. tx_cp869(USHORT c)
  525. #else
  526. tx_cp869(c) USHORT c;
  527. #endif /* CK_ANSIC */
  528. {
  529.     if (c < 0x80) /* Has C1 graphics */
  530.       return((CHAR)(c & 0xff));
  531.     switch (c) {
  532.       case 0x00a0: return((CHAR)(255 & 0xff));
  533.       case 0x00a3: return((CHAR)(156 & 0xff));
  534.       case 0x00a6: return((CHAR)(138 & 0xff));
  535.       case 0x00a7: return((CHAR)(245 & 0xff));
  536.       case 0x00a8: return((CHAR)(249 & 0xff));
  537.       case 0x00a9: return((CHAR)(151 & 0xff));
  538.       case 0x00ab: return((CHAR)(174 & 0xff));
  539.       case 0x00ac: return((CHAR)(137 & 0xff));
  540.       case 0x00ad: return((CHAR)(240 & 0xff));
  541.       case 0x00b0: return((CHAR)(248 & 0xff));
  542.       case 0x00b1: return((CHAR)(241 & 0xff));
  543.       case 0x00b2: return((CHAR)(153 & 0xff));
  544.       case 0x00b3: return((CHAR)(154 & 0xff));
  545.       case 0x00b7: return((CHAR)(136 & 0xff));
  546.       case 0x00bb: return((CHAR)(175 & 0xff));
  547.       case 0x00bd: return((CHAR)(171 & 0xff));
  548.       case 0x0384: return((CHAR)(239 & 0xff));
  549.       case 0x0385: return((CHAR)(247 & 0xff));
  550.       case 0x0386: return((CHAR)(134 & 0xff));
  551.       case 0x0388: return((CHAR)(141 & 0xff));
  552.       case 0x0389: return((CHAR)(143 & 0xff));
  553.       case 0x038a: return((CHAR)(144 & 0xff));
  554.       case 0x038c: return((CHAR)(146 & 0xff));
  555.       case 0x038e: return((CHAR)(149 & 0xff));
  556.       case 0x038f: return((CHAR)(152 & 0xff));
  557.       case 0x0390: return((CHAR)(161 & 0xff));
  558.       case 0x0391: return((CHAR)(164 & 0xff));
  559.       case 0x0392: return((CHAR)(165 & 0xff));
  560.       case 0x0393: return((CHAR)(166 & 0xff));
  561.       case 0x0394: return((CHAR)(167 & 0xff));
  562.       case 0x0395: return((CHAR)(168 & 0xff));
  563.       case 0x0396: return((CHAR)(169 & 0xff));
  564.       case 0x0397: return((CHAR)(170 & 0xff));
  565.       case 0x0398: return((CHAR)(172 & 0xff));
  566.       case 0x0399: return((CHAR)(173 & 0xff));
  567.       case 0x039a: return((CHAR)(181 & 0xff));
  568.       case 0x039b: return((CHAR)(182 & 0xff));
  569.       case 0x039c: return((CHAR)(183 & 0xff));
  570.       case 0x039d: return((CHAR)(184 & 0xff));
  571.       case 0x039e: return((CHAR)(189 & 0xff));
  572.       case 0x039f: return((CHAR)(190 & 0xff));
  573.       case 0x03a0: return((CHAR)(198 & 0xff));
  574.       case 0x03a1: return((CHAR)(199 & 0xff));
  575.       case 0x03a3: return((CHAR)(207 & 0xff));
  576.       case 0x03a4: return((CHAR)(208 & 0xff));
  577.       case 0x03a5: return((CHAR)(209 & 0xff));
  578.       case 0x03a6: return((CHAR)(210 & 0xff));
  579.       case 0x03a7: return((CHAR)(211 & 0xff));
  580.       case 0x03a8: return((CHAR)(212 & 0xff));
  581.       case 0x03a9: return((CHAR)(213 & 0xff));
  582.       case 0x03aa: return((CHAR)(145 & 0xff));
  583.       case 0x03ab: return((CHAR)(150 & 0xff));
  584.       case 0x03ac: return((CHAR)(155 & 0xff));
  585.       case 0x03ad: return((CHAR)(157 & 0xff));
  586.       case 0x03ae: return((CHAR)(158 & 0xff));
  587.       case 0x03af: return((CHAR)(159 & 0xff));
  588.       case 0x03b0: return((CHAR)(252 & 0xff));
  589.       case 0x03b1: return((CHAR)(214 & 0xff));
  590.       case 0x03b2: return((CHAR)(215 & 0xff));
  591.       case 0x03b3: return((CHAR)(216 & 0xff));
  592.       case 0x03b4: return((CHAR)(221 & 0xff));
  593.       case 0x03b5: return((CHAR)(222 & 0xff));
  594.       case 0x03b6: return((CHAR)(224 & 0xff));
  595.       case 0x03b7: return((CHAR)(225 & 0xff));
  596.       case 0x03b8: return((CHAR)(226 & 0xff));
  597.       case 0x03b9: return((CHAR)(227 & 0xff));
  598.       case 0x03ba: return((CHAR)(228 & 0xff));
  599.       case 0x03bb: return((CHAR)(229 & 0xff));
  600.       case 0x03bc: return((CHAR)(230 & 0xff));
  601.       case 0x03bd: return((CHAR)(231 & 0xff));
  602.       case 0x03be: return((CHAR)(232 & 0xff));
  603.       case 0x03bf: return((CHAR)(233 & 0xff));
  604.       case 0x03c0: return((CHAR)(234 & 0xff));
  605.       case 0x03c1: return((CHAR)(235 & 0xff));
  606.       case 0x03c2: return((CHAR)(237 & 0xff));
  607.       case 0x03c3: return((CHAR)(236 & 0xff));
  608.       case 0x03c4: return((CHAR)(238 & 0xff));
  609.       case 0x03c5: return((CHAR)(242 & 0xff));
  610.       case 0x03c6: return((CHAR)(243 & 0xff));
  611.       case 0x03c7: return((CHAR)(244 & 0xff));
  612.       case 0x03c8: return((CHAR)(246 & 0xff));
  613.       case 0x03c9: return((CHAR)(250 & 0xff));
  614.       case 0x03ca: return((CHAR)(160 & 0xff));
  615.       case 0x03cb: return((CHAR)(251 & 0xff));
  616.       case 0x03cc: return((CHAR)(162 & 0xff));
  617.       case 0x03cd: return((CHAR)(163 & 0xff));
  618.       case 0x03ce: return((CHAR)(253 & 0xff));
  619.       case 0x2015: return((CHAR)(142 & 0xff));
  620.       case 0x2018: return((CHAR)(139 & 0xff));
  621.       case 0x2019: return((CHAR)(140 & 0xff));
  622.       case 0x2500: return((CHAR)(196 & 0xff));
  623.       case 0x2502: return((CHAR)(179 & 0xff));
  624.       case 0x250c: return((CHAR)(218 & 0xff));
  625.       case 0x2510: return((CHAR)(191 & 0xff));
  626.       case 0x2514: return((CHAR)(192 & 0xff));
  627.       case 0x2518: return((CHAR)(217 & 0xff));
  628.       case 0x251c: return((CHAR)(195 & 0xff));
  629.       case 0x2524: return((CHAR)(180 & 0xff));
  630.       case 0x252c: return((CHAR)(194 & 0xff));
  631.       case 0x2534: return((CHAR)(193 & 0xff));
  632.       case 0x253c: return((CHAR)(197 & 0xff));
  633.       case 0x2550: return((CHAR)(205 & 0xff));
  634.       case 0x2551: return((CHAR)(186 & 0xff));
  635.       case 0x2554: return((CHAR)(201 & 0xff));
  636.       case 0x2557: return((CHAR)(187 & 0xff));
  637.       case 0x255a: return((CHAR)(200 & 0xff));
  638.       case 0x255d: return((CHAR)(188 & 0xff));
  639.       case 0x2560: return((CHAR)(204 & 0xff));
  640.       case 0x2563: return((CHAR)(185 & 0xff));
  641.       case 0x2566: return((CHAR)(203 & 0xff));
  642.       case 0x2569: return((CHAR)(202 & 0xff));
  643.       case 0x256c: return((CHAR)(206 & 0xff));
  644.       case 0x2580: return((CHAR)(223 & 0xff));
  645.       case 0x2584: return((CHAR)(220 & 0xff));
  646.       case 0x2588: return((CHAR)(219 & 0xff));
  647.       case 0x2591: return((CHAR)(176 & 0xff));
  648.       case 0x2592: return((CHAR)(177 & 0xff));
  649.       case 0x2593: return((CHAR)(178 & 0xff));
  650.       case 0x25a0: return((CHAR)(254 & 0xff));
  651.       default: return(tx_cpsub(c)); /* For box characters etc */
  652.     }
  653. }
  654. int /* PC Code Page C0 graphics */
  655. #ifdef CK_ANSIC
  656. tx_smiley(USHORT c)
  657. #else
  658. tx_smiley(c) USHORT c;
  659. #endif /* CK_ANSIC */
  660. {
  661.     if (c > 0x1f)
  662.       return(-1);
  663.     switch (c) {
  664.       case 0x00a0: return((CHAR)0 & 0x7f);
  665.       case 0x00a7: return((CHAR)21 & 0x7f);
  666.       case 0x00b6: return((CHAR)20 & 0x7f);
  667.       case 0x2022: return((CHAR)7 & 0x7f);
  668.       case 0x203c: return((CHAR)19 & 0x7f);
  669.       case 0x2190: return((CHAR)27 & 0x7f);
  670.       case 0x2191: return((CHAR)24 & 0x7f);
  671.       case 0x2192: return((CHAR)26 & 0x7f);
  672.       case 0x2193: return((CHAR)25 & 0x7f);
  673.       case 0x2194: return((CHAR)29 & 0x7f);
  674.       case 0x2195: return((CHAR)18 & 0x7f);
  675.       case 0x21a8: return((CHAR)23 & 0x7f);
  676.       case 0x2319: return((CHAR)28 & 0x7f);
  677.       case 0x25ac: return((CHAR)22 & 0x7f);
  678.       case 0x25b2: return((CHAR)30 & 0x7f);
  679.       case 0x25ba: return((CHAR)16 & 0x7f);
  680.       case 0x25bc: return((CHAR)31 & 0x7f);
  681.       case 0x25c4: return((CHAR)17 & 0x7f);
  682.       case 0x25d8: return((CHAR)8 & 0x7f);
  683.       case 0x25d9: return((CHAR)10 & 0x7f);
  684.       case 0x25ef: return((CHAR)9 & 0x7f);
  685.       case 0x263a: return((CHAR)1 & 0x7f);
  686.       case 0x263b: return((CHAR)2 & 0x7f);
  687.       case 0x263c: return((CHAR)15 & 0x7f);
  688.       case 0x2640: return((CHAR)12 & 0x7f);
  689.       case 0x2642: return((CHAR)11 & 0x7f);
  690.       case 0x2660: return((CHAR)6 & 0x7f);
  691.       case 0x2663: return((CHAR)5 & 0x7f);
  692.       case 0x2665: return((CHAR)3 & 0x7f);
  693.       case 0x2666: return((CHAR)4 & 0x7f);
  694.       case 0x266a: return((CHAR)13 & 0x7f);
  695.       case 0x266c: return((CHAR)14 & 0x7f);
  696.       default: return(-1);
  697.     }
  698. }
  699. USHORT  /* Kermit font 0xE??? to Unicode substitutions */
  700. #ifdef CK_ANSIC
  701. tx_usub(USHORT c)
  702. #else
  703. tx_usub(c) USHORT c;
  704. #endif /* CK_ANSIC */
  705. {
  706.     if (c < 0xE000 || c > 0xEFFF)
  707.       return(c);
  708.     switch (c) {
  709.       case 0xE200: return(0x2524); /* Extensible Left Brace Middle */
  710.       case 0xE201: return(0x2570); /* Extensible Left Parenthesis bot */
  711.       case 0xE202: return(0x256d); /* Extensible left parenthesis top */
  712.       case 0xE203: return(0x2514); /* Extensible left SB bot */
  713.       case 0xE204: return(0x250c); /* Extensible left SB top */
  714.       case 0xE205: return(0x251c); /* Extensible right brace middle */
  715.       case 0xE206: return(0x256f); /* Extensible right parenthesis bot */
  716.       case 0xE207: return(0x256e); /* Extensible right parenthesis top */
  717.       case 0xE208: return(0x2518); /* Extensible right SB bot */
  718.       case 0xE209: return(0x2510); /* Extensible right SB top */
  719.       case 0xE20C: return(0x03a3); /* Summation symbol bot */
  720.       case 0xE20D: return(0x03a3); /* Summation symbol top */
  721.       case 0xE20E: return(0x2510); /* Right ceiling corner */
  722.       case 0xE20F: return(0x2518); /* Right floor corner */
  723.       case 0xE300: return(0x2502); /* V box line, extensible, left */
  724.       case 0xE309: return(0x2502); /* V box line, extensible, right */
  725.       case 0xE30A: return(0x258c); /* Diagonal fill, dark, UL */
  726.       case 0xE30B: return(0x2590); /* Diagonal fill, dark, UR */
  727.       case 0xE311: return(0x2500); /* H line - Scan 1 */
  728.       case 0xE313: return(0x2500); /* H line - Scan 3 */
  729.       case 0xE315: return(0x2500); /* H line - Scan 5 */
  730.       case 0xE317: return(0x2500); /* H line - Scan 7 */
  731.       case 0xE319: return(0x2500); /* H line - Scan 9 */
  732.       case 0xE320: return(0x2583); /* Quadrant LL */
  733.       case 0xE321: return(0x2490); /* Quadrant LR */
  734.       case 0xE322: return(0x258c); /* Quadrant UL */
  735.       case 0xE323: return(0x2588); /* Quadrant UL and LL and LR */
  736.       case 0xE324: return(0x2588); /* Quadrant UL and LR */
  737.       case 0xE325: return(0x2588); /* Quadrant UL and LR */
  738.       case 0xE326: return(0x2588); /* Quadrant UL and UR and LL */
  739.       case 0xE327: return(0x2588); /* Quadrant UL and UR and LR */
  740.       case 0xE328: return(0x2590); /* Quadrant UR */
  741.       case 0xE329: return(0x2588); /* Quadrant UR and LL and LR */
  742.       case 0xE400: return(0x221a); /* Radical symbol, small */
  743.       case 0xE401: return(0x00bf); /* Reverse question mark */
  744.       default: return((unsigned)0xfffd);
  745.     }
  746. }
  747. int /* Unicode to CP437 substitutions */
  748. #ifdef CK_ANSIC
  749. tx_cpsub(USHORT c)
  750. #else
  751. tx_cpsub(c) USHORT c;
  752. #endif /* CK_ANSIC */
  753. {
  754.     int x;
  755.     if (c < 0x0080) /* ASCII */
  756.       return((CHAR)(c & 0xff));
  757.     if (c >= 0x0080 && c <= 0x0100) {
  758. switch (c) { /* Latin-1 */
  759.   case 0x00A2: return(0x9b); /* Cent sign */
  760.   case 0x00A3: return(156); /* Pound sign */
  761.   case 0x00AC: return(170); /* Not symbol */
  762.   case 0x00B0: return(248); /* Degree symbol */
  763.   case 0x00B1: return(241); /* Plus or minus symbol */
  764.   case 0x00B2: return(253); /* Superscript 2 */
  765.   case 0x00B3: return(51); /* Superscript 3 */
  766.   case 0x00B6: return(14); /* Pilcrow symbol */
  767.   case 0x00B7: return(250); /* Center dot, small */
  768.   case 0x00B9: return(49); /* Superscript 1 */
  769.   case 0x00D0: return(68); /* Eth -> D */
  770.   case 0x00D7: return(120); /* Multiplication symbol */
  771.   case 0x00DE: return(84); /* Thorn -> T */
  772.   case 0x00F0: return(100); /* eth -> eth */
  773.   case 0x00F7: return(246); /* Division symbol */
  774.   case 0x00FE: return(116); /* thorn -> t */
  775.   default: return(0x13);
  776. }
  777.     } else if (c >= 0x0100 && c <= 0x02ff) { /* Latin-2 etc */
  778. switch (c) {
  779.   case 0x0103: return(97); /* a breve */
  780.   case 0x0105: return(97); /* a ogonek */
  781.   case 0x0107: /* c acute */
  782.   case 0x010d: return(99); /* c caron */
  783.   case 0x010f: /* d caron */
  784.   case 0x0111: return(100); /* d with stroke */
  785.   case 0x0119: /* e ogonek */
  786.   case 0x011b: return(101); /* e caron */
  787.   case 0x011f: return(103); /* g breve */
  788.   case 0x0130: return(73); /* Capital I with Dot */
  789.   case 0x0131: return(105); /* Dotless i */
  790.   case 0x0132: return(89); /* IJ => Y */
  791.   case 0x0133: return(152); /* ij -> y diaeresis */
  792.   case 0x013a: /* l acute */
  793.   case 0x013e: /* l caron */
  794.   case 0x0142: return(108); /* l with stroke */
  795.   case 0x0144: /* n acute */
  796.   case 0x0148: return(110); /* n caron */
  797.   case 0x0151: return(111); /* o double acute */
  798.   case 0x0152: return(79); /* OE */
  799.   case 0x0153: return(111); /* oe */
  800.   case 0x0155: /* r acute */
  801.   case 0x0159: return(114); /* r caron */
  802.   case 0x015b: /* s acute */
  803.   case 0x015f: /* s ogonek */
  804.   case 0x0161: return(115); /* s caron */
  805.   case 0x0163: /* t ogonek */
  806.   case 0x0165: /* t caron */
  807.   case 0x0167: return(116); /* t with stroke */
  808.   case 0x016f: /* u ring */
  809.   case 0x0171: return(117); /* u double acute */
  810.   case 0x017a: /* z acute */
  811.   case 0x017c: /* z dot above */
  812.   case 0x017e: return(122); /* z caron */
  813.   case 0x0192: return(159); /* Function-of symbol, Script f */
  814.   case 0x01d0: return(105); /* i caron */
  815.   case 0x02c7: /* caron -> UNK */
  816.   case 0x02d8: return(0x13); /* breve -> UNK */
  817.   case 0x02dd: return(34); /* Double acute -> Doublequote */
  818.   default: return(0x13);
  819. }
  820.     } else if (c >= 0x0300 && c <= 0x03ff) { /* Greek */
  821. switch (c) {
  822.   case 0x0393: return(226); /* Uppercase Greek Gamma */
  823.   case 0x0398: return(233); /* Uppercase Greek Theta */
  824.   case 0x039B: return(235); /* Uppercase Greek Lambda */
  825.   case 0x03A0: return(227); /* Uppercase Greek Pi */
  826.   case 0x03A3: return(228); /* Uppercase Greek Sigma */
  827.   case 0x03A4: return(0xEA); /* Omega */
  828.   case 0x03A6: return(232); /* Uppercase Greek Phi */
  829.   case 0x03A9: return(234); /* Uppercase Greek Omega */
  830.   case 0x03B1: return(0xE0); /* alpha */
  831.   case 0x03B2: return(0xE1); /* beta */
  832.   case 0x03B3: return(226); /* Lowercase Greek gamma */
  833.   case 0x03B4: return(0xEB); /* delta */
  834.   case 0x03B5: return(238); /* Lowercase Greek epsilon */
  835.   case 0x03B7: return(238); /* Lowercase Greek eta */
  836.   case 0x03B8: return(233); /* Lowercase Greek theta */
  837.   case 0x03B9: return(105); /* Lowercase Greek iota */
  838.   case 0x03BA: return(107); /* Lowercase Greek kappa */
  839.   case 0x03BB: return(235); /* Lowercase Greek lambda */
  840.   case 0x03BC: return(230); /* Lowercase Greek mu */
  841.   case 0x03C0: return(227); /* Lowercase Greek pi */
  842.   case 0x03C3: return(229); /* Lowercase Greek sigma */
  843.   case 0x03C4: return(231); /* Lowercase Greek tau */
  844.   case 0x03C6: return(237); /* Lowercase Greek phi */
  845.   case 0x03C7: return(120); /* Lowercase Greek chi */
  846.   case 0x03C9: return(234); /* Lowercase Greek omega */
  847.   default: return(0x13);
  848. }
  849.     } else if (c >= 0x2000 && c <= 0x20ff) { /* Sub+Superscripts & Currency */
  850. switch (c) {
  851.   case 0x203C: return(0x13); /* !! */
  852.   case 0x2070: return(48); /* Superscript 0 */
  853.   case 0x2074: return(52); /* Superscript 4 */
  854.   case 0x2075: return(53); /* Superscript 5 */
  855.   case 0x2076: return(54); /* Superscript 6 */
  856.   case 0x2077: return(55); /* Superscript 7 */
  857.   case 0x2078: return(56); /* Superscript 8 */
  858.   case 0x2079: return(57); /* Superscript 9 */
  859.   case 0x207a: return(43); /* Superscript + */
  860.   case 0x207b: return(45); /* Superscript - */
  861.   case 0x207F: return(252); /* Superscript n */
  862.   case 0x2080: return(48); /* Subscript 0 */
  863.   case 0x2081: return(49); /* Subscript 1 */
  864.   case 0x2082: return(50); /* Subscript 2 */
  865.   case 0x2083: return(51); /* Subscript 3 */
  866.   case 0x2084: return(52); /* Subscript 4 */
  867.   case 0x2085: return(53); /* Subscript 5 */
  868.   case 0x2086: return(54); /* Subscript 6 */
  869.   case 0x2087: return(55); /* Subscript 7 */
  870.   case 0x2088: return(56); /* Subscript 8 */
  871.   case 0x2089: return(57); /* Subscript 9 */
  872.   case 0x208a: return(43); /* Subscript + */
  873.   case 0x208b: return(45); /* Subscript - */
  874.   case 0x20a7: return(0x93); /* Peseta */
  875.   default:
  876.     x = tx_punc(c); /* Various spaces, dashes, etc */
  877.     return((x < 0) ? 0x13 : x);
  878. }
  879.     } else if (c >= 0x2100 && c <= 0x21ff) { /* Arrows */
  880. switch (c) {
  881.   case 0x2190: return(27); /* Arrow, left-pointing */
  882.   case 0x2191: return(24); /* Arrow, up-pointing */
  883.   case 0x2192: return(26); /* Arrow, right-pointing */
  884.   case 0x2193: return(25); /* Arrow, down-pointing */
  885.   case 0x2194: return(0x1d); /* Arrow, left-right */
  886.   case 0x2195: return(0x12); /* Arrow, up-down */
  887.   case 0x219F: return(0x18); /* Arrow, up, doublehead */
  888.   case 0x21A1: return(0x19); /* Arrow, down, doublehead */
  889.   case 0x21A8: return(0x17); /* Arrow, up-down with base */
  890.   case 0x21D2: return(26); /* Implies symbol */
  891.   case 0x21D4: return(29); /* If and only if symbol */
  892.   case 0x21E4: return(0x1B); /* Arrow, left, to bar */
  893.   case 0x21E5: return(0x1A); /* Arrow, right, to bar */
  894.   case 0x21E8: return(0x10); /* Outline white right arrow */
  895.   case 0x21E9: return(0x0f); /* Outline white down arrow */
  896.   default: return(0x13);
  897. }
  898.     } else if (c >= 0x2200 && c <= 0x22ff) { /* Math */
  899. switch (c) {
  900.   case 0x2202: return(235); /* Partial differential symbol */
  901.   case 0x2207: return(31); /* Nabla, Laplace operator */
  902.   case 0x2208: return(0x33); /* (because of QNX misunderstanding) */
  903.   case 0x221A: return(251); /* Radical symbol */
  904.   case 0x221D: return(236); /* Proportional-to */
  905.   case 0x221E: return(236); /* Infinity symbol */
  906.   case 0x2227: return(30); /* Logical AND */
  907.   case 0x2228: return(31); /* Logical OR */
  908.   case 0x2229: return(239); /* Intersection symbol */
  909.   case 0x222A: return(85); /* Union symbol */
  910.   case 0x222B: return(244); /* Integral symbol */
  911.   case 0x2234: return(254); /* Therefore symbol */
  912.   case 0x223C: return(126); /* Centered tilde operator */
  913.   case 0x2243: return(247); /* Asymptotically equals */
  914.   case 0x2248: return(247); /* Almost equal to symbol */
  915.   case 0x2260: return(88); /* Not equal symbol */
  916.   case 0x2261: return(240); /* Identity symbol */
  917.   case 0x2264: return(243); /* Less than or equal symbol */
  918.   case 0x2265: return(242); /* Greater than or equal symbol */
  919.   case 0x2282: return(40); /* Subset symbol */
  920.   case 0x2283: return(41); /* Superset symbol */
  921.   case 0x22A6: return(0xC3); /* Assertion symbol */
  922.   default: return(0x13);
  923. }
  924.     } else if (c >= 0x2300 && c <= 0x24ff) { /* Tech */
  925. switch (c) {
  926.   case 0x2308: return(0xDA); /* Left ceiling */
  927.   case 0x2309: return(0xBF); /* Right ceiling */
  928.   case 0x230A: return(0xC0); /* Left floor */
  929.   case 0x230B: return(0xD9); /* Right floor */
  930.   case 0x2319: return(0x1C); /* Turned Not sign */
  931.   case 0x2320: return(244); /* Integral symbol top */
  932.   case 0x2321: return(245); /* Integral symbol bot */
  933.   case 0x2329: return(60); /* BRA, large left angle bracket */
  934.   case 0x232A: return(62); /* KET, large right angle bracket */
  935.   case 0x2409: return(26); /* "HT" becomes right arrow */
  936.   case 0x240A: return(25); /* "LF" becomes down arrow */
  937.   case 0x240B: return(23); /* "VT" becomes up-down arrow */
  938.   case 0x240C: return(24); /* "FF" becomes up arrow */
  939.   case 0x240D: return(27); /* "CR" becomes left arrow */
  940.   case 0x2424: return(31); /* "NL" becomes down triangle */
  941.   default: return(0x13);
  942. }
  943.     } else if (c >= 0x2500 && c <= 0x2552) { /* Box drawing */
  944. switch (c) {
  945.   case 0x2500: return(196); /* Center box bar horizontal */
  946.   case 0x2501: return(0xCD); /* Bold -> Double */
  947.   case 0x2502: return(179); /* Center box bar vertical */
  948.   case 0x2503: return(0xBA); /* Bold */
  949.   case 0x2504: return(45); /* Dashed line */
  950.   case 0x2506: return(124); /* Broken vertical bar */
  951.   case 0x250C: return(218); /* UL box corner */
  952.   case 0x250F: return(0xC9); /* Bold */
  953.   case 0x2510: return(191); /* UR Box Corner */
  954.   case 0x2513: return(0xBB); /* Bold */
  955.   case 0x2514: return(192); /* LL box corner */
  956.   case 0x2517: return(0xC8); /* Bold */
  957.   case 0x2518: return(217); /* LR box corner */
  958.   case 0x251B: return(0xBC); /* Bold */
  959.   case 0x251C: return(195); /* Left middle box side */
  960.   case 0x2520: return(0xC3);
  961.   case 0x2523: return(0xCC); /* Bold */
  962.   case 0x2524: return(180); /* Right middle box side */
  963.   case 0x2528: return(180);
  964.   case 0x252B: return(0xB9); /* Bold */
  965.   case 0x252C: return(194); /* Middle box top */
  966.   case 0x252F: return(194);
  967.   case 0x2533: return(0xCB); /* Bold */
  968.   case 0x2534: return(193); /* Middle box bot */
  969.   case 0x2537: return(193);
  970.   case 0x253B: return(0xCA); /* Bold */
  971.   case 0x253C: return(197); /* Box intersection */
  972.   case 0x253F: return(197);
  973.   case 0x2542: return(197);
  974.   case 0x2547: return(197);
  975.   case 0x2548: return(197);
  976.   case 0x2549: return(197);
  977.   case 0x254A: return(197);
  978.   case 0x254B: return(0xCE); /* Bold */
  979.   case 0x2550: return(205); /* Center box bar horizontal double */
  980.   case 0x2551: return(186); /* Center box bar vertical double */
  981.   case 0x2552: return(213); /* UL box corner single to double */
  982.   default: return(0x13);
  983. }
  984.     } else if (c >= 0x2553 && c <= 0x2579) { /* More box drawing */
  985. switch (c) {
  986.   case 0x2553: return(214); /* UL box corner double to single */
  987.   case 0x2554: return(201); /* UL box corner double */
  988.   case 0x2555: return(184); /* UR box corner double to single */
  989.   case 0x2556: return(183); /* UR box corner single to double */
  990.   case 0x2557: return(187); /* UR box corner double */
  991.   case 0x2558: return(212); /* LL box corner single to double */
  992.   case 0x2559: return(211); /* LL box corner double to single */
  993.   case 0x255A: return(200); /* LL box corner double */
  994.   case 0x255B: return(190); /* LR box corner double to single */
  995.   case 0x255C: return(189); /* LR box corner single to double */
  996.   case 0x255D: return(188); /* LR box corner double */
  997.   case 0x255E: return(198); /* Left mid box side single to doubl */
  998.   case 0x255F: return(199); /* Left mid box side double to singl */
  999.   case 0x2560: return(204); /* Left middle box side double */
  1000.   case 0x2561: return(181); /* Right box side double to single */
  1001.   case 0x2562: return(182); /* Right box side single to double */
  1002.   case 0x2563: return(185); /* Right middle box side double */
  1003.   case 0x2564: return(209); /* Middle box top double to single */
  1004.   case 0x2565: return(210); /* Middle box top single to double */
  1005.   case 0x2566: return(203); /* Middle box top double */
  1006.   case 0x2567: return(207); /* Middle box bot single to double */
  1007.   case 0x2568: return(208); /* Middle box bot double to single */
  1008.   case 0x2569: return(202); /* Middle box bot double */
  1009.   case 0x256A: return(216); /* Box intersection double to single */
  1010.   case 0x256B: return(215); /* Box intersection single to double */
  1011.   case 0x256C: return(206); /* Box intersection double */
  1012.   case 0x256D: return(218); /* UL arc */
  1013.   case 0x256E: return(191); /* UR arc */
  1014.   case 0x256F: return(217); /* LR arc */
  1015.   case 0x2570: return(192); /* LL arc */
  1016.   case 0x2571: return(179); /* Diagonal line LL to UR */
  1017.   case 0x2572: return(196); /* Diagonal line UL to LR */
  1018.   case 0x2573: return(88); /* Diagonal lines crossed */
  1019.   case 0x2575: return(0xb3); /* High vertical line */
  1020.   case 0x2576: return(45); /* Short horizontal line */
  1021.   case 0x2577: return(0xb3); /* Low vertical line */
  1022.   case 0x2579: return(0xb3); /* High vertical line bold */
  1023.   default: return(0x13);
  1024. }
  1025.     } else if (c >= 0x257a && c <= 0x25ff) { /* Still more box drawing */
  1026. switch (c) {
  1027.   case 0x257b: return(0xb3); /* Low vertical line bold */
  1028.   case 0x2580: return(223); /* Quadrant UL and UR (top half) */
  1029.   case 0x2581: return(0xc4); /* Scan line 9 */
  1030.   case 0x2582: return(0xDC); /* Black blob lower half */
  1031.   case 0x2584: return(220); /* Quadrant LL and LR (lower half) */
  1032.   case 0x2588: return(219); /* Fill character dark */
  1033.   case 0x258C: return(221); /* Quadrant UL and LL (left half) */
  1034.   case 0x258E: return(0xDD);
  1035.   case 0x2590: return(222); /* Quadrant UR and LR (right half) */
  1036.   case 0x2591: return(176); /* Fill character light */
  1037.   case 0x2592: return(177); /* Fill character medium */
  1038.   case 0x2593: return(178); /* Fill character heavy */
  1039.   case 0x2594: return(0xc4); /* Scan line 1 */
  1040.   case 0x25A0: return(254); /* Solid square, center */
  1041.   case 0x25A6: return(177); /* Blotch */
  1042.   case 0x25AC: /* Black rectangle */
  1043.   case 0x25AF: return(0x16); /* White rectangle */
  1044.   case 0x25B2: /* Triangle, up-pointing */
  1045.   case 0x25B4: return(0x1e); /* Triangle, up-pointing */
  1046.   case 0x25B6: /* Triangle, right-pointing, dark */
  1047.   case 0x25B7: /* Triangle, right-pointing, light */
  1048.   case 0x25B9: /* Triangle, right-pointing, light */
  1049.   case 0x25BA: return(0x10); /* Triangle, right-pointing, narrow */
  1050.   case 0x25BC: /* Triangle, down-pointing */
  1051.   case 0x25BE: return(0x1f); /* Triangle, down-pointing */
  1052.   case 0x25C0: /* Triangle, left-pointing, dark */
  1053.   case 0x25C1: /* Triangle, left-pointing, dark */
  1054.   case 0x25C4: return(0x11); /* Triangle, left-pointing, narrow */
  1055.   case 0x25C6: return(4); /* Diamond, center, solid */
  1056.   case 0x25CB: return(0x09); /* Circle */
  1057.   case 0x25CF: return(249); /* Center dot, large */
  1058.   case 0x25d8: return(0x08); /* Inverse bullet */
  1059.   case 0x25d9: return(0x0a); /* Inverse white circle */
  1060.   case 0x25E2: return(0xD9); /* Lower right triangle */
  1061.   case 0x25E3: return(0xC0); /* Lower left triangle */
  1062.   case 0x25E4: return(0xDA); /* Upper left triangle */
  1063.   case 0x25E5: return(0xBf); /* Upper right triangle */
  1064.   default: return(0x13);
  1065. }
  1066.     } else if (c >= 0x2600) { /* All the rest */
  1067. switch (c) {
  1068.   case 0x263a: return(0x01); /* Smiley */
  1069.   case 0x263b: return(0x02); /* Inverse Smiley */
  1070.   case 0x263c: return(0x0f); /* White Sun with Rays */
  1071.   case 0x2640: return(0x0c); /* Male sign */
  1072.   case 0x2642: return(0x0b); /* Female sign */
  1073.   case 0x2660: return(0x06); /* Spade */
  1074.   case 0x2663: return(0x05); /* Club */
  1075.   case 0x2665: return(0x03); /* Heart */
  1076.   case 0x2666: return(0x04); /* Diamond, center, solid */
  1077.   case 0x266a: return(0x0d); /* Quarter note */
  1078.   case 0x266b: /* Beamed quarter notes */
  1079.   case 0x266c: return(0x0e); /* Beamed 8th notes */
  1080.   case 0x279e: return(0x1a); /* Bold right arrow */
  1081.   case 0x27a1: return(0x1a); /* Heavy black right arrow. */
  1082.   case 0xE200: return(180); /* Extensible left brace middle */
  1083.   case 0xE201: return(192); /* Extensible Left parenthesis bot */
  1084.   case 0xE202: return(218); /* Extensible left parenthesis top */
  1085.   case 0xE203: return(192); /* Extensible left SB bot */
  1086.   case 0xE204: return(218); /* Extensible left SB top */
  1087.   case 0xE205: return(195); /* Extensible right brace middle */
  1088.   case 0xE206: return(217); /* Extensible right parenthesis bot */
  1089.   case 0xE207: return(191); /* Extensible right parenthesis top */
  1090.   case 0xE208: return(217); /* Extensible right SB bot */
  1091.   case 0xE209: return(191); /* Extensible right SB top */
  1092.   case 0xE20C: return(228); /* Summation symbol bot */
  1093.   case 0xE20D: return(228); /* Summation symbol top */
  1094.   case 0xE20E: return(191); /* Right ceiling corner */
  1095.   case 0xE20F: return(217); /* Right floor corner */
  1096.   case 0xE300: return(179); /* V box line, extensible, left */
  1097.   case 0xE309: return(179); /* V box line, extensible, right */
  1098.   case 0xE30A: return(221); /* Diagonal fill, dark, UL */
  1099.   case 0xE30B: return(222); /* Diagonal fill, dark, UR */
  1100.   case 0xE311: return(196); /* H line - Scan 1 */
  1101.   case 0xE313: return(196); /* H line - Scan 3 */
  1102.   case 0xE315: return(196); /* H line - Scan 5 */
  1103.   case 0xE317: return(196); /* H line - Scan 7 */
  1104.   case 0xE319: return(196); /* H line - Scan 9 */
  1105.   case 0xE320: return(221); /* Quadrant LL */
  1106.   case 0xE321: return(222); /* Quadrant LR */
  1107.   case 0xE322: return(221); /* Quadrant UL */
  1108.   case 0xE323: return(219); /* Quadrant UL and LL and LR */
  1109.   case 0xE324: return(219); /* Quadrant UL and LR */
  1110.   case 0xE325: return(219); /* Quadrant UL and LR */
  1111.   case 0xE326: return(219); /* Quadrant UL and UR and LL */
  1112.   case 0xE327: return(219); /* Quadrant UL and UR and LR */
  1113.   case 0xE328: return(222); /* Quadrant UR */
  1114.   case 0xE329: return(219); /* Quadrant UR and LL and LR */
  1115.   case 0xE400: return(251); /* Radical symbol, small */
  1116.   case 0xE401: return(168); /* Reverse question mark */
  1117.   case 0xFFFD: return(0x13); /* !! for unknown */
  1118.   default: return(0x13);
  1119. }
  1120.     }
  1121.     return(0x13);
  1122. }
  1123. #ifdef OS2
  1124. /*
  1125.   Lucida Console is a Unicode font, but it is very sparsely populated.
  1126.   Since it is the only monospace Unicode font most people have, we have
  1127.   to make reasonable substitutions or else 3/4 of the glyphs will show
  1128.   up as blobs on the screen.
  1129. */
  1130. USHORT /* Unicode to Lucida Console */
  1131. #ifdef CK_ANSIC
  1132. tx_lucidasub(USHORT c)
  1133. #else
  1134. tx_lucidasub(c) USHORT c;
  1135. #endif /* CK_ANSIC */
  1136. {
  1137.     if (c < 0x0180) /* Latin-1 and Extended A */
  1138.       return(c);
  1139. /* For efficiency we try to arrange the sections by frequency of use. */
  1140.     if (c >= 0x2500 && c <= 0x257f) { /* Box drawing */
  1141. if (c >= 0x2550 && c <= 0x256c)
  1142.   return(c);
  1143. switch (c) {
  1144.   /* Themselves */
  1145.         case 0x2500:
  1146.         case 0x2502:
  1147.         case 0x250c:
  1148.         case 0x2510:
  1149.         case 0x2514:
  1150.         case 0x2518:
  1151.         case 0x251c:
  1152.         case 0x2524:
  1153.         case 0x252c:
  1154.         case 0x2534:
  1155.         case 0x253c:
  1156.             return(c);
  1157.   /* Horizontal lines */
  1158.         case 0x2501: /* Bold */
  1159.     return(0x2550); /* Use double */
  1160.         case 0x2504:
  1161.         case 0x2505:
  1162.         case 0x2508:
  1163.         case 0x2509:
  1164.         case 0x254c:
  1165.         case 0x254d:
  1166.         case 0x257c:
  1167.         case 0x257e:
  1168.             return(0x2500);
  1169.   /* Vertical lines */
  1170.         case 0x2503: /* Bold */
  1171.     return(0x2551); /* Use double */
  1172.         case 0x2506:
  1173.         case 0x2507:
  1174.         case 0x250a:
  1175.         case 0x250b: /* Other */
  1176.         case 0x254e:
  1177.         case 0x254f:
  1178.         case 0x257d:
  1179.         case 0x257f:
  1180.         case 0x2575:
  1181.         case 0x2577:
  1182.         case 0x2579:
  1183.         case 0x257b:
  1184.             return(0x2502);
  1185.             /* Upper left box corner */
  1186.         case 0x250f: /* Bold */
  1187.     return(0x2554); /* Use double */
  1188.         case 0x250d: case 0x250e: /* Other */
  1189.     return(0x250c);
  1190.   /* Upper right box corner */
  1191.         case 0x2513: /* Bold */
  1192.     return(0x2557);
  1193.         case 0x2511:
  1194.         case 0x2512: /* Other */
  1195.     return(0x2510);
  1196.   /* Lower left box corner */
  1197.         case 0x2517: /* Bold */
  1198.     return(0x255a);
  1199.         case 0x2515:
  1200.         case 0x2516: /* Other */
  1201.     return(0x2514);
  1202.   /* Lower right box corner */
  1203.         case 0x251b: /* Bold */
  1204.     return(0x255d);
  1205.         case 0x2519:
  1206.         case 0x251a: /* Other */
  1207.     return(0x2518);
  1208.   /* Vertical and right */
  1209.         case 0x2523: /* Bold */
  1210.     return(0x2560);
  1211.         case 0x251d:
  1212.         case 0x251e:
  1213.         case 0x251f:
  1214.         case 0x2520:
  1215.         case 0x2521:
  1216.         case 0x2522:
  1217.             return(0x251c);
  1218.   /* Vertical and left */
  1219.         case 0x252b: /* Bold */
  1220.     return(0x2563);
  1221.         case 0x2525:
  1222.         case 0x2526:
  1223.         case 0x2527:
  1224.         case 0x2528:
  1225.         case 0x2529:
  1226.         case 0x252a:
  1227.             return(0x2524);
  1228.   /* Horizontal and down */
  1229.   case 0x2533: /* Bold */
  1230.     return(0x2566);
  1231.         case 0x252d:
  1232.         case 0x252e:
  1233.         case 0x252f:
  1234.         case 0x2530:
  1235.         case 0x2531:
  1236.         case 0x2532:
  1237.             return(0x252c);
  1238.             /* Horizontal and up */
  1239.         case 0x253b: /* Bold */
  1240.     return(0x2569);
  1241.         case 0x2535: case 0x2536: case 0x2537:
  1242.         case 0x2538: case 0x2539: case 0x253a:
  1243.             return(0x2534);
  1244.   /* Horizontal and Vertical */
  1245.   case 0x254b: /* Bold */
  1246.     return(0x256c);
  1247.   case 0x253d: case 0x253e: case 0x253f:
  1248.         case 0x2540: case 0x2541: case 0x2542: case 0x2543:
  1249.         case 0x2544: case 0x2545: case 0x2546: case 0x2547:
  1250.         case 0x2548: case 0x2549: case 0x254a:
  1251.             return(0x253c);
  1252.   /* Curved corners */
  1253.   case 0x256d: /* UL */
  1254.     return(0x250c);
  1255.   case 0x256e: /* UR */
  1256.     return(0x2510);
  1257.   case 0x256f: /* LL */
  1258.     return(0x2518);
  1259.   case 0x2570: /* LR */
  1260.     return(0x2514);
  1261.   case 0x2571: /* Diagonal */
  1262.     return(0x002f);
  1263.   case 0x2572: /* Other diagonal */
  1264.     return(0x005c);
  1265.   case 0x2573: /* Diagonal cross */
  1266.     return(0x00d7);
  1267.   /* Partial horizontal lines */
  1268.         case 0x2574: case 0x2576: case 0x2578: case 0x257a:
  1269.             return(0x002d);
  1270.         default:
  1271.             return(0xfffd);
  1272. }
  1273.     }
  1274.     if (c >= 0x2190 && c <= 0x21ff) { /* Arrows */
  1275. if (c >= 0x2190 && c <= 0x2195 || c == 0x21a8)
  1276.   return(c);
  1277. switch (c) {
  1278.   /* Left-arrow forms */
  1279.         case 0x219e: case 0x21a2: case 0x21a4: case 0x21a9:
  1280.         case 0x21bc: case 0x21d0: case 0x21da: case 0x21dc:
  1281.         case 0x21e0: case 0x21e4: case 0x21e6: case 0x21c7:
  1282.             return(0x2190);
  1283.   /* Right-arrow forms */
  1284.         case 0x21a0: case 0x21a3: case 0x21a6: case 0x21aa:
  1285.         case 0x21c0: case 0x21c1: case 0x21c9: case 0x21d2:
  1286.         case 0x21db: case 0x21dd: case 0x21e2: case 0x21e5:
  1287.         case 0x21e8:
  1288.             return(0x2192);
  1289.   /* Up-arrow forms */
  1290.         case 0x219f: case 0x21a5: case 0x21be: case 0x21bf:
  1291.         case 0x21c8: case 0x21d1: case 0x21de: case 0x21e1:
  1292.         case 0x21e7: case 0x21ea:
  1293.             return(0x2191);
  1294.   /* Down-arrow forms */
  1295.         case 0x21a1: case 0x21a7: case 0x21af: case 0x21c2:
  1296.         case 0x21ce: case 0x21ca: case 0x21d3: case 0x21df:
  1297.         case 0x21e3: case 0x21e9:
  1298.             return(0x2193);
  1299.   /* Up-down-arrow forms */
  1300.         case 0x21c5: case 0x21d5:
  1301.             return(0x2195);
  1302.         default:
  1303.             return(0xfffd);
  1304. }
  1305.     }
  1306.     if (c >= 0x2580 && c <= 0x259f) { /* Block elements */
  1307. switch (c) {
  1308.         case 0x2580: case 0x2584: case 0x2588: case 0x258c:
  1309.         case 0x2590: case 0x2591: case 0x2592: case 0x2593:
  1310.             return(c);
  1311.         case 0x2581: case 0x2582: case 0x2583:
  1312.         case 0x2585: case 0x2586: case 0x2587:
  1313.             return(0x2584);
  1314.         case 0x2589: case 0x258a: case 0x258b:
  1315.         case 0x258d: case 0x258e: case 0x258f:
  1316.     return(0x258c);
  1317.         case 0x2595:
  1318.             return(0x2502);
  1319.         default:
  1320.             return(0xfffd);
  1321. }
  1322.     }
  1323.     if (c >= 0x2200 && c <= 0x22ff) { /* Mathematical operators */
  1324. switch (c) {
  1325.         case 0x2202: case 0x2206: case 0x220f: case 0x2211: case 0x2212:
  1326.         case 0x2219: case 0x2220: case 0x221e: case 0x221f: case 0x2229:
  1327.         case 0x222b: case 0x2248: case 0x2260: case 0x2261: case 0x2264:
  1328.         case 0x2265:
  1329.             return(c);
  1330.         default:
  1331.             return(0xfffd);
  1332. }
  1333.     }
  1334.     if (c >= 0x2300 && c <= 0x237f) { /* Miscellaneous Technical */
  1335. if (c == 0x2302 || c == 0x2310 || c == 0x2320 || c == 0x2321)
  1336.   return(c);
  1337. switch (c) {
  1338.   case 0x2329: /* BRA */
  1339.     return(0x003c);
  1340.   case 0x232a: /* KET */
  1341.     return(0x003e);
  1342.         default:
  1343.               return(0xfffd);
  1344. }
  1345.     }
  1346.     if (c >= 0x25a0 && c <= 0x25ff) { /* Geometric shapes */
  1347. switch (c) {
  1348.   /* Themselves */
  1349.         case 0x25a0: case 0x25ac: case 0x25b2: case 0x25ba:
  1350.         case 0x25bc: case 0x25c4: case 0x25ca: case 0x25cb:
  1351.         case 0x25d8: case 0x25d9:
  1352.             return(c);
  1353.   /* Squares */
  1354.   case 0x25a1: case 0x25a2: case 0x25a3: case 0x25a4:
  1355.   case 0x25a5: case 0x25a6: case 0x25a7: case 0x25a8:
  1356.         case 0x25a9: case 0x25aa: case 0x25ab:
  1357.         case 0x25e7: case 0x25e8: case 0x25e9: case 0x25ea: case 0x25eb:
  1358.             return(0x25a0);
  1359.   case 0x25ad: case 0x25ae: case 0x25af: /* Rectangles */
  1360.         case 0x25b0: case 0x25b1:
  1361.             return(0x25ac);
  1362.   case 0x25b3: case 0x25b4: case 0x25b5: /* Upright triangles */
  1363.         case 0x25ec: case 0x25ed: case 0x25ee:
  1364.             return(0x25b2);
  1365.         case 0x25b6: case 0x25b7: case 0x25b8: case 0x25b9: case 0x25bb:
  1366.             return(0x25ba);          /* Right-pointing triangles */
  1367.   case 0x25bd: case 0x25be: case 0x25bf: /* Down-pointing triangles */
  1368.     return(0x25bc);
  1369.         case 0x25c0: case 0x25c1: case 0x25c2: case 0x25c3: case 0x25c5:
  1370.             return(0x25c4);          /* Left-pointing triangles */
  1371.   case 0x25c6: case 0x25c7: case 0x25c8: /* Diamonds */
  1372.     return(0x2666);
  1373.   /* Circles */
  1374.         case 0x25c9: case 0x25cc: case 0x25cd: case 0x25ce: case 0x25cf:
  1375.         case 0x25d0: case 0x25d1: case 0x25d2: case 0x25d3: case 0x25d4:
  1376.         case 0x25d5: case 0x25e6: case 0x25ef:
  1377.             return(0x25cb);
  1378.   /* Curves and corner triangles */
  1379.   case 0x25dc: case 0x25e4: /* UL */
  1380.     return(0x250c);
  1381.   case 0x25dd: case 0x25e5: /* UR */
  1382.     return(0x2510);
  1383.   case 0x25df: case 0x25e3: /* LL */
  1384.     return(0x2514);
  1385.   case 0x25de: case 0x25e2: /* LR */
  1386.     return(0x2518);
  1387.         default:
  1388.             return(0xfffd);
  1389. }
  1390.     }
  1391.     if (c >= 0x2600 && c <= 0x26ff) { /* Misc symbols */
  1392. switch (c) {
  1393.   /* Themselves */
  1394.         case 0x263a: case 0x263b: case 0x263c: case 0x2640:
  1395.         case 0x2642: case 0x2660: case 0x2663: case 0x2665:
  1396.         case 0x2666: case 0x266a: case 0x266b:
  1397.             return(c);
  1398.         default:
  1399.             return(0xfffd);
  1400. }
  1401.     }
  1402.     if (c >= 0x2794 && c <= 0x27be) /* Right-arrow Dingbats */
  1403.       return(0x2192);
  1404.     if (c >= 0x2070 && c <= 0x209f) { /* Super & subscripts */
  1405. if (c == 0x207f) /* n */
  1406.   return(c);
  1407. else if (c == 0x2070) /* 0 */
  1408.   return(0x0030);
  1409. else if (c >= 0x2074 && c <= 0x2079)
  1410.   return(c - 0x2040);
  1411. else if (c >= 0x2080 && c <= 0x2089)
  1412.   return(c - 0x2050);
  1413. switch (c) {
  1414.         case 0x207a: case 0x208a:
  1415.             return(0x002b);
  1416.         case 0x207b: case 0x208b:
  1417.             return(0x002d);
  1418.         case 0x207c: case 0x208c:
  1419.             return(0x003d);
  1420.         case 0x207d: case 0x208d:
  1421.             return(0x0028);
  1422.         case 0x207e: case 0x208e:
  1423.             return(0x0029);
  1424.         default:
  1425.             return(0xfffd);
  1426. }
  1427.     }
  1428.     if (c >= 0x0180 && c <= 0x024f) { /* Latin Extended B, Part I */
  1429. if (c == 0x0192 || c >= 0x01fa && c <= 0x01ff)
  1430.   return(c); /* Latin Extended B */
  1431. switch (c) {
  1432.         case 0x0180: case 0x0183: case 0x0184: case 0x0185:
  1433.             return(0x0062); /* Lowercase b variants */
  1434.         case 0x0181: case 0x0182:
  1435.             return(0x0042); /* Uppercase B variants */
  1436.         case 0x0186: case 0x0187:
  1437.             return(0x0043); /* Uppercase C variants */
  1438.   case 0x0189: /* D with stroke */
  1439.     return(0x00D0); /* Looks just like Eth */
  1440.   case 0x018a: /* D with hook */
  1441.     return(0x0044);
  1442.   case 0x018e: case 0x0190: /* E-like letters */
  1443.     return(0x0045);
  1444.   case 0x018f: /* e-like letters */
  1445.     return(0x0065);
  1446.   case 0x0191: /* F-like */
  1447.     return(0x0046);
  1448.   case 0x0193: /* G-like */
  1449.     return(0x0047);
  1450.   case 0x0194: /* Latin Capital Gamma */
  1451.     return(0x0393); /* Use Greek */
  1452.   case 0x0195: /* Gothic hv */
  1453.     return(0x0068); /* Use h */
  1454.   case 0x0196: /* Latin Capital Iota */
  1455.     return(0x0399); /* Use Greek */
  1456.   case 0x0197: /* I with bar */
  1457.     return(0x0069);
  1458.   case 0x0198: /* K with hook */
  1459.     return(0x004B);
  1460.   case 0x0199: /* k with hook */
  1461.     return(0x006B);
  1462.   case 0x019A: /* l with bar */
  1463.     return(0x006C);
  1464.   case 0x019B: /* lambda with bar */
  1465.     return(0x03bb); /* Use Greek */
  1466.   case 0x019C: /* Upside down m */
  1467.     return(0x006d);
  1468.   case 0x019D: /* N with left hook */
  1469.     return(0x004e);
  1470.   case 0x019E: /* n with long right leg */
  1471.     return(0x006e);
  1472.   case 0x019F: case 0x01a0: case 0x01a2: /* O-like letters */
  1473.     return(0x004f);
  1474.   case 0x01a1: case 0x01a3: /* o-like */
  1475.     return(0x006f);
  1476.   case 0x01A4: /* P with hook */
  1477.     return(0x0050);
  1478.   case 0x01A5: /* p with hook */
  1479.     return(0x0070);
  1480.   case 0x01A6: /* Old Norse YR */
  1481.     return(0x0052);
  1482.   case 0x01A7: /* Backwards S */
  1483.     return(0x0053);
  1484.   case 0x01A8: case 0x01AA: /* s-like letters */
  1485.     return(0x0073);
  1486.   case 0x01A9: /* Esh */
  1487.     return(0x03a3); /* Looks just like Sigma */
  1488.   case 0x01AB: case 0x01AD: /* t-like */
  1489.     return(0x0074);
  1490.   case 0x01AC: case 0x01AE: /* T-like */
  1491.     return(0x0054);
  1492.   case 0x01AF: case 0x01B1: /* U-like */
  1493.     return(0x0055);
  1494.   case 0x01B0: /* u-like */
  1495.     return(0x0075);
  1496.   case 0x01B2: /* V-like */
  1497.     return(0x0056);
  1498.   case 0x01B3: /* Y-like */
  1499.     return(0x0059);
  1500.   case 0x01B4: /* y-like */
  1501.     return(0x0079);
  1502.   case 0x01B5: /* Z-like */
  1503.     return(0x005a);
  1504.   case 0x01B6: /* z-like */
  1505.     return(0x007a);
  1506.   case 0x01B7: /* Yogh */
  1507.     return(0x0033); /* Use "3" */
  1508.   case 0x01BF: /* Wynn */
  1509.     return(0x0077); /* Use "w" */
  1510.   case 0x01CD: /* A caron */
  1511.     return(0x0041);
  1512.   case 0x01CE: /* a caron */
  1513.     return(0x0061);
  1514.   case 0x01CF: /* I caron */
  1515.     return(0x0049);
  1516.   case 0x01D0: /* i caron */
  1517.     return(0x0069);
  1518.   case 0x01D1: /* O caron */
  1519.     return(0x004f);
  1520.   case 0x01D2: /* o caron */
  1521.     return(0x006f);
  1522.   case 0x01D3: /* U caron */
  1523.     return(0x0055);
  1524.   case 0x01D4: /* u caron */
  1525.     return(0x0075);
  1526.   /* U diaeresis + other things */
  1527.         case 0x01D5: case 0x01D7: case 0x01D9: case 0x01DB:
  1528.             return(0x00dc);
  1529.   /* u diaeresis + other things */
  1530.         case 0x01D6: case 0x01Da: case 0x01Dc:
  1531.             return(0x00fc);
  1532.   /* Fill in more here if anybody asks */
  1533.         default:
  1534.             return(0xfffd);
  1535. }
  1536.     }
  1537.     if (c >= 0x1e00 && c <= 0x1eff) { /* Latin Extended Additional */
  1538. if (c >= 0x1e80 && c <= 0x1e85)
  1539.   return(c);
  1540. else
  1541.   return(0xfffd);
  1542.     }
  1543.     if (c >= 0x0400 && c <= 0x04ff) { /* Cyrillic */
  1544. if (c >= 0x0400 && c <= 0x045f || c == 0x0490  || c == 0x0491)
  1545.   return(c);
  1546. else
  1547.   return(0xfffd);
  1548.     }
  1549.     if (c >= 0x0370 && c <= 0x03ff) { /* Greek */
  1550. if (c == 0x037e || c >= 0x0384 && c <= 0x03ce)
  1551.   return(c);
  1552. switch (c) {
  1553.         case 0x0374: case 0x0375:
  1554.             return(0x0027);
  1555.         case 0x037a:
  1556.             return(0x002c);
  1557.   /* Fill in more here if needed */
  1558.         default:
  1559.             return(0xfffd);
  1560. }
  1561.     }
  1562.     if (c >= 0x1f00 && c <= 0x1fff) { /* Greek Extended */
  1563. /* Fill in if asked */
  1564. return(0xfffd);
  1565.     }
  1566.     if (c >= 0x20a0 && c <= 0x20cf) { /* Currency symbols */
  1567. if (c == 0x20a3 || c == 0x20a4 || c == 0x20a7 || c == 0x20ac)
  1568.   return(c);
  1569. else
  1570.   return(0xfffd);
  1571.     }
  1572.     if (c >= 0x2100 && c <= 0x214f) { /* Letterlike symbols */
  1573. if (c == 0x2116 || c == 0x2122 || c == 0x2126)
  1574.   return(c);
  1575. else
  1576.   return(0xfffd);
  1577.     }
  1578.     if (c >= 0x2150 && c <= 0x218f) { /* Number forms */
  1579. if (c >= 0x215b && c <= 0x215e) /* Roman numerals etc */
  1580.   return(c);
  1581. else
  1582.   return(0xfffd);
  1583.     }
  1584.     if (c >= 0x02b0 && c <= 0x02ff) { /* Spacing modifier letters */
  1585. if (c == 0x02c6 || c == 0x02c7 || c == 0x02c9 ||
  1586.     c >= 0x02d8 && c <= 0x02dd)
  1587.   return(c);
  1588. switch (c) {
  1589.         case 0x02b0: case 0x02b1:
  1590.             return(0x0068);
  1591.         case 0x02b2:
  1592.               return(0x006a);
  1593.         case 0x02b3: case 0x02b4: case 0x02b5:
  1594.             return(0x0072);
  1595.         case 0x02b7:
  1596.             return(0x0077);
  1597.         case 0x02b8:
  1598.             return(0x0079);
  1599.         case 0x02b9:
  1600.             return(0x00b4);
  1601.         case 0x02ba:
  1602.             return(0x0022);
  1603.         case 0x02bb: case 0x02bc: case 0x02bd: case 0x02be: case 0x02bf:
  1604.             return(0x0027);
  1605.   case 0x02c2:      return(0x003c);
  1606.   case 0x02c3:      return(0x003e);
  1607.   case 0x02da:      return(0x00b0);
  1608.   case 0x02dc:      return(0x007e);
  1609.   default:      return(0xfffd);
  1610. }
  1611.     }
  1612.     if (c >= 0x2000 && c <= 0x206f) { /* General Punctuation */
  1613. if (c >= 0x2013 && c <= 0x2015 ||
  1614.     c >= 0x2017 && c <= 0x201a ||
  1615.     c >= 0x201c && c <= 0x201e ||
  1616.     c >= 0x2020 && c <= 0x2022 || c == 0x2026 || c == 0x2030 ||
  1617.     c >= 0x2039 && c <= 0x203a || c == 0x203c || c == 0x203e ||
  1618.     c == 0x2044)
  1619.   return(c);
  1620. else if (c == 0x2016)
  1621.   return(0x2551);
  1622. else if (c == 0x2017)
  1623.   return(0x2550);
  1624. else if (c == 0x2044)
  1625.   return(0x002f);
  1626. else
  1627.   return(0xfffd);
  1628.     }
  1629.     if (c == 0xfb01 || c == 0xfb02) /* Alphabetic Presentation Forms */
  1630.       return(c);
  1631.     return(0xfffd); /* Catch-all */
  1632. }
  1633. #endif /* OS2 */
  1634. /*
  1635.   Table of Blah-to-Unicode information structures.
  1636.   KEEP THIS IN SYNC WITH THE TX_blah DEFINITIONS in ckcuni.h.
  1637. */
  1638. struct x_to_unicode *
  1639. txrinfo[MAXTXSETS+1] = {
  1640.     &u_ascii, /*  0 US ISO 646 (ASCII) */
  1641.     &u_british, /*  1 UK ISO 646 */
  1642.     &u_fr_canadian, /*  2 Canadian French NRC */
  1643.     NULL, /*  3 Cuba */
  1644.     NULL, /*  4 Czecho */
  1645.     &u_danish, /*  5 Danish/Norwegian ISO 646 */
  1646.     &u_dutch, /*  6 Dutch NRC */
  1647.     &u_finnish, /*  7 Finnish NRC  */
  1648.     &u_french, /*  8 French ISO 646 */
  1649.     &u_german, /*  9 German ISO 646 */
  1650.     &u_hebrew7, /* 10 Hebrew-7 (DEC) */
  1651.     &u_hungarian, /* 11 Hungarian ISO 646 */
  1652.     &u_icelandic, /* 12 Icelandic NRC */
  1653.     &u_italian, /* 13 Italian ISO 646 */
  1654.     &u_jis0201r, /* 14 Japanese Roman ISO 646 */
  1655.     &u_jis0201k, /* 15 Japanese Katakana */
  1656.     &u_koi7, /* 16 Short KOI */
  1657.     &u_danish, /* 17 Norwegian/Danish ISO 646 */
  1658.     &u_portuguese, /* 18 Portuguese ISO 646 */
  1659.     &u_spanish, /* 19 spanish ISO 646 */
  1660.     &u_swedish, /* 20 Swedish ISO 646 */
  1661.     NULL, /* 21 Swedish ISO 646 for names */
  1662.     &u_swiss, /* 22 Swiss NRC   */
  1663.     &u_8859_1, /* 23 ISO 8859-1  */
  1664.     &u_8859_2, /* 24 ISO 8859-2  */
  1665.     &u_8859_3, /* 25 ISO 8859-3  */
  1666.     &u_8859_4, /* 26 ISO 8859-4  */
  1667.     &u_8859_5, /* 27 ISO 8859-5  */ /* Cyrillic */
  1668.     &u_8859_6, /* 28 ISO 8859-6  */ /* Arabic */
  1669.     &u_8859_7, /* 29 ISO 8859-7  */ /* Greek */
  1670.     &u_8859_8, /* 30 ISO 8859-8  */ /* Hebrew */
  1671.     &u_8859_9, /* 31 ISO 8859-9  */
  1672.     &u_8859_10, /* 32 ISO 8859-10 */
  1673.     &u_koi8, /* 33 KOI-8       */
  1674.     NULL, /* 34 JIS-7       */
  1675.     NULL, /* 35 Shift JIS   */
  1676.     NULL, /* 36 Japanese EUC (JAE) */
  1677.     NULL, /* 37 Japanese DEC Kanji */
  1678.     &u_decmcs, /* 38 DEC MCS */
  1679.     &u_nextstep, /* 39 NeXT    */
  1680.     &u_dgi, /* 40 DGI     */
  1681.     &u_maclatin, /* 41 Macintosh Latin  */
  1682.     &u_hproman8, /* 42 HP Roman 8       */
  1683.     &u_cp437, /* 43 CP437 - Original */
  1684.     &u_cp850, /* 44 CP850 - W Europe */
  1685.     &u_cp852, /* 45 CP852 - E Europe */
  1686.     &u_cp857, /* 46 CP857 - Turkish  */
  1687.     &u_cp862, /* 47 CP862 - Hebrew   */
  1688.     &u_cp864, /* 48 CP864 - Arabic   */
  1689.     &u_cp866, /* 49 CP866 - Cyrillic */
  1690.     &u_cp869, /* 50 CP869 - Greek    */
  1691.     &u_decspec, /* 51 DEC Special Graphics */
  1692.     &u_dectech, /* 52 DEC Technical */
  1693.     &u_c0pics,                          /* 53 C0 Pictures */
  1694.     &u_c1pics,                          /* 54 C1 Pictures */
  1695.     &u_smiley,                          /* 55 IBM C0 Graphics */
  1696.     &u_heath19g, /* 56 Heath 19 Graphics */
  1697.     &u_tvig, /* 57 TVI Graphics */
  1698.     &u_wyse_gn, /* 58 Wyse 60 Graphics Normal */
  1699.     &u_wyse_g1, /* 59 Wyse 60 Graphics 1 */
  1700.     &u_wyse_g2, /* 60 Wyse 60 Graphics 2 */
  1701.     &u_wyse_g3, /* 61 Wyse 60 Graphics 3 */
  1702.     &u_elot927, /* 62 Greek ELOT 927 */
  1703.     &u_dgspec, /* 63 DG Special graphics */
  1704.     &u_dgline, /* 64 DG Line drawing */
  1705.     &u_dgword, /* 65 DG Word processing */
  1706.     &u_hpline, /* 66 HP Line drawing */
  1707.     &u_hpmath, /* 67 HP Math/Technical */
  1708.     &u_qnxgrph, /* 68 QNX Graphics */
  1709.     &u_snibrack, /* 69 SNI Brackets */
  1710.     &u_snieuro, /* 70 SNI Euro */
  1711.     &u_snifacet, /* 71 SNI Facet */
  1712.     &u_sniibm, /* 72 SNI IBM */
  1713.     &u_sniblanks,                       /* 73 SNI Blanks */
  1714.     &u_cp1252, /* 74 Windows Latin-1 */
  1715.     &u_cp1250, /* 75 Windows Latin-2 */
  1716.     &u_cp1251, /* 76 Windows Cyrillic */
  1717.     &u_cp1253, /* 77 Windows Greek */
  1718.     &u_cp1254, /* 78 Windows Turkish */
  1719.     &u_cp1257, /* 79 Windows Latin-4 */
  1720.     &u_cp856, /* 80 Cyrillic PC Code Page 856 */
  1721.     &u_cp855,         /* 81 Cyrillic PC Code Page 855 */
  1722.     &u_8859_1,                          /* 82 CP819 - Same as 8859-1 */
  1723.     &u_8859_2,                          /* 83 CP912 - Same as 8859-2 */
  1724.     &u_8859_3,                          /* 84 CP913 - Same as 8859-3 */
  1725.     &u_8859_4,                          /* 85 CP914 - Same as 8859-4 */
  1726.     &u_8859_5,                          /* 86 CP915 - Same as 8859-5 */
  1727.     &u_8859_6,                          /* 87 CP1089 - Same as 8859-6 */
  1728.     &u_8859_7,                          /* 88 CP813 - Same as 8859-7 */
  1729.     &u_8859_8,                          /* 89 CP916 - Same as 8859-8 */
  1730.     &u_8859_9,                          /* 90 CP920 - Same as 8859-9 */
  1731.     &u_hproman8,                        /* 91 CP1051 - Same as HP Roman 8 */
  1732.     &u_cp858, /* 92 CP858 - W Europe w/Euro */
  1733.     &u_8859_15,                         /* 93 ISO 8859-15 Latin-15 */
  1734.     &u_8859_15,                         /* 94 CP923 - Same as 8859-15  */
  1735.     &u_8859_7,                          /* 95 ELOT928 - Same as 8859-7 */
  1736.     &u_quickdraw,                       /* 96 CP10000 - Apple Quickdraw */
  1737.     &u_cp37,                            /* 97 CP37 - U.S. EBCDIC */
  1738.     &u_cp1255,                          /* 98 CP1255 - Windows Hebrew */
  1739.     &u_cp1256,                          /* 99 CP1256 - Windows Arabic */
  1740.     &u_cp1258,                          /* 100 CP1258 - Windows Viet Nam */
  1741.     &u_mazovia, /* 101 Mazovia Polish code page */
  1742.     &u_transparent,                     /* 102 Transparent */
  1743.     &u_hz1500, /* 103 Hazeltine 1500/1520 graphics */
  1744.     &u_koi8r, /* 104 KOI8-R */
  1745.     &u_koi8u /* 105 KOI8-U */
  1746. };
  1747. /*
  1748.   Table of Blah-to-Unicode translation functions.
  1749.   KEEP THIS IN SYNC WITH THE TX_blah DEFINITITIONS in ckcuni.h.
  1750. */
  1751. USHORT
  1752. #ifdef CK_ANSIC
  1753. (*xl_u[MAXTXSETS+1])(CHAR)
  1754. #else
  1755. (*xl_u[MAXTXSETS+1])()
  1756. #endif /* CK_ANSIC */
  1757. = {
  1758.     ascii_u, /*  0 US ISO 646 (ASCII) */
  1759.     british_u, /*  1 UK ISO 646 */
  1760.     fr_canadian_u, /*  2 Canadian French NRC */
  1761.     NULL, /*  3 Cuba */
  1762.     NULL, /*  4 Czecho */
  1763.     danish_u, /*  5 Danish/Norwegian ISO 646 */
  1764.     dutch_u, /*  6 Dutch NRC */
  1765.     finnish_u, /*  7 Finnish NRC  */
  1766.     french_u, /*  8 French ISO 646 */
  1767.     german_u, /*  9 German ISO 646 */
  1768.     hebrew7_u, /* 10 Hebrew-7 (DEC) */
  1769.     hungarian_u, /* 11 Hungarian ISO 646 */
  1770.     icelandic_u, /* 12 Icelandic */
  1771.     italian_u, /* 13 Italian ISO 646 */
  1772.     jis0201r_u, /* 14 Japanese Roman ISO 646 */
  1773.     jis0201k_u, /* 15 Japanese Katakana */
  1774.     koi7_u, /* 16 Short KOI */
  1775.     danish_u, /* 17 Norwegian/Danish ISO 646 */
  1776.     portuguese_u, /* 18 Portuguese ISO 646 */
  1777.     spanish_u, /* 19 spanish ISO 646 */
  1778.     swedish_u, /* 20 Swedish ISO 646 */
  1779.     NULL, /* 21 Swedish ISO 646 for names */
  1780.     swiss_u, /* 22 Swiss NRC   */
  1781.     iso_8859_1_u, /* 23 ISO 8859-1  */
  1782.     iso_8859_2_u, /* 24 ISO 8859-2  */
  1783.     iso_8859_3_u, /* 25 ISO 8859-3  */
  1784.     iso_8859_4_u, /* 26 ISO 8859-4  */
  1785.     iso_8859_5_u, /* 27 ISO 8859-5  */ /* Cyrillic */
  1786.     iso_8859_6_u, /* 28 ISO 8859-6  */ /* Arabic */
  1787.     iso_8859_7_u, /* 29 ISO 8859-7  */ /* Greek */
  1788.     iso_8859_8_u, /* 30 ISO 8859-8  */ /* Hebrew */
  1789.     iso_8859_9_u, /* 31 ISO 8859-9  */ /* Latin-5 */
  1790.     iso_8859_10_u, /* 32 ISO 8859-10 */
  1791.     koi8_u, /* 33 KOI-8       */
  1792.     NULL, /* 34 JIS-7       */
  1793.     NULL, /* 35 Shift JIS   */
  1794.     NULL, /* 36 Japanese EUC (JAE) */
  1795.     NULL, /* 37 Japanese DEC Kanji */
  1796.     decmcs_u, /* 38 DEC MCS */
  1797.     nextstep_u, /* 39 NeXT    */
  1798.     dgi_u, /* 40 DGI     */
  1799.     maclatin_u, /* 41 Macintosh Latin  */
  1800.     hproman8_u, /* 42 HP Roman 8       */
  1801.     cp437_u, /* 43 CP437 - Original */
  1802.     cp850_u, /* 44 CP850 - W Europe */
  1803.     cp852_u, /* 45 CP852 - E Europe */
  1804.     cp857_u, /* 46 CP857 - Turkish  */
  1805.     cp862_u, /* 47 CP862 - Hebrew   */
  1806.     cp864_u, /* 48 CP864 - Arabic   */
  1807.     cp866_u, /* 49 CP866 - Cyrillic */
  1808.     cp869_u, /* 50 CP869 - Greek    */
  1809.     decspec_u, /* 51 DEC Special Graphics */
  1810.     dectech_u, /* 52 DEC Technical */
  1811.     c0pics_u, /* 53 C0 Pictures */
  1812.     c1pics_u, /* 54 C1 Pictures */
  1813.     smiley_u, /* 55 IBM C0 Graphics */
  1814.     heath19g_u, /* 56 Heath 19 graphics */
  1815.     tvig_u, /* 57 TVI graphics */
  1816.     wyse_gn_u, /* 58 Wyse 60 normal-mode graphics */
  1817.     wyse_g1_u, /* 59 Wyse 60 graphics 1 */
  1818.     wyse_g2_u, /* 60 Wyse 60 graphics 2 */
  1819.     wyse_g3_u, /* 61 Wyse 60 graphics 3 */
  1820.     elot927_u, /* 62 Greek ELOT 927 */
  1821.     dgspec_u, /* 63 DG Special graphics */
  1822.     dgline_u, /* 64 DG Line drawing */
  1823.     dgword_u, /* 65 DG Word processing */
  1824.     hpline_u, /* 66 HP Line drawing */
  1825.     hpmath_u, /* 67 HP Math/Technical */
  1826.     qnxgrph_u, /* 68 QNX Graphics */
  1827.     snibrack_u, /* 69 SNI Brackets */
  1828.     snieuro_u, /* 70 SNI Euro */
  1829.     snifacet_u, /* 71 SNI Facet */
  1830.     sniibm_u, /* 72 SNI IBM */
  1831.     sniblanks_u,                        /* 73 SNI Blanks */
  1832.     cp1252_u, /* 74 Windows Latin-1 */
  1833.     cp1250_u, /* 75 Windows Latin-2 */
  1834.     cp1251_u, /* 76 Windows Cyrillic */
  1835.     cp1253_u, /* 77 Windows Greek */
  1836.     cp1254_u, /* 78 Windows Turkish */
  1837.     cp1257_u, /* 79 Windows Latin-4 */
  1838.     cp856_u, /* 80 Cyrillic PC Code Page 856 */
  1839.     cp855_u,          /* 81 Cyrillic PC Code Page 856 */
  1840.     iso_8859_1_u,                       /* 82 CP819 - Same as 8859-1 */
  1841.     iso_8859_2_u,                       /* 83 CP912 - Same as 8859-2 */
  1842.     iso_8859_3_u,                       /* 84 CP913 - Same as 8859-3 */
  1843.     iso_8859_4_u,                       /* 85 CP914 - Same as 8859-4 */
  1844.     iso_8859_5_u,                       /* 86 CP915 - Same as 8859-5 */
  1845.     iso_8859_6_u,                       /* 87 CP1089 - Same as 8859-6 */
  1846.     iso_8859_7_u,                       /* 88 CP813 - Same as 8859-7 */
  1847.     iso_8859_8_u,                       /* 89 CP916 - Same as 8859-8 */
  1848.     iso_8859_9_u,                       /* 90 CP920 - Same as 8859-9 */
  1849.     hproman8_u,         /* 91 CP1051 -Same as HP Roman 8 */
  1850.     cp858_u, /* 92 CP858 - W Europe w/Euro */
  1851.     iso_8859_15_u,                      /* 93 ISO 8859-15 Latin 15 */
  1852.     iso_8859_15_u,                      /* 94 CP923 - Same as 8859-15 */
  1853.     iso_8859_7_u,                       /* 95 ELOT928 - Same as 8859-7 */
  1854.     quickdraw_u,                        /* 96 CP10000 - Apple Quickdraw */
  1855.     cp37_u,                             /* 97 CP37 - U.S. EBCDIC */
  1856.     cp1255_u,                           /* 98 CP1255 - Windows Hebrew */
  1857.     cp1256_u,                           /* 99 CP1256 - Windows Arabic */
  1858.     cp1258_u,                           /* 100 CP1258 - Windows Viet Nam */
  1859.     mazovia_u, /* 101 Mazovia PC code page */
  1860.     ident_u,     /* 102 Transparent - no translation  */
  1861.     hz1500_u, /* 103 Hazeltine 1500/1520 graphics */
  1862.     koi8r_u, /* 104 KOI8-R */
  1863.     koi8u_u /* 105 KOI8-U */
  1864. };
  1865. /*
  1866.   Table of Unicode-to-Blah translation functions.
  1867.   KEEP THIS IN SYNC WITH THE TX_blah DEFINITITIONS in ckcuni.h, and also
  1868.   with the tables above.
  1869. */
  1870. int
  1871. #ifdef CK_ANSIC
  1872. (*xl_tx[MAXTXSETS+1])(USHORT)
  1873. #else
  1874. (*xl_tx[MAXTXSETS+1])()
  1875. #endif /* CK_ANSIC */
  1876.  = {
  1877.     tx_usascii, /*  0 US ISO 646 (ASCII) */
  1878.     tx_british, /*  1 UK ISO 646 */
  1879.     tx_fr_canadian, /*  2 Canadian French NRC */
  1880.     NULL, /*  3 Cuba */
  1881.     NULL, /*  4 Czecho */
  1882.     tx_danish, /*  5 Danish/Norwegian ISO 646 */
  1883.     tx_dutch, /*  6 Dutch NRC */
  1884.     tx_finnish, /*  7 Finnish NRC  */
  1885.     tx_french, /*  8 French ISO 646 */
  1886.     tx_german, /*  9 German ISO 646 */
  1887.     tx_hebrew7, /* 10 Hebrew-7 (DEC) */
  1888.     tx_hungarian, /* 11 Hungarian ISO 646 */
  1889.     tx_icelandic, /* 12 Icelandic */
  1890.     tx_italian, /* 13 Italian ISO 646 */
  1891.     tx_jis0201r, /* 14 Japanese Roman ISO 646 */
  1892.     tx_jis0201k, /* 15 Japanese Katakana */
  1893.     tx_koi7, /* 16 Short KOI */
  1894.     tx_danish, /* 17 Norwegian/Danish ISO 646 */
  1895.     tx_portuguese, /* 18 Portuguese ISO 646 */
  1896.     tx_spanish, /* 19 spanish ISO 646 */
  1897.     tx_swedish, /* 20 Swedish ISO 646 */
  1898.     NULL, /* 21 Swedish ISO 646 for names */
  1899.     tx_swiss, /* 22 Swiss NRC   */
  1900.     tx_ident, /* 23 ISO 8859-1  */
  1901.     tx_8859_2, /* 24 ISO 8859-2  */
  1902.     tx_8859_3, /* 25 ISO 8859-3  */
  1903.     tx_8859_4, /* 26 ISO 8859-4  */
  1904.     tx_8859_5, /* 27 ISO 8859-5  */ /* Cyrillic */
  1905.     tx_8859_6, /* 28 ISO 8859-6  */ /* Arabic */
  1906.     tx_8859_7, /* 29 ISO 8859-7  */ /* Greek */
  1907.     tx_8859_8, /* 30 ISO 8859-8  */ /* Hebrew */
  1908.     tx_8859_9, /* 31 ISO 8859-9  */ /* Latin-5 */
  1909.     tx_8859_10, /* 32 ISO 8859-10 */ /* Latin-6 */
  1910.     tx_koi8, /* 33 KOI-8       */
  1911.     NULL, /* 34 JIS-7       */
  1912.     NULL, /* 35 Shift JIS   */
  1913.     NULL, /* 36 Japanese EUC (JAE) */
  1914.     NULL, /* 37 Japanese DEC Kanji */
  1915.     tx_decmcs, /* 38 DEC MCS */
  1916.     tx_nextstep, /* 39 NeXT    */
  1917.     tx_dgi, /* 40 DGI     */
  1918.     tx_maclatin, /* 41 Macintosh Latin  */
  1919.     tx_hproman8, /* 42 HP Roman 8       */
  1920.     tx_cp437, /* 43 CP437 - Original */
  1921.     tx_cp850, /* 44 CP850 - W Europe */
  1922.     tx_cp852, /* 45 CP852 - E Europe */
  1923.     tx_cp857, /* 46 CP857 - Turkish  */
  1924.     tx_cp862, /* 47 CP862 - Hebrew   */
  1925.     tx_cp866, /* 48 CP864 - Arabic   */
  1926.     tx_cp866, /* 49 CP866 - Cyrillic */
  1927.     tx_cp869, /* 50 CP869 - Greek    */
  1928.     NULL, /* Display only */ /* 51 DEC Special Graphics */
  1929.     NULL, /* Display only */ /* 52 DEC Technical */
  1930.     NULL,       /* Display only */      /* 53 C0 Pictures */
  1931.     NULL,       /* Display only */      /* 54 C1 Pictures */
  1932.     NULL,       /* Display only */      /* 55 IBM C0 Graphics */
  1933.     NULL,       /* Display only */      /* 56 Heath 19 graphics */
  1934.     NULL,       /* Display only */      /* 57 TVI graphics */
  1935.     NULL,       /* Display only */      /* 58 Wyse 60 normal-mode graphics */
  1936.     NULL,       /* Display only */      /* 59 Wyse 60 graphics 1 */
  1937.     NULL,       /* Display only */      /* 60 Wyse 60 graphics 2 */
  1938.     NULL,       /* Display only */      /* 61 Wyse 60 graphics 3 */
  1939.     tx_elot927, /* 62 Greek ELOT 927 */
  1940.     NULL,       /* Display only */      /* 63 DG special graphics */
  1941.     NULL,       /* Display only */      /* 64 DG line-drawing */
  1942.     NULL,       /* Display only */      /* 65 DG word-processing */
  1943.     NULL,       /* Display only */      /* 66 HP line-drawing */
  1944.     NULL,       /* Display only */      /* 67 HP math/techical */
  1945.     NULL,       /* Display only */      /* 68 QNX Graphics */
  1946.     NULL,       /* Display only */      /* 69 SNI Brackets */
  1947.     NULL,       /* Display only */      /* 70 SNI Euro */
  1948.     NULL,       /* Display only */      /* 71 SNI Facet */
  1949.     NULL,       /* Display only */      /* 72 SNI IBM */
  1950.     NULL,       /* Display only */      /* 73 SNI Blanks */
  1951.     tx_cp1252, /* 74 Windows Latin-1 */
  1952.     tx_cp1250, /* 75 Windows Latin-2 */
  1953.     tx_cp1251, /* 76 Windows Cyrillic */
  1954.     tx_cp1253, /* 77 Windows Greek */
  1955.     tx_cp1254, /* 78 Windows Turkish */
  1956.     tx_cp1257, /* 79 Windows Latin-4 */
  1957.     tx_cp856, /* 80 Cyrillic PC Code Page 856 */
  1958.     tx_cp855, /* 81 Cyrillic PC Code Page 855 */
  1959.     tx_ident,                           /* 82 CP819 - Same as 8859-1 */
  1960.     tx_8859_2,                          /* 83 CP912 - Same as 8859-2 */
  1961.     tx_8859_3,                          /* 84 CP913 - Same as 8859-3 */
  1962.     tx_8859_4,                          /* 85 CP914 - Same as 8859-4 */
  1963.     tx_8859_5,                          /* 86 CP915 - Same as 8859-5 */
  1964.     tx_8859_6,                          /* 87 CP1089 - Same as 8859-6 */
  1965.     tx_8859_7,                          /* 88 CP813 - Same as 8859-7 */
  1966.     tx_8859_8,                          /* 89 CP916 - Same as 8859-8 */
  1967.     tx_8859_9,                          /* 90 CP920 - Same as 8859-9 */
  1968.     tx_hproman8, /* 91 CP1051 -Same as HP Roman 8 */
  1969.     tx_cp858, /* 92 CP858 - W Europe w/Euro */
  1970.     tx_8859_15,                         /* 93 ISO 8859-15 Latin 15 */
  1971.     tx_8859_15,                         /* 94 CP923 - Same as Latin 15 */
  1972.     tx_8859_7,                          /* 95 ELOT928 - Same as 8859-7 */
  1973.     tx_quickdraw,                       /* 96 CP10000 - Apple Quickdraw */
  1974.     tx_cp37,                            /* 97 CP37 - U.S. EBCDIC */
  1975.     tx_cp1255,                          /* 98 CP1255 - Windows Hebrew */
  1976.     tx_cp1256,                          /* 99 CP1256 - Windows Arabic */
  1977.     tx_cp1258,                          /* 100 CP1258 - Windows Viet Nam */
  1978.     tx_mazovia, /* 101 Mazovia  PC code page */
  1979.     tx_ident,                           /* 102 Transparent - no translation */
  1980.     NULL, /* Display only */ /* 103 Hazeltine 1500/1520 graphics */
  1981.     tx_koi8r, /* 104 KOI8-R */
  1982.     tx_koi8u /* 105 KOI8-U */
  1983. };
  1984. /*
  1985.   Table of FCS-to-Unicode translation functions.
  1986.   KEEP THIS IN SYNC WITH THE FC_blah DEFINITITIONS in ckuxla.h.
  1987. */
  1988. USHORT
  1989. #ifdef CK_ANSIC
  1990. (*xl_fcu[MAXFCSETS+1])(CHAR)
  1991. #else
  1992. (*xl_fcu[MAXFCSETS+1])()
  1993. #endif /* CK_ANSIC */
  1994. = {
  1995.     ascii_u, /*  0 US ISO 646 (ASCII) */
  1996.     british_u, /*  1 UK ISO 646 */
  1997.     dutch_u, /*  2 Dutch NRC */
  1998.     finnish_u, /*  3 Finnish NRC  */
  1999.     french_u, /*  4 French ISO 646 */
  2000.     fr_canadian_u, /*  5 Canadian French NRC */
  2001.     german_u, /*  6 German ISO 646 */
  2002.     hungarian_u, /*  7 Hungarian ISO 646 */
  2003.     italian_u, /*  8 Italian ISO 646 */
  2004.     danish_u, /*  9 Danish/Norwegian ISO 646 */
  2005.     portuguese_u, /* 10 Portuguese ISO 646 */
  2006.     spanish_u, /* 11 spanish ISO 646 */
  2007.     swedish_u, /* 12 Swedish ISO 646 */
  2008.     swiss_u, /* 13 Swiss NRC   */
  2009.     iso_8859_1_u, /* 14 ISO 8859-1 Latin-1 */
  2010.     iso_8859_2_u, /* 15 ISO 8859-2 Latin-2 */
  2011.     decmcs_u, /* 16 DEC MCS */
  2012.     nextstep_u, /* 17 NeXT */
  2013.     cp437_u, /* 18 CP437 - Original */
  2014.     cp850_u, /* 19 CP850 - W Europe */
  2015.     cp852_u, /* 20 CP852 - E Europe */
  2016.     quickdraw_u,                        /* 21 CP10000 - Apple Quickdraw */
  2017.     dgi_u, /* 22 DGI */
  2018.     hproman8_u, /* 23 HP Roman 8 */
  2019.     iso_8859_5_u, /* 24 ISO 8859-5 Cyrillic */
  2020.     cp866_u, /* 25 CP866 - Cyrillic */
  2021.     koi7_u, /* 26 Short KOI */
  2022.     koi8_u, /* 27 KOI-8       */
  2023.     NULL, /* 28 JIS-7 */
  2024.     NULL, /* 29 Shift-JIS */
  2025.     NULL, /* 30 Japanese EUC */
  2026.     NULL, /* 31 DEC Kanji */
  2027.     hebrew7_u, /* 32 Hebrew-7 (DEC) */
  2028.     iso_8859_8_u, /* 33 ISO 8859-8 Hebrew */
  2029.     cp862_u, /* 34 CP862 Hebrew */
  2030.     elot927_u, /* 35 Greek ELOT 927 */
  2031.     iso_8859_7_u, /* 36 ISO 8859-7 Greek */
  2032.     cp869_u, /* 37 CP869 Greek */
  2033.     iso_8859_15_u,                      /* 38 ISO 8859-15 Latin-9 */
  2034.     cp858_u, /* 39 CP858 - W Europe w/Euro */
  2035.     cp855_u,          /* 40 Cyrillic PC Code Page 856 */
  2036.     cp1251_u, /* 41 Windows Cyrillic */
  2037.     cp856_u, /* 42 Bulgarian PC Code Page 856 */
  2038.     cp1250_u, /* 43 Windows Latin-2 */
  2039.     mazovia_u, /* 44 Mazovia PC code page */
  2040.     NULL, /* 45 UCS-2 */
  2041.     NULL, /* 46 UTF-8 */
  2042.     koi8r_u, /* 47 KOI8-R */
  2043.     koi8u_u /* 48 KOI8-U */
  2044. };
  2045. /*
  2046.   Table of Unicode-to-FCS translation functions.
  2047.   KEEP THIS IN SYNC WITH THE FC_blah DEFINITITIONS in ckuxla.h.
  2048. */
  2049. int
  2050. #ifdef CK_ANSIC
  2051. (*xl_ufc[MAXFCSETS+1])(USHORT)
  2052. #else
  2053. (*xl_ufc[MAXFCSETS+1])()
  2054. #endif /* CK_ANSIC */
  2055. = {
  2056.     tx_usascii, /*  0 US ISO 646 (ASCII) */
  2057.     tx_british, /*  1 UK ISO 646 */
  2058.     tx_dutch, /*  2 Dutch NRC */
  2059.     tx_finnish, /*  3 Finnish NRC  */
  2060.     tx_french, /*  4 French ISO 646 */
  2061.     tx_fr_canadian, /*  5 Canadian French NRC */
  2062.     tx_german, /*  6 German ISO 646 */
  2063.     tx_hungarian, /*  7 Hungarian ISO 646 */
  2064.     tx_italian, /*  8 Italian ISO 646 */
  2065.     tx_danish, /*  9 Danish/Norwegian ISO 646 */
  2066.     tx_portuguese, /* 10 Portuguese ISO 646 */
  2067.     tx_spanish, /* 11 spanish ISO 646 */
  2068.     tx_swedish, /* 12 Swedish ISO 646 */
  2069.     tx_swiss, /* 13 Swiss NRC   */
  2070.     tx_ident, /* 14 ISO 8859-1 Latin-1 */
  2071.     tx_8859_2, /* 15 ISO 8859-2 Latin-2 */
  2072.     tx_decmcs, /* 16 DEC MCS */
  2073.     tx_nextstep, /* 17 NeXT */
  2074.     tx_cp437, /* 18 CP437 - Original */
  2075.     tx_cp850, /* 19 CP850 - W Europe */
  2076.     tx_cp852, /* 20 CP852 - E Europe */
  2077.     tx_quickdraw, /* 21 CP10000 - Apple Quickdraw */
  2078.     tx_dgi, /* 22 DGI */
  2079.     tx_hproman8, /* 23 HP Roman 8 */
  2080.     tx_8859_5, /* 24 ISO 8859-5 Cyrillic */
  2081.     tx_cp866, /* 25 CP866 - Cyrillic */
  2082.     tx_koi7, /* 26 Short KOI */
  2083.     tx_koi8, /* 27 KOI-8       */
  2084.     NULL, /* 28 JIS-7 */
  2085.     NULL, /* 29 Shift-JIS */
  2086.     NULL, /* 30 Japanese EUC */
  2087.     NULL, /* 31 DEC Kanji */
  2088.     tx_hebrew7, /* 32 Hebrew-7 (DEC) */
  2089.     tx_8859_8, /* 33 ISO 8859-8 Hebrew */
  2090.     tx_cp862, /* 34 CP862 Hebrew */
  2091.     tx_elot927, /* 35 Greek ELOT 927 */
  2092.     tx_8859_7, /* 36 ISO 8859-7 Greek */
  2093.     tx_cp869, /* 37 CP869 Greek */
  2094.     tx_8859_15, /* 38 ISO 8859-15 Latin-9 */
  2095.     tx_cp858, /* 39 CP858 - W Europe w/Euro */
  2096.     tx_cp855,          /* 40 Cyrillic PC Code Page 856 */
  2097.     tx_cp1251, /* 41 Windows Cyrillic */
  2098.     tx_cp856, /* 42 Bulgarian PC Code Page 856 */
  2099.     tx_cp1250, /* 43 Windows Latin-2 */
  2100.     tx_mazovia, /* 44 Mazovia PC code page */
  2101.     NULL, /* 45 UCS-2 */
  2102.     NULL, /* 46 UTF-8 */
  2103.     tx_koi8r, /* 47 KOI8-R */
  2104.     tx_koi8u /* 48 KOI8-U */
  2105. };
  2106. /*
  2107.   Table of TCS-to-Unicode translation functions.
  2108.   KEEP THIS IN SYNC WITH THE TC_blah DEFINITIONS in ckuxla.h.
  2109. */
  2110. USHORT
  2111. #ifdef CK_ANSIC
  2112. (*xl_tcu[MAXTCSETS+1])(CHAR)
  2113. #else
  2114. (*xl_tcu[MAXTCSETS+1])()
  2115. #endif /* CK_ANSIC */
  2116. = {
  2117.     NULL, /*  0 = Transparent */
  2118.     ascii_u, /*  1 = ASCII */
  2119.     iso_8859_1_u, /*  2 ISO 8859-1 Latin-1 */
  2120.     iso_8859_2_u, /*  3 ISO 8859-2 Latin-2 */
  2121.     iso_8859_5_u, /*  4 ISO 8859-5 Cyrillic */
  2122.     NULL, /*  5 Japanese EUC */
  2123.     iso_8859_8_u, /*  6 ISO 8859-8 Hebrew */
  2124.     iso_8859_7_u, /*  7 ISO 8859-7 Greek */
  2125.     iso_8859_15_u,                      /*  8 ISO 8859-15 Latin-9 */
  2126.     NULL, /*  9 UCS-2 */
  2127.     NULL /* 10 UTF-8 */
  2128. };
  2129. /*
  2130.   Table of Unicode-to-TCS translation functions.
  2131.   KEEP THIS IN SYNC WITH THE TC_blah DEFINITIONS in ckuxla.h.
  2132. */
  2133. int
  2134. #ifdef CK_ANSIC
  2135. (*xl_utc[MAXTCSETS+1])(USHORT)
  2136. #else
  2137. (*xl_utc[MAXTCSETS+1])()
  2138. #endif /* CK_ANSIC */
  2139. = {
  2140.     NULL, /*  0 = Transparent */
  2141.     tx_usascii, /*  1 = ASCII */
  2142.     tx_ident, /*  2 ISO 8859-1 Latin-1 */
  2143.     tx_8859_2, /*  3 ISO 8859-2 Latin-2 */
  2144.     tx_8859_5, /*  4 ISO 8859-5 Cyrillic */
  2145.     NULL, /*  5 Japanese EUC */
  2146.     tx_8859_8, /*  6 ISO 8859-8 Hebrew */
  2147.     tx_8859_7, /*  7 ISO 8859-7 Greek */
  2148.     tx_8859_15, /*  8 ISO 8859-15 Latin-9 */
  2149.     NULL, /*  9 UCS-2 */
  2150.     NULL /* 10 UTF-8 */
  2151. };
  2152. #ifdef COMMENT
  2153. /*
  2154.   The UTF8 conversions are based on the ConvertUTF functions written
  2155.   by Mark E. Davis, copyright 1994 Taligent, Inc.
  2156.   Tables for use in calculating UTF8 conversions.  These contain
  2157.   support for ISO-10646 which supports a 31-bit char size.
  2158.   NOTE: 0xnnnUL is NOT portable!
  2159. */
  2160. ULONG
  2161. offsetsFromUTF8[7] = {
  2162. #ifdef CK_ANSIC
  2163.     0x00000000UL, /* Ignored */
  2164.     0x00000000UL, 0x00003080UL, 0x000E2080UL,
  2165.     0x03C82080UL, 0xFA082080UL, 0x82082080UL
  2166. #else
  2167.     0x00000000L, /* Ignored */
  2168.     0x00000000L, 0x00003080L, 0x000E2080L,
  2169.     0x03C82080L, (unsigned) 0xFA082080L, (unsigned) 0x82082080L
  2170. #endif /* CK_ANSIC */
  2171. };
  2172. CHAR bytesInUTF8[256] = {
  2173.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  2174.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  2175.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  2176.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  2177.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  2178.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  2179.     2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
  2180.     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,5,5,5,5,6,6,6,6
  2181. };
  2182. #endif /* COMMENT */
  2183. CHAR firstByteMark[7] = {0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC};
  2184. /*
  2185.   utf8_to_ucs2() takes one UTF-8 byte at a time.  It returns a pointer the
  2186.   UCS-2 character if and only if the entire UTF-8 string has been received.
  2187.   Return values:
  2188.    0: Complete UTF-8 sequence received; ucs2 points to valid ucs2 character.
  2189.   >0: UTF-8 sequence incomplete, ignore ucs2 value.
  2190.   <0: UTF-8 error, 0xfffd should be inserted BEFORE the ucs2 value.
  2191.   NOTE: A negative value is returned only when two return values are indicated,
  2192.   e.g. when a UTF-8 sequence is interrupted by an ASCII char.  In this case
  2193.   the incomplete UTF-8 sequence must be replaced by 0xfffd, and then the ASCII
  2194.   character is kept as-is.  In other error cases, ucs2 is set to 0xfffd and
  2195.   the return value is 0.
  2196. */
  2197. #define UTFBUFSIZ 16
  2198. int
  2199. #ifdef CK_ANSIC
  2200. utf8_to_ucs2(CHAR ch, USHORT ** ucs2)
  2201. #else
  2202. utf8_to_ucs2(ch, ucs2) CHAR ch; USHORT ** ucs2;
  2203. #endif /* CK_ANSIC */
  2204. {
  2205.     static USHORT ucs2return = 0;
  2206. #ifdef COMMENT
  2207.     /* Unicode Consortium sample code works only with well-formed UTF8 */
  2208.     int i = 0;
  2209.     static int len = 0;
  2210.     static CHAR utf8[UTFBUFSIZ] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
  2211.     ULONG ucs4 = 0;
  2212.     utf8[len++] = ch; /* Add char to string to process */
  2213.     if (len < bytesInUTF8[utf8[0]]) /* Need more bytes */
  2214.       return(bytesInUTF8[utf8[0]] - len);
  2215.     switch (len) { /* Have complete sequence... */
  2216.       case 6: ucs4 += utf8[i++]; ucs4 <<= 6; /* (fall-thru is intentional) */
  2217.       case 5: ucs4 += utf8[i++]; ucs4 <<= 6;
  2218.       case 4: ucs4 += utf8[i++]; ucs4 <<= 6;
  2219.       case 3: ucs4 += utf8[i++]; ucs4 <<= 6;
  2220.       case 2: ucs4 += utf8[i++]; ucs4 <<= 6;
  2221.       case 1: ucs4 += utf8[i++];
  2222.     }
  2223.     ucs4 -= offsetsFromUTF8[len];
  2224.     ucs2return = (USHORT)(ucs4 & 0xFFFF);
  2225. #ifdef DEBUG
  2226.     /* This shows that our return value is in the prevailing byte order: */
  2227.     /* e.g. LE on PC, BE on Sparc. */
  2228.     if (deblog) {
  2229. char buf[16];
  2230. union ck_short xx;
  2231. xx.x_short = ucs2return;
  2232. sprintf(buf,"%04X",ucs2return);
  2233. debug(F111,"utf8_to_ucs2 short",buf,ucs2return);
  2234. debug(F101,"utf8_to_ucs2 char[0]","",xx.x_char[0]);
  2235. debug(F101,"utf8_to_ucs2 char[1]","",xx.x_char[1]);
  2236.     }
  2237. #endif /* DEBUG */
  2238.     *ucs2 = &ucs2return;
  2239.     len = 0;
  2240.     return(0);
  2241. #else
  2242.     /*
  2243.        Robuster code adapted from Thomas Dickey, Xfree86,
  2244.        recommended by Markus Kuhn.
  2245.     */
  2246.     static int utfcount = 0; /* Position in UTF sequence */
  2247.     int utferror = 0; /* Flag for malformed UTF */
  2248.     unsigned c = ch; /* Input byte */
  2249.     int haveucs2 = 0;
  2250.     if (ch < 0x80) { /* ASCII char... */
  2251. if (utfcount > 0) /* Not legal in UTF-8 sequence */
  2252.   utferror = 1; /* so flag */
  2253. haveucs2 = 1;
  2254. ucs2return = ch; /* but also return it */
  2255. utfcount = 0; /* reset UTF-8 count */
  2256.     } else if (ch < 0xc0) { /* 0x80 <= c < 0xc0... */
  2257. if (utfcount < 1) { /* Not valid in first position... */
  2258.     utferror = 1;
  2259. } else { /* Maybe valid */
  2260.     if (ucs2return > 0x03ff) { /* Value would be > 0xffff */
  2261. utferror = 1; /* so not valid */
  2262.     } else { /* OK... */
  2263. ucs2return <<= 6; /* Shift result */
  2264. ucs2return |= (ch & 0x3f); /* and OR in this byte */
  2265.     }
  2266.     if (--utfcount == 0)
  2267.       haveucs2 = 1;
  2268. }
  2269.     } else { /* c >= 0xc0... */
  2270. if (utfcount > 0)
  2271.   utferror = 1;
  2272. if (c < 0xe0) {
  2273.     utfcount = 1;
  2274.     ucs2return = (c & 0x1f);
  2275.     haveucs2 = 1;
  2276. } else if (c < 0xf0) {
  2277.     utfcount = 2;
  2278.     ucs2return = (c & 0x0f);
  2279.     haveucs2 = 1;
  2280. } else if (c < 0xf8) {
  2281.     utfcount = 3;
  2282.     ucs2return = (c & 0x07);
  2283.     haveucs2 = 1;
  2284. } else if (c < 0xfc) {
  2285.     utfcount = 4;
  2286.     ucs2return = (c & 0x03);
  2287.     haveucs2 = 1;
  2288. } else if (c < 0xfe) {
  2289.     utfcount = 5;
  2290.     ucs2return = (c & 0x01);
  2291.     haveucs2 = 1;
  2292. } else {
  2293.     utferror = 1;
  2294.     utfcount = 0;
  2295. }
  2296.     }
  2297.     if (haveucs2 == 0 && utferror != 0) {
  2298. haveucs2 = 1;
  2299. ucs2return = 0xfffd;
  2300. utferror = 0;
  2301.     }
  2302.     if (haveucs2) {
  2303. *ucs2 = &ucs2return;
  2304. if (utferror)
  2305.   utfcount = 0 - utfcount;
  2306. return(utfcount);
  2307.     } else {
  2308. if (utfcount == 0)
  2309.   utfcount++;
  2310. return(utfcount);
  2311.     }
  2312. #endif /* COMMENT */
  2313. }
  2314. /*
  2315.   ucs2_to_utf8() takes one ucs2 character and returns the length and
  2316.   and a pointer to an array containing the equivalent utf8 string.
  2317.   This code can easily be altered to support UCS4 simply by changing
  2318.   the input from USHORT to ULONG.  Returns:
  2319.    >0: Number of bytes in the utf8 string.
  2320.     0: (or less) Error.
  2321. */
  2322. int
  2323. #ifdef CK_ANSIC
  2324. ucs2_to_utf8(USHORT ucs2, CHAR ** utf8)
  2325. #else
  2326. ucs2_to_utf8(ucs2, utf8) USHORT ucs2; CHAR ** utf8;
  2327. #endif /* CK_ANSIC */
  2328. {
  2329.     static CHAR utf8return[8]={0,0,0,0,0,0,0,0};
  2330.     register CONST ULONG byteMask = 0xBF;
  2331.     register CONST ULONG byteMark = 0x80;
  2332.     int utf8len = 0;
  2333.     int i = 0;
  2334.     if (ucs2 < 0x80) {
  2335.         utf8len = 1;
  2336. debug(F101,"ucs2_to_utf8 X1","",utf8len);
  2337.     } else if (ucs2 < 0x800) {
  2338.         utf8len = 2;
  2339. debug(F101,"ucs2_to_utf8 X2","",utf8len);
  2340.     } else
  2341. #ifdef DO_UCS4
  2342.       /* This is always true for UCS-2 but would be needed for UCS-4*/
  2343.       /* When ucs2 is USHORT this gives compiler warnings. */
  2344.       if (ucs2 <= 0xffff)
  2345. #endif /* DO_UCS4 */
  2346.     {
  2347.         utf8len = 3;
  2348. debug(F101,"ucs2_to_utf8 X3","",utf8len);
  2349.     }
  2350. #ifdef DO_UCS4
  2351. /* The following would be for UCS-4 */
  2352.     else if (ucs2 < 0x200000) {
  2353.         utf8len = 4;
  2354.     } else if (ucs2 < 0x4000000) {
  2355.         utf8len = 5;
  2356.     } else if (ucs2 <=
  2357. #ifdef CK_ANSIC
  2358.        0x7FFFFFFFUL /* (doesn't really need the "U") */
  2359. #else
  2360.        0x7FFFFFFFL
  2361. #endif /* CK_ANSIC */
  2362.        ) { /* 31 bits = max for UCS4 */
  2363.         utf8len = 6;
  2364.     } else {
  2365.         utf8len = 2;
  2366.         ucs2 = 0xFFFD;                  /* Replacement for invalid char */
  2367.     }
  2368. #endif /* DO_UCS4 */
  2369.     i = utf8len;                        /* index into utf8return */
  2370.     utf8return[i--] = 0;                /* Null terminate the string */
  2371.     switch (utf8len) {                 /* code falls through cases! */
  2372.       case 6: utf8return[i--] = (ucs2 | byteMark) & byteMask; ucs2 >>= 6;
  2373.       case 5: utf8return[i--] = (ucs2 | byteMark) & byteMask; ucs2 >>= 6;
  2374.       case 4: utf8return[i--] = (ucs2 | byteMark) & byteMask; ucs2 >>= 6;
  2375.       case 3: utf8return[i--] = (ucs2 | byteMark) & byteMask; ucs2 >>= 6;
  2376.       case 2: utf8return[i--] = (ucs2 | byteMark) & byteMask; ucs2 >>= 6;
  2377.       case 1: utf8return[i--] =  ucs2 | firstByteMark[utf8len];
  2378.     }
  2379.     debug(F111,"ucs2_to_utf8",utf8return,utf8len);
  2380.     *utf8 = utf8return;
  2381.     return(utf8len);
  2382. }
  2383. /*  UTF-8 functions...  */
  2384. #ifdef CK_ANSIC
  2385. extern int (*xuf)(USHORT); /* Translation function UCS to FCS */
  2386. extern USHORT (*xfu)(CHAR); /* Translation function FCS to UCS */
  2387. #else
  2388. extern int (*xuf)();
  2389. extern USHORT (*xfu)();
  2390. #endif /* CK_ANSIC */
  2391. /*  u _ t o _ b  --  UTF-8 to Byte  */
  2392. /*
  2393.     Converts from UTF-8 to the current terminal or file character set.
  2394.     Call with:
  2395.       c: a single byte, which is part of a UTF-8 stream.
  2396.     Returns:
  2397.      -9: Error, with second char to follow (call u_to_b2() to get it).
  2398.      -2: UCS line/paragraph end (LS or PS).
  2399.      -1: UTF-8 stream is incomplete and more input is required.
  2400.      >=0: Byte value of result, possibly the "error" byte (e.g. '?').
  2401.     Requires:
  2402.       Global (*xuf)() to point to a function that translates from UCS-2 to
  2403.       the appropriate term/file character set.
  2404. */
  2405. static int savedbyte = 0;
  2406. int /* Call if u_to_b() returns -9 */
  2407. u_to_b2() {
  2408.     return((unsigned)(savedbyte & 0xff));
  2409. }
  2410. int /* UTF-8 to byte */
  2411. #ifdef CK_ANSIC
  2412. u_to_b(CHAR c)
  2413. #else
  2414. u_to_b(c) CHAR c;
  2415. #endif /* CK_ANSIC */
  2416. {
  2417.     int x;
  2418.     USHORT * ucs2, uc;
  2419.     if (!xuf) /* If no conversion function */
  2420.       return(c); /* don't convert (shouldn't happen). */
  2421.     x = utf8_to_ucs2(c,&ucs2); /* Send for conversion to UCS-2 */
  2422.     if (x > 0) /* Not done yet... */
  2423.       return(-1);
  2424.     uc = (x < 0) ? 0xfffd : *ucs2; /* Done, check result */
  2425.     if (uc == 0x2028 || uc == 0x2029) /* LS or PS */
  2426.       return(-2);
  2427.     return((unsigned)(((*xuf)(uc)) & 0xff)); /* Convert UCS-2 to byte */
  2428. }
  2429. /*  b _ t o _ u  --  Byte to UTF-8  */
  2430. /*
  2431.   Converts a byte from the current terminal or file character set to UTF-8.
  2432.   Call with:
  2433.     c........ The byte to be converted.
  2434.     buf...... Pointer to buffer in which to place the result.
  2435.     buflen... Length of the result buffer.
  2436.     setsize.. The size of the source character set (128 or 256).
  2437.   Requires:
  2438.     Global (*xfu)() to point to the function to convert the byte to UCS-2.
  2439.   Returns:
  2440.     -1 if the xfu is NULL; otherwise:
  2441.     >0 indicating the length (in bytes) of the UTF-8 string.
  2442.   If the translation fails, the Unicode "Replacement Character" is returned
  2443.   (0xFFFD translated to UTF-8 == 0xFFBD).
  2444. */
  2445. int /* Byte to UTF-8 */
  2446. #ifdef CK_ANSIC
  2447. b_to_u(CHAR c, CHAR * buf, int buflen, int setsize)
  2448. #else
  2449. b_to_u(c, buf, buflen, setsize) CHAR c, * buf; int buflen, setsize;
  2450. #endif /* CK_ANSIC */
  2451. {
  2452.     CHAR * tmp = NULL;
  2453.     int i, count = 0;
  2454.     USHORT uc;
  2455.     if (!xfu) {
  2456. debug(F100,"b_to_u no xfu","",0);
  2457. return(-1);
  2458.     }
  2459.     uc = c;
  2460.     if (((setsize > 128) && (c & 0x80)) || setsize <= 128) {
  2461. if (xfu) /* FCS-to-UCS function */
  2462.   uc = (*xfu)(c);
  2463.     }
  2464.     count = ucs2_to_utf8(uc,&tmp);
  2465.     if (count < 0) {
  2466. buf[0] = 0xff; /* == 0xFFFD in UTF-8 */
  2467. buf[1] = 0xbd;
  2468. buf[3] = '';
  2469. return(2);
  2470.     }
  2471.     if (count >= buflen) {
  2472. debug(F101,"WARNING: UTF8 buffer overflow","",count);
  2473. count = buflen - 1;
  2474.     }
  2475.     for (i = 0; i < count; i++) /* Copy to result buffer */
  2476.       buf[i] = tmp[i];
  2477.     buf[i] = '';
  2478.     return(count);
  2479. }
  2480. #ifndef OS2
  2481. int
  2482. isunicode( /* Tells whether the host we are */
  2483. #ifdef CK_ANSIC /* running on supports Unicode */
  2484.   void /* display */
  2485. #endif /* CK_ANSIC */
  2486.   ) {
  2487.     extern int tt_unicode;
  2488. #ifdef NT
  2489. #ifdef KUI
  2490.     return(tt_unicode);
  2491. #else /* KUI */
  2492.     if (tt_unicode && !isWin95())
  2493.       return(1);
  2494.     else
  2495.       return(0);
  2496. #endif /* KUI */
  2497. #else /* NT */
  2498.     return(0);
  2499. #endif /* NT */
  2500. }
  2501. #endif /* OS2 */
  2502. #endif /* UNICODE */