Leaked source code of windows server 2003
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.

653 lines
22 KiB

  1. /*++
  2. Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved
  3. Module Name:
  4. DICT2.C
  5. ++*/
  6. #include "windows.h"
  7. #include "immdev.h"
  8. #include "fakeime.h"
  9. /**********************************************************************/
  10. /* */
  11. /* ConvChar() */
  12. /* */
  13. /* Roman character Kana converting function */
  14. /* */
  15. /**********************************************************************/
  16. WORD PASCAL ConvChar( hIMC, ch1, ch2 )
  17. HIMC hIMC;
  18. WORD ch1, ch2;
  19. {
  20. int num1, num2;
  21. #if defined(FAKEIMEM) || defined(UNICODE)
  22. static WCHAR table[15][5] = {
  23. { 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA }, // A
  24. { 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3 }, // K
  25. { 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD }, // S
  26. { 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8 }, // T
  27. { 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE }, // N
  28. { 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB }, // H
  29. { 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2 }, // M
  30. { 0x30E4, 0x0000, 0x30E6, 0x0000, 0x30E8 }, // Y
  31. { 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED }, // R
  32. { 0x30EF, 0x0000, 0x0000, 0x0000, 0x30F2 }, // W
  33. { 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4 }, // G
  34. { 0x30B6, 0x30B8, 0x30BA, 0x30BC, 0x30BE }, // Z
  35. { 0x30C0, 0x30C2, 0x30C5, 0x30C7, 0x30C9 }, // D
  36. { 0x30D0, 0x30D3, 0x30D6, 0x30D9, 0x30DC }, // B
  37. { 0x30d1, 0x30d4, 0x30d7, 0x30da, 0x30dd } // p
  38. };
  39. #else
  40. static unsigned char table[10][5] = {
  41. { 0xb1, 0xb2, 0xb3, 0xb4, 0xb5 }, // A
  42. { 0xb6, 0xb7, 0xb8, 0xb9, 0xba }, // K
  43. { 0xbb, 0xbc, 0xbd, 0xbe, 0xbf }, // S
  44. { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4 }, // T
  45. { 0xc5, 0xc6, 0xc7, 0xc8, 0xc9 }, // N
  46. { 0xca, 0xcb, 0xcc, 0xcd, 0xce }, // H
  47. { 0xcf, 0xd0, 0xd1, 0xd2, 0xd3 }, // M
  48. { 0xd4, 0x00, 0xd5, 0x00, 0xd6 }, // Y
  49. { 0xd7, 0xd8, 0xd9, 0xda, 0xdb }, // R
  50. { 0xdc, 0x00, 0x00, 0x00, 0xa6 } // W
  51. };
  52. static unsigned char table2[4][5] = {
  53. { 0xb6, 0xb7, 0xb8, 0xb9, 0xba }, // G
  54. { 0xbb, 0xbc, 0xbd, 0xbe, 0xbf }, // Z
  55. { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4 }, // D
  56. { 0xca, 0xcb, 0xcc, 0xcd, 0xce } // B
  57. };
  58. static unsigned char table3[1][5] = {
  59. { 0xca, 0xcb, 0xcc, 0xcd, 0xce } // P
  60. };
  61. #endif
  62. num1 = IsFirst( ch1 );
  63. num2 = IsSecond( ch2 );
  64. #if defined(FAKEIMEM) || defined(UNICODE)
  65. return( (WORD)table[num1][num2-1] );
  66. #else
  67. if( num1 <= 9 )
  68. return( (WORD)table[num1][num2-1] );
  69. else if( num1 <= 13 )
  70. return( ((WORD)table2[num1-10][num2-1]) << 8 | (0x00de) );
  71. else
  72. return( ((WORD)table3[num1-14][num2-1]) << 8 | (0x00df) );
  73. #endif
  74. }
  75. /**********************************************************************/
  76. /* */
  77. /* IsFirst() */
  78. /* */
  79. /* A function which judges the vowels */
  80. /* */
  81. /**********************************************************************/
  82. int PASCAL IsFirst( ch )
  83. register WORD ch;
  84. {
  85. register int i;
  86. #if defined(FAKEIMEM) || defined(UNICODE)
  87. static WCHAR table0[] = MYTEXT("KSTNHMYRWGZDBP");
  88. static WCHAR table1[] = MYTEXT("kstnhmyrwgzdbp");
  89. #else
  90. static TCHAR table0[] = TEXT("KSTNHMYRWGZDBP");
  91. ch = (WORD)(LONG_PTR)AnsiUpper( (LPSTR)(LONG_PTR)ch );
  92. #endif
  93. for( i = 0; table0[i]; i++ ){
  94. #if defined(FAKEIMEM) || defined(UNICODE)
  95. if( table0[i] == (WCHAR)ch )
  96. return( i+1 );
  97. if( table1[i] == (WCHAR)ch )
  98. return( i+1 );
  99. #else
  100. if( table0[i] == (char)ch )
  101. return( i+1 );
  102. #endif
  103. }
  104. return 0;
  105. }
  106. /**********************************************************************/
  107. /* */
  108. /* IsSecond() */
  109. /* */
  110. /* A function which judges the consonants */
  111. /* */
  112. /**********************************************************************/
  113. int PASCAL IsSecond( ch )
  114. register WORD ch;
  115. {
  116. register int i;
  117. #if defined(FAKEIMEM) || defined(UNICODE)
  118. static WCHAR table0[] = MYTEXT("AIUEO");
  119. static WCHAR table1[] = MYTEXT("aiueo");
  120. #else
  121. static TCHAR table0[] = TEXT("AIUEO");
  122. ch = (WORD)(LONG_PTR)AnsiUpper( (LPSTR)(LONG_PTR)ch );
  123. #endif
  124. for( i = 0; table0[i]; i++ ){
  125. #if defined(FAKEIMEM) || defined(UNICODE)
  126. if( table0[i] == (WCHAR)ch )
  127. return( i+1 );
  128. if( table1[i] == (WCHAR)ch )
  129. return( i+1 );
  130. #else
  131. if( table0[i] == (char)ch )
  132. return( i+1 );
  133. #endif
  134. }
  135. return 0;
  136. }
  137. #if defined(FAKEIMEM) || defined(UNICODE)
  138. static WORD table1[] = {
  139. 0x3000, 0xFF01, 0x201D, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0x2019,
  140. 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0x00F7
  141. };
  142. static WORD table2[] = {
  143. 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F
  144. };
  145. static WORD table3[] = {
  146. 0xFF3B, 0xFFE5, 0xFF3D, 0xFF3E, 0xFF3F, 0x2018
  147. };
  148. static WORD table4[] = {
  149. 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0x0000
  150. };
  151. static WORD table5[] = {
  152. 0x3002, 0x300C, 0x300D, 0x3001, 0x30FB, 0x3092, 0x3041,
  153. 0x3043, 0x3045, 0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063,
  154. 0x30FC, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D,
  155. 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D,
  156. 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C,
  157. 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E,
  158. 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089,
  159. 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3093, 0x309B, 0x309C
  160. };
  161. static WORD table6[] = {
  162. 0x3002, 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1,
  163. 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3,
  164. 0x30FC, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD,
  165. 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD,
  166. 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC,
  167. 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE,
  168. 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9,
  169. 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x309B, 0x309C
  170. };
  171. static WORD table7[] = {
  172. 0x306F, 0x3072, 0x3075, 0x3078, 0x307B,
  173. 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x0000
  174. };
  175. static WORD table8[] = {
  176. 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059,
  177. 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306F,
  178. 0x3072, 0x3075, 0x3078, 0x307B,
  179. 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9,
  180. 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CF,
  181. 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x0000
  182. };
  183. #else
  184. static WORD table1[] = { /* 0x20 - 0x2f */
  185. 0x8140, 0x8149, 0x8168, 0x8194, 0x8190, 0x8193, 0x8195, 0x8166,
  186. 0x8169, 0x816a, 0x8196, 0x817b, 0x8143, 0x817c, 0x8144, 0x8180
  187. };
  188. static WORD table2[] = { /* 0x3a - 0x3f */
  189. 0x8146, 0x8147, 0x8183, 0x8181, 0x8184, 0x8148
  190. };
  191. static WORD table3[] = { /* 0x5b - 0x60 */
  192. 0x816d, 0x818f, 0x816e, 0x814f, 0x8151, 0x8165
  193. };
  194. static WORD table4[] = { /* 0x7b - 0x7f */
  195. 0x816f, 0x8162, 0x8170, 0x8160, 0x0000
  196. };
  197. static WORD table5[] = { /* 0xa1 - 0xdf hiragana */
  198. 0x8142, 0x8175, 0x8176, 0x8141, 0x8145, 0x82f0, 0x829f,
  199. 0x82a1, 0x82a3, 0x82a5, 0x82a7, 0x82e1, 0x82e3, 0x82e5, 0x82c1,
  200. 0x815b, 0x82a0, 0x82a2, 0x82a4, 0x82a6, 0x82a8, 0x82a9, 0x82ab,
  201. 0x82ad, 0x82af, 0x82b1, 0x82b3, 0x82b5, 0x82b7, 0x82b9, 0x82bb,
  202. 0x82bd, 0x82bf, 0x82c2, 0x82c4, 0x82c6, 0x82c8, 0x82c9, 0x82ca,
  203. 0x82cb, 0x82cc, 0x82cd, 0x82d0, 0x82d3, 0x82d6, 0x82d9, 0x82dc,
  204. 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e2, 0x82e4, 0x82e6, 0x82e7,
  205. 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ed, 0x82f1, 0x814a, 0x814b
  206. };
  207. static WORD table6[] = { /* 0xa1 - 0xdf katakana */
  208. 0x8142, 0x8175, 0x8176, 0x8141, 0x8145, 0x82f0, 0x8340,
  209. 0x8342, 0x8344, 0x8346, 0x8348, 0x8383, 0x8385, 0x8387, 0x8362,
  210. 0x815b, 0x8341, 0x8343, 0x8345, 0x8347, 0x8349, 0x834a, 0x834c,
  211. 0x834e, 0x8350, 0x8352, 0x8354, 0x8356, 0x8358, 0x835a, 0x835c,
  212. 0x835e, 0x8360, 0x8363, 0x8365, 0x8367, 0x8369, 0x836a, 0x836b,
  213. 0x836c, 0x836d, 0x836e, 0x8371, 0x8374, 0x8377, 0x837a, 0x837d,
  214. 0x837e, 0x8380, 0x8381, 0x8382, 0x8384, 0x8386, 0x8388, 0x8389,
  215. 0x838a, 0x838b, 0x838c, 0x838d, 0x838f, 0x8393, 0x814a, 0x814b
  216. };
  217. static WORD table7[] = { /* sonant char part 1 */
  218. 0x82cd, 0x82d0, 0x82d3, 0x82d6, 0x82d9,
  219. 0x836e, 0x8371, 0x8374, 0x8377, 0x837a, 0x0000
  220. };
  221. static WORD table8[] = { /* sonant char part 2 */
  222. 0x82a9, 0x82ab, 0x82ad, 0x82af, 0x82b1, 0x82b3, 0x82b5, 0x82b7,
  223. 0x82b9, 0x82bb, 0x82bd, 0x82bf, 0x82c2, 0x82c4, 0x82c6, 0x82cd,
  224. 0x82d0, 0x82d3, 0x82d6, 0x82d9,
  225. 0x834a, 0x834c, 0x834e, 0x8350, 0x8352, 0x8354, 0x8356, 0x8358,
  226. 0x835a, 0x835c, 0x835e, 0x8360, 0x8363, 0x8365, 0x8367, 0x836e,
  227. 0x8371, 0x8374, 0x8377, 0x837a, 0x0000
  228. };
  229. #endif
  230. /**********************************************************************/
  231. /* */
  232. /* HanToZen( code, flag ) */
  233. /* */
  234. /* A function which converts half size character to full size */
  235. /* */
  236. /* code */
  237. /* Specify half size character code */
  238. /* */
  239. /* flag */
  240. /* When convert to full size, specify if kana should be converted to */
  241. /* hiragana or katakana */
  242. /* 0 convert to katakana */
  243. /* 1 convert to hiragana */
  244. /* */
  245. /* return */
  246. /* Return full size character code */
  247. /* */
  248. /**********************************************************************/
  249. #if defined(FAKEIMEM) || defined(UNICODE)
  250. WORD PASCAL HanToZen( code, KatakanaLetter,fdwConversion )
  251. register WORD code;
  252. register WORD KatakanaLetter;
  253. DWORD fdwConversion;
  254. #else
  255. WORD PASCAL HanToZen( code, fdwConversion )
  256. register WORD code;
  257. DWORD fdwConversion;
  258. #endif
  259. {
  260. BOOL flag;
  261. flag = !(fdwConversion & IME_CMODE_KATAKANA);
  262. #if defined(FAKEIMEM) || defined(UNICODE)
  263. if (KatakanaLetter) {
  264. WORD code2, code3;
  265. code2 = HanToZen( KatakanaLetter, 0, fdwConversion );
  266. code3 = code;
  267. if( code3 == 0xFF9E )
  268. code = ConvTenten( code2 );
  269. else if( code3 == 0xFF9F )
  270. code = ConvMaru( code2 );
  271. return( code );
  272. } else {
  273. if( code >= 0x30 && 0x39 >= code )
  274. return( code - 0x30 + 0xFF10 );
  275. if( code >= 0x41 && 0x5a >= code )
  276. return( code - 0x41 + 0xFF21 );
  277. if( code >= 0x61 && 0x7a >= code )
  278. return( code - 0x61 + 0xFF41 );
  279. if( code >= 0x20 && 0x40 >= code )
  280. return( table1[code-0x20] );
  281. if( code >= 0x3a && 0x3f >= code )
  282. return( table2[code-0x3a] );
  283. if( code >= 0x5b && 0x60 >= code )
  284. return( table3[code-0x5b] );
  285. if( code >= 0x7b && 0x7e >= code )
  286. return( table4[code-0x7b] );
  287. if( code >= 0xFF61 && 0xFF9F >= code )
  288. if( flag )
  289. return( table5[code-0xFF61] );
  290. else
  291. return( table6[code-0xFF61] );
  292. return( code );
  293. }
  294. #else
  295. if( HIBYTE( code ) ){
  296. WORD code2, code3;
  297. code2 = HanToZen( HIBYTE(code), fdwConversion );
  298. code3 = LOBYTE( code );
  299. if( code3 == (0x00FF & '\xDE') )
  300. code = ConvTenten( code2 );
  301. else if( code3 == (0x00FF & '\xDF') )
  302. code = ConvMaru( code2 );
  303. return( code );
  304. } else {
  305. if( code >= 0x30 && 0x39 >= code )
  306. return( code - 0x30 + 0x824f );
  307. if( code >= 0x41 && 0x5a >= code )
  308. return( code - 0x41 + 0x8260 );
  309. if( code >= 0x61 && 0x7a >= code )
  310. return( code - 0x61 + 0x8281 );
  311. if( code >= 0x20 && 0x40 >= code )
  312. return( table1[code-0x20] );
  313. if( code >= 0x3a && 0x3f >= code )
  314. return( table2[code-0x3a] );
  315. if( code >= 0x5b && 0x60 >= code )
  316. return( table3[code-0x5b] );
  317. if( code >= 0x7b && 0x7e >= code )
  318. return( table4[code-0x7b] );
  319. if( code >= 0x0a1 && 0x0df >= code )
  320. if( flag )
  321. return( table5[code-0x0a1] );
  322. else
  323. return( table6[code-0x0a1] );
  324. return( code );
  325. }
  326. #endif
  327. }
  328. /**********************************************************************/
  329. /* */
  330. /* ZenToHan( code ) */
  331. /* */
  332. /* A function which converts full size character to half size */
  333. /* */
  334. /* code */
  335. /* Specify full size character code */
  336. /* */
  337. /* return */
  338. /* Return half size character code */
  339. /* */
  340. /**********************************************************************/
  341. WORD PASCAL ZenToHan( code )
  342. WORD code;
  343. {
  344. int i;
  345. #if defined(FAKEIMEM) || defined(UNICODE)
  346. if( code >= 0xFF10 && code <= 0xFF19 )
  347. return( code - 0xFF10 + 0x30 );
  348. if( code >= 0xFF21 && code <= 0xFF3A )
  349. return( code - 0xFF21 + 0x41 );
  350. if( code >= 0xFF41 && code <= 0xFF5A )
  351. return( code - 0xFF41 + 0x61 );
  352. for( i = 0; i < 16; i++ )
  353. if( code == table1[i] )
  354. return( 0x20 + i );
  355. for( i = 0; i < 6; i++ )
  356. if( code == table2[i] )
  357. return( 0x3a + i );
  358. for( i = 0; i < 6; i++ )
  359. if( code == table3[i] )
  360. return( 0x5b + i );
  361. for( i = 0; i < 5; i++ )
  362. if( code == table4[i] )
  363. return( 0x7b + i );
  364. for( i = 0; i < 63; i++ ){
  365. if( code == table5[i] )
  366. return( 0xFF61 + i );
  367. if( code == table6[i] )
  368. return( 0xFF61 + i );
  369. }
  370. #else
  371. if( code >= 0x824f && code <= 0x8258 )
  372. return( code - 0x824f + 0x30 );
  373. if( code >= 0x8260 && code <= 0x8279 )
  374. return( code - 0x8260 + 0x41 );
  375. if( code >= 0x8281 && code <= 0x829a )
  376. return( code - 0x8281 + 0x61 );
  377. for( i = 0; i < 16; i++ )
  378. if( code == table1[i] )
  379. return( 0x20 + i );
  380. for( i = 0; i < 6; i++ )
  381. if( code == table2[i] )
  382. return( 0x3a + i );
  383. for( i = 0; i < 6; i++ )
  384. if( code == table3[i] )
  385. return( 0x5b + i );
  386. for( i = 0; i < 5; i++ )
  387. if( code == table4[i] )
  388. return( 0x7b + i );
  389. for( i = 0; i < 63; i++ ){
  390. if( code == table5[i] )
  391. return( 0xa1 + i );
  392. if( code == table6[i] )
  393. return( 0xa1 + i );
  394. }
  395. #endif
  396. return 0;
  397. }
  398. BOOL PASCAL IsTenten( code )
  399. WORD code;
  400. {
  401. register int i;
  402. for( i = 0; table8[i]; i++ )
  403. if( table8[i] == code )
  404. return( TRUE );
  405. return( FALSE );
  406. }
  407. WORD PASCAL ConvTenten( code )
  408. WORD code;
  409. {
  410. if( IsTenten( code ) )
  411. return( code + 1 );
  412. return 0;
  413. }
  414. BOOL PASCAL IsMaru( code )
  415. WORD code;
  416. {
  417. register int i;
  418. for( i = 0; table7[i]; i++ )
  419. if( table7[i] == code )
  420. return( TRUE );
  421. return( FALSE );
  422. }
  423. WORD PASCAL ConvMaru( code )
  424. WORD code;
  425. {
  426. if( IsMaru( code ) )
  427. return( code + 2 );
  428. return 0;
  429. }
  430. WORD PASCAL HiraToKata(WORD code)
  431. {
  432. register int i;
  433. for( i = 0; i < 63; i++ ){
  434. if( code == table5[i] )
  435. return table6[i];
  436. }
  437. for( i = 0; i < 63; i++ )
  438. {
  439. if( code-1 == table5[i] )
  440. if (IsTenten(table5[i]))
  441. return table6[i] + 1;
  442. if( code-2 == table5[i] )
  443. if (IsMaru(table5[i]))
  444. return table6[i] + 2;
  445. }
  446. return code;
  447. }
  448. WORD PASCAL KataToHira(WORD code)
  449. {
  450. register int i;
  451. for( i = 0; i < 63; i++ ){
  452. if( code == table6[i] )
  453. return table5[i];
  454. }
  455. for( i = 0; i < 63; i++ )
  456. {
  457. if( code-1 == table6[i] )
  458. if (IsTenten(table6[i]))
  459. return table5[i] + 1;
  460. if( code-2 == table6[i] )
  461. if (IsMaru(table6[i]))
  462. return table5[i] + 2;
  463. }
  464. return code;
  465. }
  466. #if defined (FAKEIMEM) || defined(UNICODE)
  467. BOOL OneCharZenToHan(WCHAR code,WCHAR* pKatakanaLetter,WCHAR* pSound)
  468. {
  469. WCHAR NewCode;
  470. *pKatakanaLetter = 0;
  471. *pSound = 0;
  472. NewCode = (MYCHAR)ZenToHan(code);
  473. if (! NewCode)
  474. {
  475. if (IsTenten((WORD)(code-1)))
  476. {
  477. *pKatakanaLetter = (MYCHAR)ZenToHan((WORD)(code-1));
  478. *pSound = (MYCHAR)0xFF9E;
  479. return TRUE;
  480. }
  481. else if (IsMaru((WORD)(code-2)))
  482. {
  483. *pKatakanaLetter = (MYCHAR)ZenToHan((WORD)(code-2));
  484. *pSound = (MYCHAR)0xFF9F;
  485. return TRUE;
  486. }
  487. else{
  488. return FALSE;
  489. }
  490. }
  491. else
  492. {
  493. *pKatakanaLetter = NewCode;
  494. return TRUE;
  495. }
  496. }
  497. #endif
  498. void PASCAL lZenToHan(LPMYSTR lpDst,LPMYSTR lpSrc)
  499. {
  500. WORD code;
  501. #if defined(FAKEIMEM) || defined(UNICODE)
  502. while(*lpSrc)
  503. {
  504. code = *lpSrc;
  505. *lpDst = (MYCHAR)ZenToHan(code);
  506. if (!*lpDst)
  507. {
  508. if (IsTenten((WORD)(code-1)))
  509. {
  510. *lpDst++ = (MYCHAR)ZenToHan((WORD)(code-1));
  511. *lpDst++ = (MYCHAR)0xFF9E;
  512. }
  513. else if (IsMaru((WORD)(code-2)))
  514. {
  515. *lpDst++ = (MYCHAR)ZenToHan((WORD)(code-2));
  516. *lpDst++ = (MYCHAR)0xFF9F;
  517. }
  518. else {
  519. //
  520. // this case means it is not Japanese char
  521. //
  522. *lpDst++ = *lpSrc;
  523. }
  524. }
  525. else
  526. lpDst++;
  527. lpSrc++;
  528. }
  529. *lpDst = MYTEXT('\0');
  530. #else
  531. while(*lpSrc)
  532. {
  533. if (IsDBCSLeadByte(*lpSrc))
  534. {
  535. code = MAKEWORD( *(lpSrc+1), *lpSrc );
  536. *lpDst = (char)ZenToHan(code);
  537. if (!*lpDst)
  538. {
  539. if (IsTenten((WORD)(code-1)))
  540. {
  541. *lpDst++ = (TCHAR)ZenToHan((WORD)(code-1));
  542. *lpDst++ = (TCHAR)0xde;
  543. }
  544. else if (IsMaru((WORD)(code-2)))
  545. {
  546. *lpDst++ = (TCHAR)ZenToHan((WORD)(code-2));
  547. *lpDst++ = (TCHAR)0xdf;
  548. }
  549. }
  550. else
  551. lpDst++;
  552. lpSrc += 2;
  553. }
  554. else
  555. *lpDst++ = *lpSrc++;
  556. }
  557. *lpDst = MYTEXT('\0');
  558. #endif
  559. }
  560. void PASCAL lHanToZen(LPMYSTR lpDst,LPMYSTR lpSrc,DWORD fdwConversion)
  561. {
  562. WORD code;
  563. WORD code0;
  564. WORD code1;
  565. #if defined(FAKEIMEM) || defined(UNICODE)
  566. while(*lpSrc)
  567. {
  568. WORD KatakanaLetter;
  569. KatakanaLetter = 0;
  570. code0 = (WORD)*lpSrc;
  571. code1 = (WORD)*(lpSrc+1);
  572. lpSrc++;
  573. if ((code1 == 0xFF9E) || (code1 == 0xFF9F)) {
  574. KatakanaLetter = code0;
  575. code0 = code1;
  576. lpSrc++;
  577. }
  578. code = HanToZen (code0,KatakanaLetter,fdwConversion);
  579. *lpDst++ = code;
  580. }
  581. *lpDst = MYTEXT('\0');
  582. #else
  583. while (*lpSrc)
  584. {
  585. code0 = (WORD)*lpSrc;
  586. code1 = (WORD)*(lpSrc+1);
  587. lpSrc++;
  588. if (( code1 == (0x00FF & '\xDE') )
  589. || ( code1 == (0x00FF & '\xDF') ))
  590. {
  591. code0 = MAKEWORD((BYTE)code0,(BYTE)code1);
  592. lpSrc++;
  593. }
  594. code = HanToZen (code0,fdwConversion);
  595. *lpDst++ = HIBYTE(code);
  596. *lpDst++ = LOBYTE(code);
  597. }
  598. *lpDst = MYTEXT('\0');
  599. #endif
  600. }