home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / sql / convert.cpp < prev    next >
C/C++ Source or Header  |  2000-08-31  |  24KB  |  466 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16.  
  17.  
  18. /*
  19. ** Convert tables between different character sets
  20. ** Some of the tables are hidden behind IFDEF to reduce some space.
  21. ** One can enable them by removing the // characters from the next comment
  22. ** One must also give a name to each mapping that one wants to use...
  23. */
  24.  
  25. /* #define DEFINE_ALL_CHARACTER_SETS */
  26.  
  27. #include "mysql_priv.h"
  28.  
  29. /****************************************************************************
  30. ** Convert tables
  31. ****************************************************************************/
  32.  
  33. /* Windows cp1251->koi8 and reverse conversion by Timur I. Bakeyev <translate@bat.ru> */
  34. /* based on Russian-Apache Team tables by Dmitry M. Klimoff <dmk@kosnet.ru> */
  35.  
  36. static unsigned char cp1251_koi8[256] = {
  37.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  38.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  39.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  40.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  41.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  42.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  43.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  44. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  45. 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
  46. 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
  47. 160,161,162,163,164,189,166,167,179,169,180,171,172,173,174,183,
  48. 176,177,182,166,173,181,182,183,163,185,164,187,188,189,190,167,
  49. 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
  50. 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
  51. 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
  52. 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209
  53. };
  54.  
  55. static unsigned char koi8_cp1251[256] = {
  56.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  57.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  58.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  59.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  60.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  61.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  62.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  63. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  64. 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
  65. 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
  66. 160,161,162,184,186,165,179,191,168,169,170,171,172,180,174,175,
  67. 176,177,178,168,170,181,178,175,184,185,186,187,188,165,190,191,
  68. 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
  69. 239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
  70. 222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
  71. 207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218
  72. };
  73.  
  74.  
  75. #ifdef DEFINE_ALL_CHARACTER_SETS
  76.  
  77. /* These tables was generated from package 'cstools' (author Jan "Yenya" Kasprzak <kas@muni.cz>) */
  78.  
  79. /* Windows pc1250  to iso 8859-2 */
  80.  
  81. static unsigned char t1250_til2[256] = {
  82.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  83.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  84.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  85.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  86.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  87.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  88.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  89. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  90. 128,129,  0,131,  0,  0,  0,  0,136,  0,169,  0,166,171,174,172,
  91. 144,  0,  0,  0,  0,  0,  0,  0,152,  0,185,  0,182,187,190,188,
  92. 160,183,162,163,164,161,  0,167,168,  0,170,  0,  0,173,  0,175,
  93. 176,  0,178,179,180,  0,  0,  0,184,177,186,  0,165,189,181,191,
  94. 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
  95. 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
  96. 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
  97. 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
  98. };
  99.  
  100. static unsigned char til2_t1250[256] = {
  101.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  102.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  103.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  104.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  105.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  106.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  107.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  108. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  109. 128,129,  0,131,  0,  0,  0,  0,136,  0,  0,  0,  0,  0,  0,  0,
  110. 144,  0,  0,  0,  0,  0,  0,  0,152,  0,  0,  0,  0,  0,  0,  0,
  111. 160,165,162,163,164,188,140,167,168,138,170,141,143,173,142,175,
  112. 176,185,178,179,180,190,156,161,184,154,186,157,159,189,158,191,
  113. 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
  114. 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
  115. 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
  116. 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
  117. };
  118.  
  119. /* Windows pc1252  to iso 8859-2 */
  120.  
  121. static unsigned char t1252_til2[256] = {
  122.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  123.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  124.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  125.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  126.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  127.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  128.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  129. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  130. 128,129,  0,  0,  0,  0,  0,  0,136,  0,169,  0,  0,141,142,143,
  131. 144,  0,  0,  0,  0,  0,  0,  0,189,  0,185,  0,  0,157,158,  0,
  132. 160,  0,  0,  0,164,  0,  0,167,168,  0,  0,  0,  0,173,  0,  0,
  133. 176,  0,  0,  0,180,  0,  0,  0,184,  0,  0,  0,  0,  0,  0,  0,
  134.   0,193,194,  0,196,  0,  0,199,  0,201,  0,203,  0,205,206,  0,
  135. 208,  0,  0,211,212,  0,214,215,  0,  0,218,  0,220,221,  0,223,
  136.   0,225,226,  0,228,  0,  0,231,  0,233,  0,235,  0,237,238,  0,
  137. 240,  0,  0,243,244,  0,246,247,  0,  0,250,  0,252,253,  0,  0
  138. };
  139. static unsigned char til2_t1252[256] = {
  140.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  141.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  142.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  143.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  144.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  145.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  146.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  147. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  148. 128,129,  0,  0,  0,  0,  0,  0,136,  0,  0,  0,  0,141,142,143,
  149. 144,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,157,158,  0,
  150. 160,  0,  0,  0,164,  0,  0,167,168,138,  0,  0,  0,173,  0,  0,
  151. 176,  0,  0,  0,180,  0,  0,  0,184,154,  0,  0,  0,152,  0,  0,
  152.   0,193,194,  0,196,  0,  0,199,  0,201,  0,203,  0,205,206,  0,
  153. 208,  0,  0,211,212,  0,214,215,  0,  0,218,  0,220,221,  0,223,
  154.   0,225,226,  0,228,  0,  0,231,  0,233,  0,235,  0,237,238,  0,
  155. 240,  0,  0,243,244,  0,246,247,  0,  0,250,  0,252,253,  0,  0
  156. };
  157.  
  158. /* MSDOS Kamenicky encoding (for Czech/Slovak) to iso 8859-2 */
  159.  
  160. static unsigned char tkam_til2[256] = {
  161.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  162.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  163.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  164.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  165.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  166.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  167.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  168. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  169. 200,252,233,239,228,207,171,232,236,204,197,205,181,229,196,193,
  170. 201,190,174,244,246,211,249,218,253,214,220,169,165,221,216,187,
  171. 225,237,243,250,242,210,217,212,185,248,224,192,  0,167,  0,  0,
  172.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  173.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  174.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  175.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  176.   0,  0,  0,  0,  0,  0,247,  0,176,  0,  0,  0,  0,  0,  0,  0
  177. };
  178. static unsigned char til2_tkam[256] = {
  179.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  180.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  181.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  182.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  183.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  184.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  185.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  186. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  187.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  188.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  189.   0,  0,  0,  0,  0,156,  0,173,  0,155,  0,134,  0,  0,146,  0,
  190. 248,  0,  0,  0,  0,140,  0,  0,  0,168,  0,159,  0,  0,145,  0,
  191. 171,143,  0,  0,142,138,  0,  0,128,144,  0,  0,137,139,  0,133,
  192.   0,  0,165,149,167,  0,153,  0,158,166,151,  0,154,157,  0,  0,
  193. 170,160,  0,  0,132,141,  0,  0,135,130,  0,  0,136,161,  0,131,
  194.   0,  0,164,162,147,  0,148,246,169,150,163,  0,129,152,  0,  0
  195. };
  196.  
  197. /* Macintosh Roman encoding to iso 8859-2 */
  198.  
  199. static unsigned char tmac_til2[256] = {
  200.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  201.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  202.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  203.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  204.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  205.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  206.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  207. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  208. 196,  0,199,201,  0,214,220,225,  0,226,228,  0,  0,231,233,  0,
  209.   0,235,237,  0,238,  0,  0,243,  0,244,246,  0,250,  0,  0,252,
  210.   0,176,  0,  0,167,  0,  0,223,  0,  0,  0,180,168,  0,  0,  0,
  211.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  212.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,160,  0,  0,  0,  0,  0,
  213.   0,  0,  0,  0,  0,  0,247,  0,  0,  0,  0,164,  0,  0,  0,  0,
  214.   0,  0,  0,  0,  0,194,  0,193,203,  0,205,206,  0,  0,211,212,
  215.   0,  0,218,  0,  0,  0,  0,  0,  0,162,255,  0,184,189,178,183
  216. };
  217. static unsigned char til2_tmac[256] = {
  218.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  219.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  220.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  221.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  222.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  223.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  224.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  225. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  226.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  227.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  228. 202,  0,249,  0,219,  0,  0,164,172,  0,  0,  0,  0,  0,  0,  0,
  229. 161,  0,254,  0,171,  0,  0,255,252,  0,  0,  0,  0,253,  0,  0,
  230.   0,231,229,  0,128,  0,  0,130,  0,131,  0,232,  0,234,235,  0,
  231.   0,  0,  0,238,239,  0,133,  0,  0,  0,242,  0,134,  0,  0,167,
  232.   0,135,137,  0,138,  0,  0,141,  0,142,  0,145,  0,146,148,  0,
  233.   0,  0,  0,151,153,  0,154,214,  0,  0,156,  0,159,  0,  0,250
  234. };
  235.  
  236. /* Macintosh Central European encodingto iso 8859-2 */
  237.  
  238. static unsigned char tmacce_til2[256] = {
  239.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  240.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  241.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  242.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  243.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  244.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  245.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  246. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  247. 196,  0,  0,201,161,214,220,225,177,200,228,232,198,230,233,172,
  248. 188,207,237,239,  0,  0,  0,243,  0,244,246,  0,250,204,236,252,
  249.   0,176,202,  0,167,  0,  0,223,  0,  0,  0,234,168,  0,  0,  0,
  250.   0,  0,  0,  0,  0,  0,  0,  0,179,  0,  0,165,181,197,229,  0,
  251.   0,209,  0,  0,241,210,  0,  0,  0,  0,160,242,213,  0,245,  0,
  252.   0,  0,  0,  0,  0,  0,247,  0,  0,192,224,216,  0,  0,248,  0,
  253.   0,169,  0,  0,185,166,182,193,171,187,205,174,190,  0,211,212,
  254.   0,217,218,249,219,251,  0,  0,221,253,  0,175,163,191,  0,183
  255. };
  256. static unsigned char til2_tmacce[256] = {
  257.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  258.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  259.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  260.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  261.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  262.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  263.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  264. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  265.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  266.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  267. 202,132,  0,252,  0,187,229,164,172,225,  0,232,143,  0,235,251,
  268. 161,136,  0,184,  0,188,230,255,  0,228,  0,233,144,  0,236,253,
  269. 217,231,  0,  0,128,189,140,  0,137,131,162,  0,157,234,  0,145,
  270.   0,193,197,238,239,204,133,  0,219,241,242,244,134,248,  0,167,
  271. 218,135,  0,  0,138,190,141,  0,139,142,171,  0,158,146,  0,147,
  272.   0,196,203,151,153,206,154,214,222,243,156,245,159,249,  0,  0
  273. };
  274.  
  275. /* PC-Latin2 encoding, supported by M$-DOS to iso 8859-2 */
  276.  
  277. static unsigned char tpc2_til2[256] = {
  278.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  279.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  280.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  281.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  282.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  283.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  284.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  285. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  286. 199,252,233,226,228,249,230,231,179,235,213,245,238,172,196,198,
  287. 201,197,229,244,246,165,181,166,182,214,220,171,187,163,215,232,
  288. 225,237,243,250,161,177,174,190,202,234,  0,188,200,186,  0,  0,
  289.   0,  0,  0,  0,  0,193,194,204,170,  0,  0,  0,  0,175,191,  0,
  290.   0,  0,  0,  0,  0,  0,195,227,  0,  0,  0,  0,  0,  0,  0,164,
  291. 240,208,207,203,239,210,205,206,236,  0,  0,  0,  0,222,217,  0,
  292. 211,223,212,209,241,242,169,185,192,218,224,219,253,221,254,180,
  293.   0,189,178,183,162,167,247,184,  0,168,255,251,216,248,  0,  0
  294. };
  295. static unsigned char til2_tpc2[256] = {
  296.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  297.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  298.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  299.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  300.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  301.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  302.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  303. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  304.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  305.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  306.   0,164,244,157,207,149,151,245,249,230,184,155,141,  0,166,189,
  307.   0,165,242,136,239,150,152,243,247,231,173,156,171,241,167,190,
  308. 232,181,182,198,142,145,143,128,172,144,168,211,183,214,215,210,
  309. 209,227,213,224,226,138,153,158,252,222,233,235,154,237,221,225,
  310. 234,160,131,199,132,146,134,135,159,130,169,137,216,161,140,212,
  311. 208,228,229,162,147,139,148,246,253,133,163,251,129,236,238,250
  312. };
  313.  
  314. /* Encoding used by standard IBM PC vga cards to iso8859-2 */
  315. static unsigned char tvga_til2[256] = {
  316.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  317.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  318.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  319.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  320.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  321.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  322.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  323. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  324. 199,252,233,226,228,  0,  0,231,  0,235,  0,  0,238,  0,196,  0,
  325. 201,  0,  0,244,246,  0,  0,  0,  0,214,220,  0,  0,  0,  0,  0,
  326. 225,237,243,250,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  327.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  328.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  329.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  330.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  331.   0,  0,  0,  0,  0,  0,247,  0,176,  0,  0,  0,  0,  0,  0,  0
  332. };
  333. static unsigned char til2_tvga[256] = {
  334.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  335.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  336.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  337.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  338.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  339.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  340.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  341. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  342.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  343.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  344.   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  345. 248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  346.   0,  0,  0,  0,142,  0,  0,128,  0,144,  0,  0,  0,  0,  0,  0,
  347.   0,  0,  0,  0,  0,  0,153,  0,  0,  0,  0,  0,154,  0,  0,  0,
  348.   0,160,131,  0,132,  0,  0,135,  0,130,  0,137,  0,161,140,  0,
  349.   0,  0,  0,162,147,  0,148,246,  0,  0,163,  0,129,  0,  0,  0
  350. };
  351.  
  352. //Ukrainian koi8 and win1251 converting tables by Max Veremayenko
  353. //(verem@tg.kiev.ua
  354.  
  355. static unsigned char koi8_ukr_win1251ukr[256] = {
  356.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  357.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  358.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  359.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  360.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  361.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  362.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  363. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  364. 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
  365. 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
  366. 160,161,162,184,186,165,179,191,168,169,170,171,172,180,174,175,
  367. 176,177,178,168,170,181,178,175,184,185,186,187,188,165,190,191,
  368. 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
  369. 239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
  370. 222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
  371. 207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218
  372. };
  373.  
  374. static unsigned char win1251ukr_koi8_ukr[256] = {
  375.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
  376.  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  377.  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  378.  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  379.  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  380.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  381.  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  382. 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  383. 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
  384. 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
  385. 160,161,162,163,164,189,166,167,179,169,180,171,172,173,174,183,
  386. 176,177,182,166,173,181,182,183,163,185,164,187,188,189,190,167,
  387. 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
  388. 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
  389. 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
  390. 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209
  391. };
  392.  
  393. #endif /* DEFINE_ALL_CHARACTER_SETS */
  394.  
  395. /****************************************************************************
  396. ** Declare mapping variables
  397. ****************************************************************************/
  398.  
  399.  
  400. CONVERT conv_cp1251_koi8("cp1251_koi8", cp1251_koi8, koi8_cp1251);
  401. #ifdef DEFINE_ALL_CHARACTER_SETS
  402. CONVERT conv_cp1250_latin2("cp1250_latin2", t1250_til2, til2_t1250);
  403. CONVERT conv_kam_latin2("kam_latin2", tkam_til2, til2_tkam);
  404. CONVERT conv_mac_latin2("mac_latin2", tmac_til2, til2_tmac);
  405. CONVERT conv_macce_latin2("macce_latin2", tmacce_til2, til2_tmacce);
  406. CONVERT conv_pc2_latin2("pc2_latin2", tpc2_til2, til2_tpc2);
  407. CONVERT conv_vga_latin2("vga_latin2", tvga_til2, til2_tvga);
  408. CONVERT conv_koi8_cp1251("koi8_cp1251", koi8_cp1251, cp1251_koi8);
  409. CONVERT conv_win1251ukr_koi8_ukr("win1251ukr_koi8_ukr", win1251ukr_koi8_ukr,
  410.                  koi8_ukr_win1251ukr);
  411. CONVERT conv_koi8_ukr_win1251ukr("koi8_ukr_win1251ukr", koi8_ukr_win1251ukr,
  412.                  win1251ukr_koi8_ukr);
  413. #endif /* DEFINE_ALL_CHARACTER_SETS */
  414.  
  415. CONVERT *convert_tables[]= {
  416.   &conv_cp1251_koi8,
  417. #ifdef DEFINE_ALL_CHARACTER_SETS
  418.   &conv_cp1250_latin2,
  419.   &conv_kam_latin2,
  420.   &conv_mac_latin2,
  421.   &conv_macce_latin2,
  422.   &conv_pc2_latin2,
  423.   &conv_vga_latin2,
  424.   &conv_koi8_cp1251,
  425.   &conv_win1251ukr_koi8_ukr,
  426.   &conv_koi8_ukr_win1251ukr,
  427. #endif /* DEFINE_ALL_CHARACTER_SETS */
  428.   NULL
  429. };
  430.  
  431.  
  432. CONVERT *get_convert_set(const char *name)
  433. {
  434.   for (CONVERT **ptr=convert_tables ; *ptr ; ptr++)
  435.   {
  436.     if (!my_strcasecmp((*ptr)->name,name))
  437.       return (*ptr);
  438.   }
  439.   return 0;
  440. }
  441.  
  442.  
  443. void CONVERT::convert_array(const uchar *map, uchar * buf, uint len)
  444. {
  445.   for (uchar *end=buf+len ; buf != end ; buf++)
  446.     *buf= map[*buf];
  447. }
  448.  
  449.  
  450. /* This is identical as net_store_data, but with a conversion */
  451.  
  452. bool CONVERT::store(String *packet,const char *from,uint length)
  453. {
  454.   uint packet_length=packet->length();
  455.   if (packet_length+5+length > packet->alloced_length() &&
  456.       packet->realloc(packet_length+5+length))
  457.     return 1;
  458.   char *to=(char*) net_store_length((char*) packet->ptr()+packet_length,
  459.                     length);
  460.  
  461.   for (const char *end=from+length ; from != end ; from++)
  462.     *to++= to_map[(uchar) *from];
  463.   packet->length((uint) (to-packet->ptr()));
  464.   return 0;
  465. }
  466.