HZutil.c
上传用户:szljw888
上传日期:2010-04-11
资源大小:124k
文件大小:27k
源码类别:

输入法编程

开发平台:

C/C++

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