Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

321 lines
9.5 KiB

  1. /***
  2. *tombbmbc.c - convert 1-byte code to and from 2-byte code
  3. *
  4. * Copyright (c) 1985-2001, Microsoft Corporation. All rights reserved.
  5. *
  6. *Purpose:
  7. * _mbbtombc() - converts 1-byte code to corresponding 2-byte code
  8. * _mbctombb() - converts 2-byte code to corresponding 1-byte code
  9. *
  10. *Revision History:
  11. * 11-19-92 KRS Ported from 16-bit sources.
  12. * 08-20-93 CFW Change short params to int for 32-bit tree.
  13. * 09-24-93 CFW Removed #ifdef _KANJI
  14. * 09-29-93 CFW Return c unchanged if not Kanji code page.
  15. * 10-06-93 GJF Replaced _CRTAPI1 with __cdecl.
  16. *
  17. *******************************************************************************/
  18. #ifdef _MBCS
  19. #include <cruntime.h>
  20. #include <mbdata.h>
  21. #include <mbstring.h>
  22. #include <mbctype.h>
  23. #define ASCLOW 0x20
  24. #define ASCHIGH 0x7e
  25. #define SBLOW 0xA1
  26. #define SBHIGH 0xDF
  27. #define MBLIMIT 0x8396
  28. static unsigned short mbbtable[] = {
  29. /*20*/ 0x8140, 0x8149, 0x8168, 0x8194, 0x8190, 0x8193, 0x8195, 0x8166,
  30. 0x8169, 0x816a, 0x8196, 0x817b, 0x8143, 0x817c, 0x8144, 0x815e,
  31. /*30*/ 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256,
  32. 0x8257, 0x8258, 0x8146, 0x8147, 0x8183, 0x8181, 0x8184, 0x8148,
  33. /*40*/ 0x8197, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266,
  34. 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e,
  35. /*50*/ 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276,
  36. 0x8277, 0x8278, 0x8279, 0x816d, 0x818f, 0x816e, 0x814f, 0x8151,
  37. /*60*/ 0x8165, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287,
  38. 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f,
  39. /*70*/ 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297,
  40. 0x8298, 0x8299, 0x829a, 0x816f, 0x8162, 0x8170, 0x8150,
  41. };
  42. static struct {
  43. unsigned char asc;
  44. char synonym;
  45. unsigned short mbccode;
  46. } mbctable[] = {
  47. // ASCII Code | Synonym | KANJI Code
  48. //Katakana Table
  49. { 0xA7, 1, 0x8340 }, // 'a'
  50. { 0xB1, 1, 0x8341 }, // 'A'
  51. { 0xA8, 1, 0x8342 }, // 'i'
  52. { 0xB2, 1, 0x8343 }, // 'I'
  53. { 0xA9, 1, 0x8344 }, // 'u'
  54. { 0xB3, 1, 0x8345 }, // 'U'
  55. { 0xAA, 1, 0x8346 }, // 'e'
  56. { 0xB4, 1, 0x8347 }, // 'E'
  57. { 0xAB, 1, 0x8348 }, // 'o'
  58. { 0xB5, 1, 0x8349 }, // 'O'
  59. { 0xB6, 2, 0x834A }, // 'KA'
  60. { 0xB7, 2, 0x834C }, // 'KI'
  61. { 0xB8, 2, 0x834E }, // 'KU'
  62. { 0xB9, 2, 0x8350 }, // 'KE'
  63. { 0xBA, 2, 0x8352 }, // 'KO'
  64. { 0xBB, 2, 0x8354 }, // 'SA'
  65. { 0xBC, 2, 0x8356 }, // 'SI'
  66. { 0xBD, 2, 0x8358 }, // 'SU'
  67. { 0xBE, 2, 0x835A }, // 'SE'
  68. { 0xBF, 2, 0x835C }, // 'SO'
  69. { 0xC0, 2, 0x835E }, // 'TA'
  70. { 0xC1, 2, 0x8360 }, // 'CHI'
  71. { 0xAF, 1, 0x8362 }, // 'tsu'
  72. { 0xC2, 2, 0x8363 }, // 'TSU'
  73. { 0xC3, 2, 0x8365 }, // 'TE''
  74. { 0xC4, 2, 0x8367 }, // 'TO''
  75. { 0xC5, 1, 0x8369 }, // 'NA'
  76. { 0xC6, 1, 0x836A }, // 'NI'
  77. { 0xC7, 1, 0x836B }, // 'NU'
  78. { 0xC8, 1, 0x836C }, // 'NE'
  79. { 0xC9, 1, 0x836D }, // 'NO'
  80. { 0xCA, 3, 0x836E }, // 'HA'
  81. { 0xCB, 3, 0x8371 }, // 'HI'
  82. { 0xCC, 3, 0x8374 }, // 'FU'
  83. { 0xCD, 3, 0x8377 }, // 'HE'
  84. { 0xCE, 3, 0x837A }, // 'HO'
  85. { 0xCF, 1, 0x837D }, // 'MA'
  86. { 0xD0, 1, 0x837E }, // 'MI'
  87. { 0xD1, 1, 0x8380 }, // 'MU'
  88. { 0xD2, 1, 0x8381 }, // 'ME'
  89. { 0xD3, 1, 0x8382 }, // 'MO'
  90. { 0xAC, 1, 0x8383 }, // 'ya'
  91. { 0xD4, 1, 0x8384 }, // 'YA'
  92. { 0xAD, 1, 0x8385 }, // 'yu'
  93. { 0xD5, 1, 0x8386 }, // 'YU'
  94. { 0xAE, 1, 0x8387 }, // 'yo'
  95. { 0xD6, 1, 0x8388 }, // 'YO'
  96. { 0xD7, 1, 0x8389 }, // 'RA'
  97. { 0xD8, 1, 0x838A }, // 'RI'
  98. { 0xD9, 1, 0x838B }, // 'RU'
  99. { 0xDA, 1, 0x838C }, // 'RE'
  100. { 0xDB, 1, 0x838D }, // 'RO'
  101. { 0xDC, 2, 0x838E }, // 'WA'
  102. { 0xB2, 1, 0x8390 }, // 'I'
  103. { 0xB4, 1, 0x8391 }, // 'E'
  104. { 0xA6, 1, 0x8392 }, // 'WO'
  105. { 0xDD, 1, 0x8393 }, // 'N'
  106. { 0xB3, 1, 0x8394 }, // 'U'
  107. { 0xB6, 1, 0x8395 }, // 'KA'
  108. { 0xB9, 1, 0x8396 }, // 'KE'
  109. // Hiragana Table
  110. { 0xA7, 1, 0x829F }, // 'a'
  111. { 0xB1, 1, 0x82A0 }, // 'A'
  112. { 0xA8, 1, 0x82A1 }, // 'i'
  113. { 0xB2, 1, 0x82A2 }, // 'I'
  114. { 0xA9, 1, 0x82A3 }, // 'u'
  115. { 0xB3, 1, 0x82A4 }, // 'U'
  116. { 0xAA, 1, 0x82A5 }, // 'e'
  117. { 0xB4, 1, 0x82A6 }, // 'E'
  118. { 0xAB, 1, 0x82A7 }, // 'o'
  119. { 0xB5, 1, 0x82A8 }, // 'O'
  120. { 0xB6, 2, 0x82A9 }, // 'KA'
  121. { 0xB7, 2, 0x82AB }, // 'KI'
  122. { 0xB8, 2, 0x82AD }, // 'KU'
  123. { 0xB9, 2, 0x82AF }, // 'KE'
  124. { 0xBA, 2, 0x82B1 }, // 'KO'
  125. { 0xBB, 2, 0x82B3 }, // 'SA'
  126. { 0xBC, 2, 0x82B5 }, // 'SI'
  127. { 0xBD, 2, 0x82B7 }, // 'SU'
  128. { 0xBE, 2, 0x82B9 }, // 'SE'
  129. { 0xBF, 2, 0x82BB }, // 'SO'
  130. { 0xC0, 2, 0x82BD }, // 'TA'
  131. { 0xC1, 2, 0x82BF }, // 'CHI'
  132. { 0xAF, 1, 0x82C1 }, // 'tsu'
  133. { 0xC2, 2, 0x82C2 }, // 'TSU'
  134. { 0xC3, 2, 0x82C4 }, // 'TE'
  135. { 0xC4, 2, 0x82C6 }, // 'TO'
  136. { 0xC5, 1, 0x82C8 }, // 'NA'
  137. { 0xC6, 1, 0x82C9 }, // 'NI'
  138. { 0xC7, 1, 0x82CA }, // 'NU'
  139. { 0xC8, 1, 0x82CB }, // 'NE'
  140. { 0xC9, 1, 0x82CC }, // 'NO'
  141. { 0xCA, 3, 0x82CD }, // 'HA'
  142. { 0xCB, 3, 0x82D0 }, // 'HI'
  143. { 0xCC, 3, 0x82D3 }, // 'FU'
  144. { 0xCD, 3, 0x82D6 }, // 'HE'
  145. { 0xCE, 3, 0x82D9 }, // 'HO'
  146. { 0xCF, 1, 0x82DC }, // 'MA'
  147. { 0xD0, 1, 0x82DD }, // 'MI'
  148. { 0xD1, 1, 0x82DE }, // 'MU'
  149. { 0xD2, 1, 0x82DF }, // 'ME'
  150. { 0xD3, 1, 0x82E0 }, // 'MO'
  151. { 0xAC, 1, 0x82E1 }, // 'ya'
  152. { 0xD4, 1, 0x82E2 }, // 'YA'
  153. { 0xAD, 1, 0x82E3 }, // 'yu'
  154. { 0xD5, 1, 0x82E4 }, // 'YU'
  155. { 0xAE, 1, 0x82E5 }, // 'yo'
  156. { 0xD6, 1, 0x82E6 }, // 'YO'
  157. { 0xD7, 1, 0x82E7 }, // 'RA'
  158. { 0xD8, 1, 0x82E8 }, // 'RI'
  159. { 0xD9, 1, 0x82E9 }, // 'RU'
  160. { 0xDA, 1, 0x82EA }, // 'RE'
  161. { 0xDB, 1, 0x82EB }, // 'RO'
  162. { 0xDC, 2, 0x82EC }, // 'WA'
  163. { 0xB2, 1, 0x82EE }, // 'I'
  164. { 0xB4, 1, 0x82EF }, // 'E'
  165. { 0xA6, 1, 0x82F0 }, // 'WO'
  166. { 0xDD, 1, 0x82F1 }, // 'N'
  167. { 0x20, 1, 0x8140 }, // ' '
  168. // { 0xA0, 1, 0x8140 }, // ' '
  169. { 0xA1, 1, 0x8142 }, //
  170. { 0xA2, 1, 0x8175 }, //
  171. { 0xA3, 1, 0x8176 }, //
  172. { 0xA4, 1, 0x8141 }, //
  173. { 0xA5, 1, 0x8145 }, //
  174. { 0xB0, 1, 0x815b }, // '-'
  175. { 0xDE, 1, 0x814a }, //
  176. { 0xDF, 1, 0x814b }, //
  177. { 0, 0, 0 } // == End of Table
  178. };
  179. /***
  180. *unsigned int _mbbtombc(c) - convert mbbvalue to mbcvalue.
  181. *
  182. *Purpose:
  183. * Converts mbbvalue (1-byte) to corresponding mbcvalue code (2-byte).
  184. *
  185. *Entry:
  186. * unsigned int c - mbbvalue character code to be converted.
  187. *
  188. *Exit:
  189. * Returns corresponding mbbvalue (2-byte).
  190. *
  191. *Exceptions:
  192. * Returns c if corresponding 2-byte code does not exist.
  193. *
  194. *******************************************************************************/
  195. unsigned int __cdecl _mbbtombc(
  196. unsigned int c
  197. )
  198. {
  199. int i;
  200. if (__mbcodepage != _KANJI_CP)
  201. return (c);
  202. /* If c is in the ASCII range, then look up the corresponding value
  203. * in the mbbtable. */
  204. if (c >= ASCLOW && c <= ASCHIGH)
  205. return (mbbtable[c-ASCLOW]);
  206. /* Exception for KANJI */
  207. if (c == 0xdc)
  208. return( 0x838f );
  209. /* If c is a Katakana character, lookup in mbctable. */
  210. if (c >= SBLOW && c <= SBHIGH)
  211. {
  212. for(i = 0; mbctable[i].asc != 0; i++)
  213. {
  214. if ( c == (unsigned int)mbctable[i].asc ) {
  215. c = (unsigned int)mbctable[i].mbccode ;
  216. break;
  217. }
  218. }
  219. }
  220. return(c);
  221. }
  222. /***
  223. *unsigned int _mbctombb(c) - convert mbcvalue to mbbvalue.
  224. *
  225. *Purpose:
  226. * Converts mbcvalue (2-byte) to corresponding mbbvalue (1-byte).
  227. *
  228. *Entry:
  229. * unsigned int c - mbcvalue character code to convert.
  230. *
  231. *Exit:
  232. * Returns corresponding mbbvalue (1-byte).
  233. *
  234. *Exceptions:
  235. * Returns c if corresponding 1-byte code does not exist.
  236. *
  237. *******************************************************************************/
  238. unsigned int __cdecl _mbctombb(
  239. unsigned int c
  240. )
  241. {
  242. int i;
  243. int result;
  244. if (__mbcodepage != _KANJI_CP)
  245. return (c);
  246. /* Check to see if c is in the ASCII range. */
  247. for (i = 0; i <= ASCHIGH - ASCLOW; i++)
  248. {
  249. if (c == (unsigned int)mbbtable[i])
  250. return((unsigned int)i + ASCLOW);
  251. }
  252. /* If c is a valid MBCS value, search the mbctable for value. */
  253. if ( c <= MBLIMIT )
  254. {
  255. for (i = 0; mbctable[i].asc ; i++)
  256. {
  257. if ( !(result = (int)c - (int)mbctable[i].mbccode) )
  258. return( (unsigned int)mbctable[i].asc );
  259. else if (((c & 0xff00) == (unsigned int)(mbctable[i].mbccode & 0xff00))
  260. && (result > 0)
  261. && ((result - mbctable[i].synonym) < 0))
  262. return( (unsigned int)mbctable[i].asc );
  263. }
  264. }
  265. return(c);
  266. }
  267. #endif /* _MBCS */