home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / lib / libi18n / sbconvtb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  12.2 KB  |  287 lines

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18. /*    sbconvtb.c    */
  19. /*
  20.     Function that handle single byte Conversion table
  21. */
  22. #include "intlpriv.h"
  23.  
  24. /* ------------------------------------------------*
  25.         XP_MAC
  26.  * ------------------------------------------------*/
  27. #ifdef XP_MAC
  28.  
  29. PUBLIC char ** 
  30. INTL_GetSingleByteTable(int16 from_csid, int16 to_csid, int32 resourceid)
  31. {
  32.     return FE_GetSingleByteTable(from_csid, to_csid,resourceid);
  33. }
  34. PUBLIC char *INTL_LockTable(char **cvthdl)
  35. {
  36.     return *cvthdl;
  37. }
  38. PUBLIC void INTL_FreeSingleByteTable(char **cvthdl) 
  39. {
  40.     FE_FreeSingleByteTable(cvthdl);
  41. }
  42. #endif
  43.  
  44. /* ------------------------------------------------*
  45.         XP_WIN
  46.  * ------------------------------------------------*/
  47. #if defined(XP_WIN) || defined(XP_OS2)
  48.  
  49.  
  50.  
  51. PUBLIC char ** 
  52. INTL_GetSingleByteTable(int16 from_csid, int16 to_csid, int32 resourceid)
  53. {
  54.     return FE_GetSingleByteTable(from_csid, to_csid,resourceid);
  55. }
  56. PUBLIC char *INTL_LockTable(char **cvthdl)
  57. {
  58.     return FE_LockTable(cvthdl);
  59. }
  60. PUBLIC void INTL_FreeSingleByteTable(char **cvthdl) 
  61. {
  62.     FE_FreeSingleByteTable(cvthdl);
  63. }
  64. #endif
  65.  
  66. /* ------------------------------------------------*
  67.         XP_UNIX
  68.  * ------------------------------------------------*/
  69. #ifdef XP_UNIX
  70. /* TRANSLATION RESOURCES */
  71. /* Tables for Win CP1252 -> ISO 8859-1          */
  72. PRIVATE unsigned char cp1252_to_iso8859_1[] = {
  73. /*8x*/  '?', '?', ',', 'f', '?', '?', '?', '?', '^', '?', 'S', '<', '?', '?', '?', '?',
  74. /*9x*/  '?', '?', '?', '?', '?', '*', '-', '-', '~', '?', 's', '>', '?', '?', '?', 'Y',
  75. /*Ax*/ 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
  76. /*Bx*/ 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
  77. /*Cx*/ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
  78. /*Dx*/ 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
  79. /*Ex*/ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
  80. /*Fx*/ 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
  81. };
  82.  
  83. PRIVATE char *cp1252_to_iso8859_1_p = (char*)cp1252_to_iso8859_1;
  84.  
  85. /*     Translation 8859-5.txt -> koi8r.txt   */
  86. /* There are total 61 character unmap !! */
  87. PRIVATE unsigned char iso8859_5_to_koi8r[] = {
  88. /*8x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  89. /*9x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  90. /*Ax*/ 0x9A,0xB3, '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  91. /*Bx*/ 0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,
  92. /*Cx*/ 0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE,0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1,
  93. /*Dx*/ 0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,
  94. /*Ex*/ 0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE,0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1,
  95. /*Fx*/  '?',0xA3, '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  96. };
  97. PRIVATE char *iso8859_5_to_koi8r_p = (char*)iso8859_5_to_koi8r;
  98.  
  99. /*     Translation koi8r.txt -> 8859-5.txt   */
  100. /* There are total 61 character unmap !! */
  101. PRIVATE unsigned char koi8r_to_iso8859_5[] = {
  102. /*8x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  103. /*9x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',0xA0, '?', '?', '?', '?', '?',
  104. /*Ax*/  '?', '?', '?',0xF1, '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  105. /*Bx*/  '?', '?', '?',0xA1, '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  106. /*Cx*/ 0xEE,0xD0,0xD1,0xE6,0xD4,0xD5,0xE4,0xD3,0xE5,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,
  107. /*Dx*/ 0xDF,0xEF,0xE0,0xE1,0xE2,0xE3,0xD6,0xD2,0xEC,0xEB,0xD7,0xE8,0xED,0xE9,0xE7,0xEA,
  108. /*Ex*/ 0xCE,0xB0,0xB1,0xC6,0xB4,0xB5,0xC4,0xB3,0xC5,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,
  109. /*Fx*/ 0xBF,0xCF,0xC0,0xC1,0xC2,0xC3,0xB6,0xB2,0xCC,0xCB,0xB7,0xC8,0xCD,0xC9,0xC7,0xCA,
  110. };
  111. PRIVATE char *koi8r_to_iso8859_5_p = (char*)koi8r_to_iso8859_5;
  112.  
  113. /*  Translation cp1250 -> 8859-2 
  114.  * There are 32 characters unmapped:
  115.  * 80 - 89, 8B, 90 - 99, 9B, A6, A9, AB, AC, AE, B1, B5, B6, B7, BB
  116.  */
  117. PRIVATE unsigned char cp1250_to_iso8859_2[] = {
  118. /*8x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',0xA9, '?',0xA6,0xAB,0xAE,0xAC,
  119. /*9x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',0xB9, '?',0xB6,0xBB,0xBE,0xBC,
  120. /*Ax*/ 0xA0,0xB7,0xA2,0xA3,0xA4,0xA1, '?',0xA7,0xA8, '?',0xAA, '?', '?',0xAD, '?',0xAF,
  121. /*Bx*/ 0xB0, '?',0xB2,0xB3,0xB4, '?', '?', '?',0xB8,0xB1,0xBA, '?',0xA5,0xBD,0xB5,0xBF,
  122. /*Cx*/ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
  123. /*Dx*/ 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
  124. /*Ex*/ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
  125. /*Fx*/ 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
  126. };
  127. PRIVATE char *cp1250_to_iso8859_2_p = (char*)cp1250_to_iso8859_2;
  128.  
  129.  
  130. /* Translation 8859-2 -> cp1250
  131.  * There are 32 characters unmapped: 80 - 8F, 90 - 9F 
  132.  */
  133. PRIVATE unsigned char iso8859_2_to_cp1250[] = {
  134. /*8x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  135. /*9x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  136. /*Ax*/ 0xA0,0xA5,0xA2,0xA3,0xA4,0xBC,0x8C,0xA7,0xA8,0x8A,0xAA,0x8D,0x8F,0xAD,0x8E,0xAF,
  137. /*Bx*/ 0xB0,0xB9,0xB2,0xB3,0xB4,0xBE,0x9C,0xA1,0xB8,0x9A,0xBA,0x9D,0x9F,0xBD,0x9E,0xBF,
  138. /*Cx*/ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
  139. /*Dx*/ 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
  140. /*Ex*/ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
  141. /*Fx*/ 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
  142. };
  143. PRIVATE char *iso8859_2_to_cp1250_p = (char*)iso8859_2_to_cp1250;
  144.  
  145. /* Translation cp1251 -> 8859-5
  146.  * There are 32 characters unmapped:
  147.  * 82, 84 - 89, 8B, 91 - 99, 9B, A4 - A6, A9, AB, AC, AE, B0, B1, B4 - B7, BB,
  148.  */
  149. PRIVATE unsigned char cp1251_to_iso8859_5[] = {
  150. /*8x*/ 0xA2,0xA3, '?',0xF3, '?', '?', '?', '?', '?', '?',0xA9, '?',0xAA,0xAC,0xAB,0xAF,
  151. /*9x*/ 0xF2, '?', '?', '?', '?', '?', '?', '?', '?', '?',0xF9, '?',0xFA,0xFC,0xFB,0xFF,
  152. /*Ax*/ 0xA0,0xAE,0xFE,0xA8, '?', '?', '?',0xFD,0xA1, '?',0xA4, '?', '?',0xAD, '?',0xA7,
  153. /*Bx*/  '?', '?',0xA6,0xF6, '?', '?', '?', '?',0xF1,0xF0,0xF4, '?',0xF8,0xA5,0xF5,0xF7,
  154. /*Cx*/ 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
  155. /*Dx*/ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
  156. /*Ex*/ 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
  157. /*Fx*/ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
  158. };
  159. PRIVATE char *cp1251_to_iso8859_5_p = (char*)cp1251_to_iso8859_5;
  160.  
  161. /* Translation 8859-5 -> cp1251
  162.  * There are 32 characters unmapped:
  163.  * 80 - 8F, 90 - 9F
  164.  */
  165. PRIVATE unsigned char iso8859_5_to_cp1251[] = {
  166. /*8x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  167. /*9x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  168. /*Ax*/ 0xA0,0xA8,0x80,0x81,0xAA,0xBD,0xB2,0xAF,0xA3,0x8A,0x8C,0x8E,0x8D,0xAD,0xA1,0x8F,
  169. /*Bx*/ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
  170. /*Cx*/ 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
  171. /*Dx*/ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
  172. /*Ex*/ 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
  173. /*Fx*/ 0xB9,0xB8,0x90,0x83,0xBA,0xBE,0xB3,0xBF,0xBC,0x9A,0x9C,0x9E,0x9D,0xA7,0xA2,0x9F,
  174. };
  175. PRIVATE char *iso8859_5_to_cp1251_p = (char*)iso8859_5_to_cp1251;
  176.  
  177. /* Translation cp1253 -> 8859-7
  178.  * There are 40 characters unmapped:
  179.  * 80 - 8F, 90 - 9F, A4 - A5, AA, AE, B5 - B6, D2, FF
  180.  */
  181. PRIVATE unsigned char cp1253_to_iso8859_7[] = {
  182. /*8x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  183. /*9x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  184. /*Ax*/ 0xA0,0xB5,0xB6,0xA3, '?', '?',0xA6,0xA7,0xA8,0xA9, '?',0xAB,0xAC,0xAD, '?',0xAF,
  185. /*Bx*/ 0xB0,0xB1,0xB2,0xB3,0xB4, '?', '?',0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
  186. /*Cx*/ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
  187. /*Dx*/ 0xD0,0xD1, '?',0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
  188. /*Ex*/ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
  189. /*Fx*/ 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE, '?',
  190. };
  191. PRIVATE char *cp1253_to_iso8859_7_p = (char*)cp1253_to_iso8859_7;
  192.  
  193. /* Translation 8859-7 -> cp1253
  194.  * There are 40 characters unmapped:
  195.  * 80 - 8F, 90 - 9F, A1 - A2, A4 - A5, AA, AE, D2, FF
  196.  */
  197. PRIVATE unsigned char iso8859_7_to_cp1253[] = {
  198. /*8x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  199. /*9x*/  '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
  200. /*Ax*/ 0xA0, '?', '?',0xA3, '?', '?',0xA6,0xA7,0xA8,0xA9, '?',0xAB,0xAC,0xAD, '?',0xAF,
  201. /*Bx*/ 0xB0,0xB1,0xB2,0xB3,0xB4,0xA1,0xA2,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
  202. /*Cx*/ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
  203. /*Dx*/ 0xD0,0xD1, '?',0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
  204. /*Ex*/ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
  205. /*Fx*/ 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE, '?',
  206. };
  207. PRIVATE char *iso8859_7_to_cp1253_p = (char*)iso8859_7_to_cp1253;
  208.  
  209. PUBLIC char ** 
  210. INTL_GetSingleByteTable(int16 from_csid, int16 to_csid, int32 resourceid)
  211. {
  212.     /* LATIN1 */
  213.     if ((from_csid == CS_LATIN1) && (to_csid == CS_LATIN1)) {
  214.         return &cp1252_to_iso8859_1_p;
  215.     }
  216.  
  217.     /* LATIN2 */
  218.     else if ((from_csid == CS_LATIN2) && (to_csid == CS_CP_1250)) {
  219.         return &iso8859_2_to_cp1250_p;
  220.     }
  221.     else if ((from_csid == CS_CP_1250) && (to_csid == CS_LATIN2)) {
  222.         return &cp1250_to_iso8859_2_p;
  223.     }
  224.  
  225.     /* CYRILLIC */
  226.     else if ((from_csid == CS_8859_5) && (to_csid == CS_KOI8_R)) {
  227.         return &iso8859_5_to_koi8r_p;
  228.     }
  229.     else if ((from_csid == CS_KOI8_R) && (to_csid == CS_8859_5)) {
  230.         return &koi8r_to_iso8859_5_p;
  231.     }
  232.     else if ((from_csid == CS_8859_5) && (to_csid == CS_CP_1251)) {
  233.         return &iso8859_5_to_cp1251_p;
  234.     }
  235.     else if ((from_csid == CS_CP_1251) && (to_csid == CS_8859_5)) {
  236.         return &cp1251_to_iso8859_5_p;
  237.     }
  238.  
  239.     /* GREEK */
  240.     else if ((from_csid == CS_8859_7) && (to_csid == CS_CP_1253)) {
  241.         return &iso8859_7_to_cp1253_p;
  242.     }
  243.     else if ((from_csid == CS_CP_1253) && (to_csid == CS_8859_7)) {
  244.         return &cp1253_to_iso8859_7_p;
  245.     }
  246.  
  247.     /* others To Be Implement */
  248.     else
  249.         return(NULL);
  250. }    
  251. PUBLIC char *INTL_LockTable(char **cvthdl)
  252. {
  253.     /* no need to lock as the tables are static */
  254.     return *cvthdl;
  255. }
  256. PUBLIC void INTL_FreeSingleByteTable(char **cvthdl) {
  257.     /* no need to free as the tables are static */
  258. }
  259.  
  260. #endif
  261.  
  262.  
  263. unsigned char *
  264. One2OneCCC (CCCDataObject obj, const unsigned char *s, int32 l)
  265. {
  266.     char **cvthdl;
  267.     register unsigned char    *cp;
  268.     char *pTable;
  269.  
  270.     cvthdl = (char **)INTL_GetSingleByteTable(INTL_GetCCCFromCSID(obj), INTL_GetCCCToCSID(obj), INTL_GetCCCCvtflag(obj));
  271.     
  272.     if (cvthdl != NULL)
  273.     {
  274.         pTable = INTL_LockTable(cvthdl);
  275.         for (cp = (unsigned char *)s; cp < (unsigned char *)s + l; cp++)
  276.         {
  277.             if(*cp  & 0x80)
  278.                 *cp = pTable[(*cp & 0x7F)];
  279.         }        
  280.     }
  281.     INTL_SetCCCLen(obj, l);
  282.     INTL_FreeSingleByteTable(cvthdl);
  283.  
  284.     return((unsigned char *)s);
  285. }
  286.  
  287.