HZutil.c
上传用户:shdz666
上传日期:2007-01-03
资源大小:566k
文件大小:25k
源码类别:

输入法编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 1999.4  Li ZhenChun
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License as published by
  6.  * the Free Software Foundation; either version 2 of the License; or
  7.  * (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that is will be useful, but
  10.  * WITHOUT ANY WARRANTY; without even the implied warranty of 
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12.  * General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 675 Mass Ave, Cambridge, M A 02139, USA.
  17.  *
  18.  * Author: Li ZhenChun  email: zhchli@163.net or zhchli@126.com
  19.  * 
  20.  */
  21. #include "freepy.h"
  22. WORD ParsePY(LPTSTR lpPY, LPTSTR lpTranBuf, WORD wMaxPYLen)
  23. {
  24. LPPINYIN lpPYTab = (LPPINYIN)aPYTab;
  25. int i,j;
  26. WORD wHead,wPYLen,wOffset=0,wCount=1,wTotal=0;
  27. int flag=0,eqflag=0,slflag=0,yhflag=0,yunflag=0,rflag=0;
  28. TCHAR szStr[10],szTmpStr[10],szSlStr[3][3];
  29. TCHAR szYun[7];
  30. int nTemp;
  31. LPTSTR pDest;
  32. wPYLen = _tcslen(lpPY);
  33. if( wPYLen < 1 || wPYLen > MAX_PHRASE_LEN*wMaxPYLen ) return 0;
  34. if(wPYLen == 1){
  35. if(*lpPY >= _T('a') && *lpPY <= _T('z')){
  36. _tcscpy(lpTranBuf,lpPY);
  37. return 1;
  38. }
  39. else return 0;
  40. }  
  41. szYun[0] = _T('a');
  42. szYun[1] = _T('o');
  43. szYun[2] = _T('e');
  44. szYun[3] = _T('i');
  45. szYun[4] = _T('u');
  46. szYun[5] = _T('v');
  47. szYun[6] = _T('');
  48. szSlStr[0][0] = _T('c');
  49. szSlStr[1][0] = _T('s');
  50. szSlStr[2][0] = _T('z');
  51. for(i=0;i<3;i++){
  52. szSlStr[i][1] = _T('h');
  53. szSlStr[i][2] = _T('');
  54. }
  55. while(1){
  56. wHead = *(lpPY+wOffset) - _T('a');
  57. if((wHead < 0 || wHead > 25) && *(lpPY+wOffset) != _T(''')){
  58. return 0;
  59. }
  60. if(*(lpPY+wOffset) == _T(''')){
  61. if(wTotal > 0 && *(lpTranBuf + (wTotal-1)*wMaxPYLen) >= _T('a')
  62. && *(lpTranBuf + (wTotal-1)*wMaxPYLen) <= _T('z') ){
  63. _tcscpy(lpTranBuf+((wTotal)++)*wMaxPYLen,_T("'"));
  64. }
  65. wOffset++;
  66. if(wOffset == wPYLen){
  67. return wTotal;
  68. }
  69. continue;
  70. }
  71. wCount=1;
  72. while((wOffset+wCount) <= wPYLen){
  73. _tcsncpy(szStr,lpPY+wOffset,wCount);
  74. szStr[wCount] = _T('');
  75. if(wCount == 1) flag=1;
  76. else{
  77. flag=0;
  78. for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
  79. if(_tcsstr( (lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szStr)!=NULL){
  80. flag=1;
  81. break;
  82. }
  83. }
  84. }
  85. if( (wOffset+wCount) == wPYLen ){
  86. if(flag) {
  87. _tcscpy(lpTranBuf+((wTotal)++)*wMaxPYLen,szStr);
  88. return wTotal;
  89. }
  90. else {
  91. if(wCount==2){
  92. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-1);
  93. *(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-1)=_T('');
  94. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr+wCount-1,1);
  95. *(lpTranBuf+((wTotal)++)*wMaxPYLen+1)=_T('');
  96. return wTotal;
  97. }
  98. nTemp = szStr[wCount-1];
  99. _tcsncpy(szTmpStr,szStr,wCount-1);
  100. szTmpStr[wCount-1]='';
  101. eqflag=0;
  102. for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
  103. if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
  104. eqflag=1;
  105. break;
  106. }
  107. }
  108. if(eqflag){
  109. yunflag = 0;
  110. if( _tcsrchr(szYun,szStr[wCount-2]) == NULL && _tcsrchr(szYun,nTemp) != NULL) {
  111. szTmpStr[_tcslen(szTmpStr)-1] = _T('');
  112. for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
  113. if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
  114. goto my_next1;
  115. }
  116. }
  117. }
  118. goto my_next2;
  119. my_next1:
  120. _tcscpy(szTmpStr,szStr + _tcslen(szStr) -2);
  121. for(i=0;(lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->wKey;i++){
  122. if( !_tcscmp((lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
  123. yunflag = 1;
  124. break;
  125. }
  126. }
  127. my_next2:
  128. if(yunflag){
  129. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-2);
  130. *(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-2)=_T('');
  131. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr+wCount-2,2);
  132. *(lpTranBuf+((wTotal)++)*wMaxPYLen+2)=_T('');
  133. }
  134. else {
  135. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-1);
  136. *(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-1)=_T('');
  137. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr+wCount-1,1);
  138. *(lpTranBuf+((wTotal)++)*wMaxPYLen+1)=_T('');
  139. }
  140. return wTotal;
  141. }    
  142. else{
  143. for(i=wCount-2 ;i;i--){
  144. _tcsncpy(szTmpStr,szStr,i);
  145. szTmpStr[i]=_T('');
  146. rflag = 0;
  147. for(j=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+j)->wKey;j++){
  148. if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+j)->szPY,szTmpStr) ){
  149. rflag = 1;
  150. break;
  151. }
  152. }
  153. if(rflag) break;
  154. }
  155. if(rflag){
  156. wOffset += i;
  157. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,i);
  158. *(lpTranBuf+((wTotal)++)*wMaxPYLen+i)=_T('');
  159. break;
  160. }
  161. _tcsncpy(szTmpStr,szStr,2);
  162. szTmpStr[2]=_T('');
  163. slflag=0;
  164. for(i=0;i<3;i++){
  165. if( !_tcscmp(szTmpStr,szSlStr[i]) ){
  166. slflag=1;
  167. break;
  168. }
  169. }
  170. if(slflag){
  171. wOffset += 2;
  172. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,2);
  173. *(lpTranBuf+((wTotal)++)*wMaxPYLen+2)=_T('');
  174. break;
  175. }
  176. else{
  177. wOffset++;
  178. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,1);
  179. *(lpTranBuf+((wTotal)++)*wMaxPYLen+1)=_T('');
  180. break;
  181. }
  182. }
  183. }
  184. }
  185. if(flag) wCount++;
  186. else {
  187. if(wCount==2){
  188. wOffset++;
  189. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-1);
  190. *(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-1)=_T('');
  191. break;
  192. }
  193. nTemp = szStr[wCount-1];
  194. _tcsncpy(szTmpStr,szStr,wCount-1);
  195. szTmpStr[wCount-1]='';
  196. eqflag=0;
  197. for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
  198. if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
  199. eqflag=1;
  200. break;
  201. }
  202. }
  203. if(eqflag){
  204. yunflag = 0;
  205. if( _tcsrchr(szYun,szStr[wCount-2]) == NULL && _tcsrchr(szYun,nTemp) != NULL) {
  206. szTmpStr[_tcslen(szTmpStr)-1] = _T('');
  207. for(i=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+i)->wKey;i++){
  208. if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+i)->szPY,szTmpStr) ){
  209. goto my_next3;
  210. }
  211. }
  212. }
  213. goto my_next4;
  214. my_next3:
  215. _tcscpy(szTmpStr,szStr + _tcslen(szStr) -2);
  216. for(i=0;(lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->wKey;i++){
  217. if( (pDest = _tcsstr((lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->szPY,szTmpStr)) != NULL ){
  218. if(pDest == (lpPYTab+(szTmpStr[0] - _T('a'))*MAX_EACH_PY_NUM+i)->szPY) {
  219. yunflag = 1;
  220. break;
  221. }
  222. }
  223. }
  224. my_next4:
  225. if(yunflag) {
  226. wOffset += wCount-2;
  227. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-2);
  228. *(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-2)=_T('');
  229. }
  230. else {
  231. wOffset += wCount-1;
  232. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,wCount-1);
  233. *(lpTranBuf+((wTotal)++)*wMaxPYLen+wCount-1)=_T('');
  234. }
  235. }
  236. else{
  237. for(i=wCount-2 ;i;i--){
  238. _tcsncpy(szTmpStr,szStr,i);
  239. szTmpStr[i]=_T('');
  240. rflag = 0;
  241. for(j=0;(lpPYTab+wHead*MAX_EACH_PY_NUM+j)->wKey;j++){
  242. if( !_tcscmp((lpPYTab+wHead*MAX_EACH_PY_NUM+j)->szPY,szTmpStr) ){
  243. rflag = 1;
  244. break;
  245. }
  246. }
  247. if(rflag) break;
  248. }
  249. if(rflag){
  250. wOffset += i;
  251. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,i);
  252. *(lpTranBuf+((wTotal)++)*wMaxPYLen+i)=_T('');
  253. break;
  254. }
  255. _tcsncpy(szTmpStr,szStr,2);
  256. szTmpStr[2]=_T('');
  257. slflag=0;
  258. for(i=0;i<3;i++){
  259. if( !_tcscmp(szTmpStr,szSlStr[i]) ){
  260. slflag=1;
  261. break;
  262. }
  263. }
  264. if(slflag){
  265. wOffset += 2;
  266. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,2);
  267. *(lpTranBuf+((wTotal)++)*wMaxPYLen+2)=_T('');
  268. }
  269. else{
  270. wOffset++;
  271. _tcsncpy(lpTranBuf+wTotal*wMaxPYLen,szStr,1);
  272. *(lpTranBuf+((wTotal)++)*wMaxPYLen+1)=_T('');
  273. }
  274. }
  275. break;
  276. }
  277. }
  278. }
  279. }
  280. void SortPhrase(LPPHRASE lpPh, WORD wLen)
  281. {
  282. int i,j;
  283. PHRASE TempPh;
  284. for(i=0;i<wLen;i++){
  285. for(j=i;j<wLen;j++){
  286. if( (lpPh+i)->lpHZPH->dwAttrib < (lpPh+j)->lpHZPH->dwAttrib){
  287. TempPh = *(lpPh+i);
  288. *(lpPh+i)=*(lpPh+j);
  289. *(lpPh+j)=TempPh;
  290. }
  291. }
  292. }
  293. }
  294. WORD CreatePYKey(LPTSTR lpPYArray,WORD wMaxPYLen,WORD wPYArrayLen,WORD awPYArrayKey[][2*MAX_EACH_PY_NUM+1])
  295. {
  296. LPPINYIN lpPYTab = (LPPINYIN)aPYTab;
  297. LPPINYIN lpPYTemp;
  298. TCHAR szSlStr[3][3],szPY[4][MAX_PY_LEN],szBStr[3][4],szTemp[4];
  299. WORD awSlKey[3][MAX_EACH_PY_NUM],awNmKey[3][MAX_EACH_PY_NUM];
  300. WORD wHead,wCount,wKeyLen,wTemp,wTemp1,wTempKey;
  301. WORD wSlPos,wFlag;
  302. TCHAR cTempChar;
  303. LPTSTR lpDest;
  304. int i,j,k;
  305. szBStr[0][0] = _T('a');
  306. szBStr[1][0] = _T('e');
  307. szBStr[2][0] = _T('i');
  308. for(i=0;i<3;i++){
  309. szBStr[i][1] = _T('n');
  310. szBStr[i][2] = _T('g');
  311. szBStr[i][3] = _T('');
  312. }
  313. szSlStr[0][0] = _T('c');
  314. szSlStr[1][0] = _T('s');
  315. szSlStr[2][0] = _T('z');
  316. for(i=0;i<3;i++){
  317. szSlStr[i][1] = _T('h');
  318. szSlStr[i][2] = _T('');
  319. }
  320. for(i=0;i<3;i++){
  321. wTemp = 0;
  322. wTemp1 = 0;
  323. for(j=0;(lpPYTemp=(lpPYTab+ (szSlStr[i][0] - _T('a'))*MAX_EACH_PY_NUM+j))->wKey;j++){
  324. if( _tcsstr(lpPYTemp->szPY,szSlStr[i] ) != NULL )
  325. awSlKey[i][wTemp++] = lpPYTemp->wKey;
  326. else
  327. awNmKey[i][wTemp1++] = lpPYTemp->wKey;
  328. }
  329. awSlKey[i][wTemp] = 0;
  330. awNmKey[i][wTemp1] = 0;
  331. }
  332. wCount = 0;
  333. for(i=0;i<wPYArrayLen;i++){
  334. if((cTempChar = *(lpPYArray + i*wMaxPYLen))== _T('i') || 
  335. cTempChar == _T('u') || cTempChar == _T('v') ) 
  336. continue;
  337. _tcscpy(szPY[0],lpPYArray + i*wMaxPYLen);
  338. if(szPY[0][0] < _T('a') || szPY[0][0] > _T('z') ) continue;
  339. szPY[1][0] = _T('');
  340. szPY[2][0] = _T('');
  341. szPY[3][0] = _T('');
  342. if( wConversionSet & CONVERSION_SET_FUZZYC ) {
  343. if( (cTempChar = szPY[0][0]) == _T('c') ||
  344. cTempChar == _T('s') || cTempChar == _T('z') ) {
  345. if( szPY[0][1] == _T('h') ) {
  346. szPY[1][0] = cTempChar;
  347. _tcscpy(szPY[1]+1,szPY[0] + 2);
  348. }
  349. else{
  350. szPY[1][0] = cTempChar;
  351. szPY[1][1] = _T('h');
  352. _tcscpy(szPY[1]+2,szPY[0] + 1);
  353. }
  354. }
  355. }
  356. if( wConversionSet & CONVERSION_SET_FUZZYN ) {
  357. if( szPY[0][0] == _T('n') ) {
  358. szPY[1][0] = _T('l');
  359. _tcscpy(szPY[1]+1,szPY[0] + 1);
  360. }
  361. else if(szPY[0][0] == _T('l') ) {
  362. szPY[1][0] = _T('n');
  363. _tcscpy(szPY[1]+1,szPY[0] + 1);
  364. }
  365. }
  366. if( wConversionSet & CONVERSION_SET_FUZZYH ) {
  367. if( szPY[0][0] == _T('h') ) {
  368. szPY[1][0] = _T('f');
  369. _tcscpy(szPY[1]+1,szPY[0] + 1);
  370. }
  371. else if(szPY[0][0] == _T('f') ) {
  372. szPY[1][0] = _T('h');
  373. _tcscpy(szPY[1]+1,szPY[0] + 1);
  374. }
  375. }
  376. if( wConversionSet & CONVERSION_SET_FUZZYB ) {
  377. for(i=0;i<2;i++){
  378. wFlag = 0;
  379. for(j=0;j<3;j++){
  380. if( (lpDest = _tcsstr(szPY[i],szBStr[j])) != NULL){
  381. if( (szPY[i] + _tcslen(szPY[i]) - _tcslen(szBStr[j])) == lpDest) {
  382. wFlag = 1;
  383. break;
  384. }
  385. }
  386. }
  387. if(wFlag){
  388. _tcscpy(szPY[i+2],szPY[i]);
  389. szPY[i+2][_tcslen(szPY[i+2])-1] = _T('');
  390. }
  391. }
  392. for(i=0;i<2;i++){
  393. wFlag = 0;
  394. for(j=0;j<3;j++){
  395. _tcscpy(szTemp,szBStr[j]);
  396. szTemp[_tcslen(szTemp)-1] = _T('');
  397. if( (lpDest = _tcsstr(szPY[i],szTemp)) != NULL){
  398. if( (szPY[i] + _tcslen(szPY[i]) - _tcslen(szTemp)) == lpDest) {
  399. wFlag = 1;
  400. break;
  401. }
  402. }
  403. }
  404. if(wFlag){
  405. _tcscpy(szPY[i+2],szPY[i]);
  406. szPY[i+2][_tcslen(szPY[i+2])+1] = _T('');
  407. szPY[i+2][_tcslen(szPY[i+2])] = _T('g');
  408. }
  409. }
  410. }
  411. wKeyLen = 0;
  412. for(k = 0;k < 4;k++) {
  413. wHead = (WORD)(szPY[k][0] - _T('a'));
  414. if( _tcslen(szPY[k]) == 0 ) continue;
  415. if( _tcslen(szPY[k]) == 1){
  416. if( (cTempChar = szPY[k][0]) == _T('c') ||
  417. cTempChar == _T('s') || cTempChar == _T('z') ) {
  418. if( cTempChar == _T('c') ) wTemp = 0;
  419. else if( cTempChar == _T('s') ) wTemp = 1;
  420. else if( cTempChar == _T('z') ) wTemp = 2;
  421. else wTemp = 0;
  422. for(j=0;awNmKey[wTemp][j];j++){
  423. awPYArrayKey[wCount][wKeyLen++] = awNmKey[wTemp][j];
  424. }
  425. }
  426. else {
  427. for(j=0;wTempKey=((lpPYTab + wHead*MAX_EACH_PY_NUM +j)->wKey);j++)
  428. awPYArrayKey[wCount][wKeyLen++]=wTempKey;
  429. }
  430. }
  431. else{
  432. wFlag = 0;
  433. for(j=0;j<3;j++){
  434. if( !_tcscmp(szPY[k],szSlStr[j]) ){
  435. wFlag=1;
  436. wSlPos=j;
  437. break;
  438. }
  439. }
  440. if(wFlag){
  441. for(j=0;awSlKey[wSlPos][j];j++){
  442. awPYArrayKey[wCount][wKeyLen++] = awSlKey[wSlPos][j];
  443. }
  444. }
  445. else {
  446. for(j=0;(lpPYTab + wHead*MAX_EACH_PY_NUM+j)->wKey;j++){
  447. if( !_tcscmp(szPY[k],(lpPYTab + wHead*MAX_EACH_PY_NUM +j)->szPY)){
  448. awPYArrayKey[wCount][wKeyLen++] = (lpPYTab + wHead*MAX_EACH_PY_NUM+j)->wKey;
  449. break;
  450. }
  451. }
  452. }
  453. }
  454. }
  455. awPYArrayKey[wCount][wKeyLen]=0;
  456. wCount++;
  457. }
  458. return wCount;
  459. }
  460. void ConvertPY(LPTSTR lpPYArray,WORD wMaxPYLen,WORD wPYArrayLen,LPFREEPYCAND lpPYCand)
  461. {
  462. LPHANZI lpHanZi = lpPYCand->aHanZi;
  463. LPPHRASE lpPhrase = lpPYCand->aPhrase;
  464. WORD awPYArrayKey[MAX_PHRASE_LEN][2*MAX_EACH_PY_NUM+1];
  465. BYTE abKey[MAX_PHRASE_LEN+1];
  466. BYTE abKeyArray[2][MAX_SELECT_PH*5][MAX_PHRASE_LEN+1];
  467. WORD awKeyArrayLen[2];
  468. LPKEYPH alpKeyPh[MAX_SELECT_PH];
  469. LPKEYPH alpTempKeyPh[2];
  470. PHRASE aTempPh[MAX_SELECT_PH];
  471. WORD wResult,wTotal,wHZLen;
  472. WORD wCount,wTemp;
  473. int i,j,k;
  474. WORD wPhLen,wTotalPh=0;
  475. if(wPYArrayLen < 1){
  476. lpPYCand->wPhraseNum = 0;
  477. lpPYCand->wHZNum = 0;
  478. return;
  479. }
  480. wCount = CreatePYKey(lpPYArray,wMaxPYLen,wPYArrayLen,awPYArrayKey);
  481. awKeyArrayLen[0]=0;
  482. awKeyArrayLen[1]=0;
  483. wHZLen = 0;
  484. wTotal = 0;
  485. for(k=0;awPYArrayKey[0][k];k++){
  486. wHZLen += _tcslen(*(alpHZTab+(awPYArrayKey[0][k]-1)));
  487. lpHanZi->lpHZ = *(alpHZTab+(awPYArrayKey[0][k]-1));
  488. lpHanZi->wKey = awPYArrayKey[0][k];
  489. #ifdef _UNICODE
  490. (lpHanZi++)->wLen = wHZLen;
  491. #else
  492. (lpHanZi++)->wLen = wHZLen/2;
  493. #endif
  494. abKey[1] = (BYTE)( awPYArrayKey[0][k] & 0xff);
  495. abKey[0] = 0;
  496. abKey[0] |= (BYTE)(( awPYArrayKey[0][k] & 0x0100) >> 8);
  497. wResult=QueryPhrase(abKey,1,alpTempKeyPh);
  498. if( alpTempKeyPh[0] != NULL) *(alpKeyPh + (wTotal++)) = alpTempKeyPh[0];
  499. if( alpTempKeyPh[1] != NULL) *(alpKeyPh + (wTotal++)) = alpTempKeyPh[1];
  500. if(wResult > 0)
  501. memcpy(abKeyArray[0][awKeyArrayLen[0]++],abKey,2);
  502. }
  503. lpPYCand->wHZNum = lpHanZi - lpPYCand->aHanZi;
  504. #define TOGGLE(i) ( (i%2) ? 0 : 1 )
  505. for(i=1;i<wCount;i++){
  506. for(j=0;j<awKeyArrayLen[TOGGLE(i)];j++){
  507. for(k=0;awPYArrayKey[i][k];k++){
  508. memcpy(abKey,abKeyArray[TOGGLE(i)][j],i+1);
  509. abKey[i+1] = (BYTE) ( awPYArrayKey[i][k] & 0xff);
  510. abKey[0] |= (BYTE)(( awPYArrayKey[i][k] & 0x0100) >> (8-i));
  511. wResult=QueryPhrase(abKey,(WORD)(i+1),alpTempKeyPh);
  512. if( alpTempKeyPh[0] != NULL) *(alpKeyPh + (wTotal++)) = alpTempKeyPh[0];
  513. if( alpTempKeyPh[1] != NULL) *(alpKeyPh + (wTotal++)) = alpTempKeyPh[1];
  514. if(wResult > 0)
  515. memcpy(abKeyArray[i%2][awKeyArrayLen[i%2]++],abKey,i+2);
  516. }
  517. }
  518. awKeyArrayLen[TOGGLE(i)] = 0;
  519. }
  520. #undef TOGGLE
  521. if(wTotal > 0){
  522. wTotalPh = 0;
  523. wPhLen = 0;
  524. wTemp = alpKeyPh[wTotal-1]->wLen;
  525. for(i=wTotal-1;i+1;i--){
  526. if(alpKeyPh[i]->wLen == wTemp){
  527. aTempPh[wPhLen].lpHZPH = alpKeyPh[i]->lpHZPH;
  528. aTempPh[wPhLen].lpKeyPH = alpKeyPh[i];
  529. wPhLen++;
  530. while(aTempPh[wPhLen-1].lpHZPH->lpNext != NULL){
  531. aTempPh[wPhLen].lpHZPH = aTempPh[wPhLen-1].lpHZPH->lpNext;
  532. aTempPh[wPhLen].lpKeyPH = alpKeyPh[i];
  533. wPhLen++;
  534. }
  535. wTemp = alpKeyPh[i]->wLen;
  536. if( i==0 ){
  537. if( wConversionSet & CONVERSION_SET_SORT)
  538. SortPhrase(aTempPh,wPhLen);
  539. memcpy(lpPhrase + wTotalPh,aTempPh,wPhLen*sizeof(PHRASE));
  540. wTotalPh += wPhLen;
  541. }
  542. }
  543. else{
  544. if( wConversionSet & CONVERSION_SET_SORT)
  545. SortPhrase(aTempPh,wPhLen);
  546. memcpy(lpPhrase + wTotalPh,aTempPh,wPhLen*sizeof(PHRASE));
  547. wTotalPh += wPhLen;
  548. wPhLen=0;
  549. wTemp = alpKeyPh[i]->wLen;
  550. i++;
  551. }
  552. }
  553. }
  554. lpPYCand->wPhraseNum = wTotalPh;
  555. return;
  556. }
  557. WORD CreateCandStr(LPFREEPYCAND lpPYCand, WORD wDirect, LPTSTR lpCandStr,WORD wMaxCandStrSize)
  558. {
  559. LPHANZI lpHanZi = lpPYCand->aHanZi;
  560. LPPHRASE lpPhrase = lpPYCand->aPhrase;
  561. WORD *lpwStatus = &(lpPYCand->wSelectStatus);
  562. SHORT *lpwCurPos = lpPYCand->awCurrentPos;
  563. SHORT *lpwBfPos = lpPYCand->awBeforePos;
  564. WORD awLen[2];
  565. WORD wCount=0,wTemp,wTempPos,wTempBfPos;
  566. TCHAR szTemp[30],szTotal[150];
  567. TCHAR szHZStr[2*MAX_PHRASE_LEN+10],szStrBuf[CAND_PAGESIZE+4][2*MAX_PHRASE_LEN+10];
  568. int i,flag;
  569. HDC hDC;
  570. SIZE sz;
  571. awLen[1] = lpPYCand->wPhraseNum;
  572. awLen[0] = (lpPYCand->aHanZi + lpPYCand->wHZNum - 1)->wLen;
  573. DebugLog(0,(DebugLogFile,"CreateCandStr: %d  %d  %dn",awLen[1],awLen[0],*lpwStatus));
  574. if( *lpwStatus && awLen[*lpwStatus] < 1){
  575. *lpwStatus = 0;
  576. }
  577. if(!(*lpwStatus) && awLen[*lpwStatus]<1) return wCount;
  578. hDC = GetDC(NULL);
  579. _tcscpy(szTotal,"<>");
  580. switch(wDirect){
  581. case SELECT_FORWARD:
  582. if( !(lpPYCand->wSelectDirect & wDirect) ){
  583. wTempPos = *(lpwCurPos+(*lpwStatus));
  584. *(lpwCurPos+(*lpwStatus)) = *(lpwBfPos+(*lpwStatus))+1;
  585. *(lpwBfPos+(*lpwStatus)) = wTempPos+1;
  586. lpPYCand->wSelectDirect = wDirect;
  587. }
  588. if( *(lpwCurPos+(*lpwStatus)) > awLen[*lpwStatus] - 1){
  589. if(!(*lpwStatus)){
  590. MessageBeep(0xFFFFFFFF );
  591. return wCount;
  592. }
  593. else{
  594. *lpwStatus = 0;
  595. *(lpwBfPos+(*lpwStatus)) = 0;
  596. *(lpwCurPos+(*lpwStatus)) = 0;
  597. }
  598. }
  599. if(*(lpwCurPos+(*lpwStatus)) < 0) *(lpwCurPos+(*lpwStatus)) = 0;
  600. if((!(*lpwStatus) && awLen[1]>0) || *(lpwCurPos+(*lpwStatus)) > 0)
  601. _tcscpy( lpCandStr , _T("<") );
  602. else
  603. _tcscpy( lpCandStr , _T("") );
  604. *(lpwBfPos+(*lpwStatus)) = *(lpwCurPos+(*lpwStatus));
  605. wCount = 2;
  606. while( *(lpwCurPos+(*lpwStatus)) < awLen[*lpwStatus] && wCount <= CAND_PAGESIZE+1) {
  607. if(*lpwStatus){
  608. _tcscpy( szHZStr,(lpPhrase+(*(lpwCurPos+(*lpwStatus))))->lpHZPH->szHZ );
  609. }
  610. else{
  611. for(i=0;i<lpPYCand->wHZNum;i++){
  612. if((lpHanZi+i)->wLen > *(lpwCurPos+(*lpwStatus)) ) break;
  613. }
  614. #ifdef _UNICODE
  615. if(i)
  616. _tcsncpy(szHZStr,(lpHanZi+i)->lpHZ+(*(lpwCurPos+(*lpwStatus))-(lpHanZi+i-1)->wLen),1);
  617. else
  618. _tcsncpy(szHZStr,(lpHanZi+i)->lpHZ+(*(lpwCurPos+(*lpwStatus))),1);
  619. szHZStr[1]=_T('');
  620. #else
  621. if(i)
  622. _tcsncpy(szHZStr,(lpHanZi+i)->lpHZ+2*(*(lpwCurPos+(*lpwStatus))-(lpHanZi+i-1)->wLen),2);
  623. else
  624. _tcsncpy(szHZStr,(lpHanZi+i)->lpHZ+2*(*(lpwCurPos+(*lpwStatus))),2);
  625. szHZStr[2]=_T('');
  626. #endif
  627. }
  628. _stprintf(szTemp,"%d%s ",wCount%10,szHZStr);
  629. if(wConversionSet & CONVERSION_SET_GBK) {
  630. if(wConversionSet & CONVERSION_SET_SHAPE) {
  631. _tcscat(szTotal,szTemp);
  632. GetTextExtentPoint(hDC,szTotal,_tcslen(szTotal),&sz);
  633. if(sz.cx > sizeCand[1].cx) break;
  634. }
  635. _tcscpy( (lpCandStr + (wCount++)*wMaxCandStrSize),szHZStr);
  636. }
  637. else {
  638. if(*lpwStatus){
  639. if(wConversionSet & CONVERSION_SET_SHAPE) {
  640. _tcscat(szTotal,szTemp);
  641. GetTextExtentPoint(hDC,szTotal,_tcslen(szTotal),&sz);
  642. if(sz.cx > sizeCand[1].cx) break;
  643. }
  644. _tcscpy( (lpCandStr + (wCount++)*wMaxCandStrSize),szHZStr);
  645. }
  646. else{
  647. if( (*((LPBYTE)szHZStr) >= GB_QUFIRST && *((LPBYTE)szHZStr) <= GB_QULAST) && 
  648. (*((LPBYTE)szHZStr+1) >= GB_WEIFIRST && *((LPBYTE)szHZStr+1) <= GB_WEILAST) ) {
  649. if(wConversionSet & CONVERSION_SET_SHAPE) {
  650. _tcscat(szTotal,szTemp);
  651. GetTextExtentPoint(hDC,szTotal,_tcslen(szTotal),&sz);
  652. if(sz.cx > sizeCand[1].cx) break;
  653. }
  654. _tcscpy( (lpCandStr + (wCount++)*wMaxCandStrSize),szHZStr);
  655. }
  656. }
  657. }
  658. *(lpwCurPos+(*lpwStatus)) += 1;
  659. }
  660. if(*lpwStatus || *(lpwCurPos+(*lpwStatus)) < awLen[*lpwStatus] - 1 && wCount > 1){
  661. _tcscpy( (lpCandStr + wMaxCandStrSize),_T(">"));
  662. }
  663. else {
  664. _tcscpy( (lpCandStr + wMaxCandStrSize),_T(""));
  665. }
  666. break;
  667. case SELECT_BACKWARD:
  668. if( (*lpwStatus && !(*(lpwBfPos+(*lpwStatus))))
  669. || (!(*lpwStatus) && awLen[1]<1 && !(*(lpwBfPos+(*lpwStatus)))) ){
  670. MessageBeep(0xFFFFFFFF );
  671. return wCount;
  672. }
  673. if( !(lpPYCand->wSelectDirect & wDirect) ){
  674. *(lpwCurPos+(*lpwStatus)) = *(lpwBfPos+(*lpwStatus))-1;
  675. lpPYCand->wSelectDirect = wDirect;
  676. }
  677. flag=0;
  678. if( *(lpwCurPos+(*lpwStatus)) < 0 ){
  679. if(*lpwStatus || awLen[1] < 1 ){
  680. MessageBeep(0xFFFFFFFF );
  681. return wCount;
  682. }
  683. else{
  684. *lpwStatus = 1;
  685. flag = 1;
  686. wTempBfPos = *(lpwBfPos+1);
  687. }
  688. }
  689. if(flag && *(lpwCurPos+(*lpwStatus)) < awLen[*lpwStatus]-1)
  690. *(lpwCurPos+(*lpwStatus)) = awLen[*lpwStatus] - 1;
  691. if( *(lpwCurPos+(*lpwStatus)) > awLen[*lpwStatus]-1)
  692. *(lpwCurPos+(*lpwStatus)) = awLen[*lpwStatus] - 1;
  693. if( *lpwStatus || *(lpwCurPos+(*lpwStatus)) < awLen[*lpwStatus] -1)
  694. _tcscpy( szStrBuf[0], _T(">"));
  695. else szStrBuf[0][0]=_T('');
  696. *(lpwBfPos+(*lpwStatus)) = *(lpwCurPos+(*lpwStatus));
  697. wCount = 2;
  698. while( *(lpwCurPos+(*lpwStatus)) >= 0  && wCount <= CAND_PAGESIZE+1) {
  699. if(*lpwStatus){
  700. _tcscpy( szStrBuf[wCount],(lpPhrase+(*(lpwCurPos+(*lpwStatus))))->lpHZPH->szHZ );
  701. _stprintf(szTemp,"%d%s ",wCount%10,(lpPhrase+(*(lpwCurPos+(*lpwStatus))))->lpHZPH->szHZ );
  702. }
  703. else{
  704. for(i=0;i<lpPYCand->wHZNum;i++){
  705. if((lpHanZi+i)->wLen > *(lpwCurPos+(*lpwStatus)) ) break;
  706. }
  707. #ifdef _UNICODE
  708. if(i)
  709. _tcsncpy(szHZStr,(lpHanZi+i)->lpHZ+(*(lpwCurPos+(*lpwStatus))-(lpHanZi+i-1)->wLen),1);
  710. else
  711. _tcsncpy(szHZStr,(lpHanZi+i)->lpHZ+(*(lpwCurPos+(*lpwStatus))),1);
  712. szHZStr[1]=_T('');
  713. _tcscpy(szStrBuf[wCount],szHZStr);
  714. #else
  715. if(i)
  716. _tcsncpy(szHZStr,(lpHanZi+i)->lpHZ+2*(*(lpwCurPos+(*lpwStatus))-(lpHanZi+i-1)->wLen),2);
  717. else
  718. _tcsncpy(szHZStr,(lpHanZi+i)->lpHZ+2*(*(lpwCurPos+(*lpwStatus))),2);
  719. szHZStr[2]=_T('');
  720. _stprintf(szTemp,"%d%s ",wCount%10,szHZStr);
  721. _tcscpy(szStrBuf[wCount],szHZStr);
  722. #endif
  723. }
  724. if(flag && *(lpwCurPos+(*lpwStatus)) == wTempBfPos-1) break;
  725. if(wConversionSet & CONVERSION_SET_GBK) {
  726. if(wConversionSet & CONVERSION_SET_SHAPE) {
  727. _tcscat(szTotal,szTemp);
  728. GetTextExtentPoint(hDC,szTotal,_tcslen(szTotal),&sz);
  729. if(sz.cx > sizeCand[1].cx) break;
  730. }
  731. wCount++;
  732. }
  733. else {
  734. if(*lpwStatus) {
  735. if(wConversionSet & CONVERSION_SET_SHAPE) {
  736. _tcscat(szTotal,szTemp);
  737. GetTextExtentPoint(hDC,szTotal,_tcslen(szTotal),&sz);
  738. if(sz.cx > sizeCand[1].cx) break;
  739. }
  740. wCount++;
  741. }
  742. else{
  743. if( (*((LPBYTE)szHZStr) >= GB_QUFIRST && *((LPBYTE)szHZStr) <= GB_QULAST) && 
  744. (*((LPBYTE)szHZStr+1) >= GB_WEIFIRST && *((LPBYTE)szHZStr+1) <= GB_WEILAST) ) {
  745. if(wConversionSet & CONVERSION_SET_SHAPE) {
  746. _tcscat(szTotal,szTemp);
  747. GetTextExtentPoint(hDC,szTotal,_tcslen(szTotal),&sz);
  748. if(sz.cx > sizeCand[1].cx) break;
  749. }
  750. wCount++;
  751. }
  752. }
  753. }
  754. *(lpwCurPos+(*lpwStatus)) -= 1;
  755. }
  756. wTemp = wCount;
  757. if((!(*lpwStatus) && awLen[1] > 0 ) || (*(lpwCurPos+(*lpwStatus)) > 0 && wCount > 1))
  758. _tcscpy( lpCandStr, _T("<") );
  759. else
  760. _tcscpy( lpCandStr, _T("") );
  761. wCount = 2;
  762. for(i = wTemp-1;i>1;i--){
  763. _tcscpy( (lpCandStr + (wCount++)*wMaxCandStrSize),szStrBuf[i]);
  764. }
  765. if( _tcslen(szStrBuf[0])){
  766. _tcscpy( (lpCandStr + wMaxCandStrSize),szStrBuf[0]);
  767. }
  768. else{
  769. _tcscpy( (lpCandStr + wMaxCandStrSize),_T(""));
  770. }
  771. break;
  772. default:
  773. break; 
  774.   }
  775.   ReleaseDC(NULL,hDC);
  776.   return wCount -2;
  777. }
  778. void CreatePaintStr(LPTSTR lpPYArray,WORD wMaxSize,WORD wLen,LPTSTR lpConvStr,LPTSTR lpPaintStr)
  779. {
  780. int i;
  781. _tcscpy(lpPaintStr,lpConvStr);
  782. for(i=0;i<wLen;i++){
  783. _tcscat(lpPaintStr,lpPYArray+i*wMaxSize);
  784. if(i==wLen-1 || 
  785. *(lpPYArray+(i+1)*wMaxSize)==_T(''')|| *(lpPYArray+i*wMaxSize)==_T('''))
  786. continue;
  787. else
  788. _tcscat(lpPaintStr,_T(" "));
  789. }
  790. return;
  791. }
  792. WORD EffectPYArrayLen( LPTSTR lpPYArray,WORD wMaxSize,WORD wLen)
  793. {
  794. int i;
  795. TCHAR ch;
  796. WORD wCount=0;
  797. for(i=0;i<wLen;i++){
  798. ch = *(lpPYArray + i * wMaxSize);
  799. if(ch == _T('i') || ch == _T('u') || ch == _T('v') ) continue;
  800. if(ch < _T('a') || ch > _T('z')) continue;
  801. wCount++;
  802. }
  803. return wCount;
  804. }
  805. WORD CalculatePosSpan(LPTSTR lpPYArray,WORD wMaxSize,WORD wLen,WORD wCount)
  806. {
  807. WORD i;
  808. TCHAR ch;
  809. WORD wNum=0;
  810. for(i=0;i<wLen;i++){
  811. ch=*(lpPYArray + i*wMaxSize);
  812. if(ch == _T('i') || ch == _T('u') || ch == _T('v')) continue;
  813. if(ch < _T('a') || ch > _T('z')) continue;
  814. wNum++;
  815. if(wNum == wCount) return i+1;
  816. }
  817. return 0;
  818. }
  819. SHORT CalculateUnConvPos(LPTSTR lpPYArray,WORD wMaxSize,WORD wLen,LPTSTR lpStr)
  820. {
  821. int i;
  822. TCHAR szStr[150];
  823. SHORT wPos = 0;
  824. LPTSTR lpDest;
  825. szStr[0] = _T('');
  826. for(i=0;i<wLen;i++)
  827. _tcscat(szStr,lpPYArray + i*wMaxSize);
  828. lpDest = _tcsstr(lpStr,szStr);
  829. if(lpDest)
  830. wPos = lpDest - lpStr;
  831. return wPos;
  832. }