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

输入法编程

开发平台:

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. void LoadHZDictionary( LPTSTR);
  23. void LoadPunct( LPTSTR );
  24. WORD String2Array(LPTSTR ,LPTSTR ,WORD );
  25. WORD GetSegment(LPTSTR);
  26. void GetStr(FILE *,LPTSTR);
  27. void LoadTable();
  28. void LoadPhrase();
  29. void LoadHZDictionary( LPTSTR lpStr)
  30. {
  31. TCHAR szPY[20],szHZ[1200];
  32. static int i=0,j=0,nPre=0;
  33. WORD wPYHead=1;
  34. LPPINYIN lpPYTab = (LPPINYIN)aPYTab;
  35. _stscanf(lpStr,"%s %s",szPY,szHZ);
  36. alpHZTab[i] = _tcsdup(szHZ);
  37. wPYHead=(WORD)szPY[0] - (WORD)_T('a');
  38. if(wPYHead != nPre) j=0;
  39. _tcscpy( (lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->szPY,szPY);
  40. (lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->wKey=i+1;
  41. nPre=wPYHead;
  42. i++,j++;
  43. return;
  44. }
  45. WORD String2Array(LPTSTR lpBuf,LPTSTR lpStrArr,WORD wMaxArrSize)
  46. {
  47. int i;
  48. WORD cursor=0,count=0,wBufLen;
  49. wBufLen = strlen(lpBuf);
  50. for (i=0;i<wBufLen;i++){
  51. if(*(lpBuf+i) == _T(' ') || *(lpBuf+i) == _T('t')) {
  52. if(i!=0 && *(lpBuf+i-1)!=_T(' ') && *(lpBuf+i-1)!=_T('t') ){
  53. _tcsncpy(lpStrArr+count*wMaxArrSize,lpBuf+cursor,i-cursor);
  54. *(lpStrArr+count*wMaxArrSize+i-cursor)=_T('');
  55. count++;
  56. }
  57. cursor=i+1;
  58. }
  59. if(i == wBufLen-1 && *(lpBuf+i)!=_T(' ') && *(lpBuf+i)!=_T(' ') ){
  60. _tcsncpy(lpStrArr+count*wMaxArrSize,lpBuf+cursor,i-cursor+1);
  61. *(lpStrArr+count*wMaxArrSize+i-cursor+1)=_T('');
  62. count++;
  63. }
  64. }
  65. return count;
  66. }
  67. void LoadPunct( LPTSTR lpStr)
  68. {
  69. TCHAR szStrArr[70][70];
  70. WORD wCount,wHead;
  71. int i;
  72. wCount = String2Array(lpStr,(LPTSTR)szStrArr,70);
  73. if( szStrArr[0][0] > _T('~') || szStrArr[0][0] < _T('!')) return;
  74. wHead = szStrArr[0][0] - _T('!');
  75. for(i=1;i<wCount;i++){
  76. _tcscpy(aPunct[wHead][i-1],szStrArr[i]);
  77. }
  78. aPunct[wHead][wCount][0] = _T('');
  79. }
  80. WORD GetSegment(LPTSTR buf)
  81. {
  82. if(*buf == _T('')) return 1; //END_SEGMENT
  83. else if(*buf == _T('#')) return 2; //COMMENT
  84. else if( _tcsstr(buf,_T("[PUNCTUATION]")) != NULL ) return 3; 
  85. else if( _tcsstr(buf,_T("[DICTIONARY]")) != NULL) return 4;
  86. else return 0;
  87. }
  88. void GetStr(FILE *pf,LPTSTR pbuf)
  89. {
  90. while( !feof(pf) ) {
  91. *pbuf = _fgettc(pf);
  92. if(*pbuf == _T('n')) break;
  93. pbuf++;
  94. }
  95. *pbuf = _T('');
  96. }
  97. void LoadTable()
  98. {
  99. FILE *stream;
  100. TCHAR szStr[1200];
  101. TCHAR szTabFileName[200];
  102. LPTSTR lpTabFileName = szTabFileName;
  103. lpTabFileName += GetSystemDirectory(szTabFileName,200);
  104. if (*(lpTabFileName-1) != _T('\'))
  105. *lpTabFileName++ = _T('\');
  106. _tcscpy(lpTabFileName,TABFILENAME);
  107. if( (stream = _tfopen( szTabFileName, "r" )) == NULL ){
  108. _stprintf(szStr,"%s can not found",szTabFileName);
  109. MessageBox(NULL,szStr,"init",MB_OK);
  110. exit(1);
  111. }
  112. while( !feof( stream )) {
  113. GetStr(stream,szStr);
  114. switch( GetSegment(szStr)) {
  115. case 1: //END_SEGMENT
  116. break;
  117. case 2: //COMMENT
  118. break;
  119. case 3: //PUNCTUATION
  120. if( feof( stream ) ) goto my_exit;
  121. GetStr(stream,szStr);
  122. while(GetSegment(szStr) != 1) {
  123. if( GetSegment(szStr) != 2){
  124. LoadPunct( szStr );
  125. }
  126. if( feof( stream ) ) goto my_exit;
  127. GetStr(stream,szStr);
  128. }
  129. break;
  130. case 4: //DICTIONARY
  131. if( feof( stream ) ) goto my_exit;
  132. GetStr(stream,szStr);
  133. while(GetSegment(szStr) != 1) {
  134. if( GetSegment(szStr) != 2){
  135. LoadHZDictionary( szStr );
  136. }
  137. if( feof( stream ) ) goto my_exit;
  138. GetStr(stream,szStr);
  139. }
  140. break;
  141. default:
  142. break;
  143. }
  144. }
  145. my_exit:
  146. fclose(stream);
  147. return;
  148. }
  149. void LoadPhrase()
  150. {
  151. FILE *stream;
  152. BYTE bLen;
  153. WORD wLen;
  154. TCHAR szStr[2*(MAX_PHRASE_LEN+1)];
  155. BYTE abKey[MAX_PHRASE_LEN+1];
  156. WORD i;
  157. TCHAR szPhraseFileName[200],szTemp[200];
  158. LPTSTR lpPhraseFileName;
  159. for(i=0;i<2;i++){
  160. if(!i){
  161. lpPhraseFileName = szPhraseFileName;
  162. lpPhraseFileName += GetSystemDirectory(szPhraseFileName,200);
  163. if (*(lpPhraseFileName-1) != _T('\'))
  164. *lpPhraseFileName++ = _T('\');
  165. _tcscpy(lpPhraseFileName,SYSPHRASEFILENAME);
  166. if( (stream = _tfopen( szPhraseFileName, _T("rb") )) == NULL ){
  167. _stprintf(szTemp,"%s can not found",szPhraseFileName);
  168. MessageBox(NULL,szTemp,"DicInit",MB_OK);
  169. exit(1);
  170. }
  171. }
  172. else{
  173. lpPhraseFileName = szPhraseFileName;
  174. lpPhraseFileName += GetSystemDirectory(szPhraseFileName,200);
  175. if (*(lpPhraseFileName-1) != _T('\'))
  176. *lpPhraseFileName++ = _T('\');
  177. _tcscpy(lpPhraseFileName,USRPHRASEFILENAME);
  178. if( (stream = _tfopen( szPhraseFileName, _T("rb") )) == NULL ){
  179. _stprintf(szTemp,"%s can not found",szPhraseFileName);
  180. // MessageBox(NULL,szTemp,"DicInit",MB_OK);
  181. goto my_exit;
  182. }
  183. }
  184. while( !feof( stream )) {
  185. if(fread(&bLen,1,1,stream)){
  186. wLen=(WORD)bLen;
  187. if( wLen > 0 && fread(abKey,1,wLen+1,stream) &&
  188. fread(szStr,1,wLen*2,stream) ) {
  189. szStr[wLen*2] = _T('');
  190. SavePhToMapFile(szStr,abKey,wLen,i);
  191. }
  192. }
  193. }
  194. fclose(stream);
  195. if( !i )
  196. dwMapFileUsrOffset = 2*MAX_PY_NUM*sizeof(KEYPH) + dwMapFileOffset;
  197. }
  198. my_exit:
  199. return;
  200. }
  201. void SavePhToMapFile(LPTSTR lpStr,LPBYTE lpbKey,WORD wLen,WORD wStatus)
  202. {
  203. LPKEYPH lpKeyPH;
  204. LPHZPH lpHZPH;
  205. BOOL fFirst;
  206. WORD wHead;
  207. DWORD dwBaseOffset;
  208. if(wLen<1) return;
  209. dwBaseOffset = 2*MAX_PY_NUM*sizeof(KEYPH);
  210. wHead=(WORD)(*(lpbKey+1));
  211. wHead |= (WORD)((*lpbKey & 0x01) << 8);
  212. wHead--;
  213. if(wHead >= MAX_PY_NUM) return;
  214. if( !(lpKeyPH=(LPKEYPH)((LPBYTE)lpMapFileBase+wStatus*MAX_PY_NUM*sizeof(KEYPH))+wHead)->wLen ) {
  215. lpKeyPH->wLen=wLen;
  216. memcpy(lpKeyPH->abKey,lpbKey,wLen+1);
  217. lpKeyPH->lpNext=NULL;
  218. if((dwBaseOffset + dwMapFileOffset + sizeof(HZPH)) > MAPFILESIZE){
  219. return;
  220. }
  221. lpKeyPH->lpHZPH = (LPHZPH)((LPBYTE)lpMapFileBase + 
  222. dwBaseOffset + dwMapFileOffset);
  223. dwMapFileOffset += sizeof(HZPH);
  224. lpKeyPH->lpHZPH->dwAttrib=0;
  225. lpKeyPH->lpHZPH->lpNext=NULL;
  226. _tcscpy(lpKeyPH->lpHZPH->szHZ,lpStr);
  227. }
  228. else{
  229. fFirst=TRUE;
  230. do {
  231. if(fFirst) fFirst=FALSE;
  232. else lpKeyPH=lpKeyPH->lpNext;
  233. if(lpKeyPH->wLen==wLen && !memcmp(lpKeyPH->abKey,lpbKey,wLen+1)){
  234. lpHZPH=lpKeyPH->lpHZPH;
  235. while(lpHZPH->lpNext != NULL)
  236. lpHZPH=lpHZPH->lpNext;
  237. if((dwBaseOffset + dwMapFileOffset + sizeof(HZPH)) > MAPFILESIZE){
  238. return;
  239. }
  240. lpHZPH->lpNext = (LPHZPH)((LPBYTE)lpMapFileBase + 
  241. dwBaseOffset + dwMapFileOffset);
  242. dwMapFileOffset += sizeof(HZPH);
  243. lpHZPH->lpNext->dwAttrib=0;
  244. lpHZPH->lpNext->lpNext=NULL;
  245. _tcscpy(lpHZPH->lpNext->szHZ,lpStr);
  246. goto my_exit;
  247. }
  248. }while(lpKeyPH->lpNext != NULL);
  249. if((dwBaseOffset + dwMapFileOffset + sizeof(KEYPH)) > MAPFILESIZE){
  250. return;
  251. }
  252. lpKeyPH->lpNext = (LPKEYPH)((LPBYTE)lpMapFileBase + 
  253. dwBaseOffset + dwMapFileOffset);
  254. dwMapFileOffset += sizeof(KEYPH);
  255. lpKeyPH->lpNext->wLen=wLen;
  256. memcpy(lpKeyPH->lpNext->abKey,lpbKey,wLen+1);
  257. lpKeyPH->lpNext->lpNext=NULL;
  258. if((dwBaseOffset + dwMapFileOffset + sizeof(HZPH)) > MAPFILESIZE){
  259. return;
  260. }
  261. lpKeyPH->lpNext->lpHZPH = (LPHZPH)((LPBYTE)lpMapFileBase + 
  262. dwBaseOffset + dwMapFileOffset);
  263. dwMapFileOffset += sizeof(HZPH);
  264. lpKeyPH->lpNext->lpHZPH->dwAttrib=0;
  265. lpKeyPH->lpNext->lpHZPH->lpNext=NULL;
  266. _tcscpy(lpKeyPH->lpNext->lpHZPH->szHZ,lpStr);
  267. }
  268. my_exit:
  269. return;
  270. }
  271. WORD QueryPhrase(LPBYTE lpbKey,WORD wLen,LPKEYPH *lplpKeyPh)
  272. {
  273. WORD wHead,wCount=0,wMask=0;
  274. LPKEYPH lpKPh;
  275. int i;
  276. BYTE abKey[MAX_PHRASE_LEN+1];
  277. BOOL fFirst;
  278. *lplpKeyPh = NULL;
  279. *(lplpKeyPh+1) = NULL;
  280. if(wLen<1) return 0;
  281. wHead = (WORD)(*(lpbKey+1));
  282. wHead |= ((WORD)(*lpbKey & 0x01)) << 8;
  283. wHead--;
  284. for(i=0;i<wLen;i++)
  285. wMask += 1<<i;
  286. for(i=0;i<2;i++){
  287. if( !(lpKPh=(LPKEYPH)((LPBYTE)lpMapFileBase+i*MAX_PY_NUM*sizeof(KEYPH))+wHead)->wLen ) {
  288. continue;
  289. }
  290. fFirst = TRUE;
  291. do {
  292. if(wCount && *(lplpKeyPh+i) != NULL) break;
  293. if( fFirst ) fFirst = FALSE;
  294. else lpKPh = lpKPh->lpNext;
  295. if( lpKPh->wLen >= wLen){
  296. memcpy(abKey,lpKPh->abKey,wLen+1);
  297. abKey[0] &= wMask;
  298. if(!memcmp(abKey,lpbKey,wLen+1)){
  299. if(lpKPh->wLen == wLen) *(lplpKeyPh+i) = lpKPh;
  300. else wCount++;
  301. }
  302. }
  303. }while(lpKPh->lpNext != NULL);
  304. }
  305. return wCount;
  306. }
  307. void InitDictionary()
  308. {
  309. int i;
  310. BOOL fExist = FALSE;
  311. if ( (hMapFile=CreateFileMapping( INVALID_HANDLE_VALUE,
  312. NULL,
  313. PAGE_READWRITE ,
  314. 0,
  315. MAPFILESIZE,
  316. MAPFILENAME)) == NULL) {
  317. MessageBox(NULL,"can not create filemapping","Init",MB_OK);
  318. exit(1);
  319. }
  320. if (GetLastError() == ERROR_ALREADY_EXISTS) {
  321. fExist = TRUE;
  322. }
  323. if ( (lpMapFileBase = (LPVOID) MapViewOfFile( hMapFile,
  324. FILE_MAP_ALL_ACCESS ,
  325. 0,
  326. 0,
  327. 0)) == NULL) {
  328. MessageBox(NULL,"can not create filemapping","Init",MB_OK);
  329. exit(1);
  330. }
  331. if( !fExist || !dwMapFileOffset || !wMapCount){
  332. for(i=0;i<2*MAX_PY_NUM*sizeof(KEYPH);i++){
  333. *((LPBYTE)lpMapFileBase+i)=0;
  334. }
  335. LoadPhrase();
  336. }
  337. LoadTable();
  338. wMapCount++;
  339. }
  340. void SortDic(LPHZPH *lplpPh, WORD wLen)
  341. {
  342. int i,j;
  343. LPHZPH lpTempPh;
  344. for(i=0;i<wLen;i++){
  345. for(j=i;j<wLen;j++){
  346. if( (*(lplpPh+i))->dwAttrib < (*(lplpPh+j))->dwAttrib){
  347. lpTempPh = *(lplpPh+i);
  348. *(lplpPh+i)=*(lplpPh+j);
  349. *(lplpPh+j)=lpTempPh;
  350. }
  351. }
  352. }
  353. }
  354. void DestroyDictionary()
  355. {
  356. int i,j,k;
  357. BYTE abKey[MAX_PHRASE_LEN+1];
  358. WORD wLen;
  359. BYTE bLen;
  360. LPKEYPH lpKPh;
  361. LPHZPH lpHZPh;
  362. FILE *stream;
  363. TCHAR szPhraseFileName[200],szTemp[200];
  364. LPTSTR lpPhraseFileName;
  365. BOOL fFirst1,fFirst2;
  366. LPHZPH alpHZPh[500];
  367. WORD wPhLen;
  368. for(i=0;i<MAX_PY_NUM;i++){
  369. if(alpHZTab[i] != NULL) free(alpHZTab[i]);
  370. }
  371. wMapCount--;
  372. // if( wMapCount > 0 ) goto my_exit;
  373. for(i=0;i<2;i++){
  374. if(!i){
  375. lpPhraseFileName = szPhraseFileName;
  376. lpPhraseFileName += GetSystemDirectory(szPhraseFileName,200);
  377. if (*(lpPhraseFileName-1) != _T('\'))
  378. *lpPhraseFileName++ = _T('\');
  379. _tcscpy(lpPhraseFileName,SYSPHRASEFILENAME);
  380. if( (stream = _tfopen( szPhraseFileName, _T("wb") )) == NULL ){
  381. _stprintf(szTemp,"%s can not found",szPhraseFileName);
  382. MessageBox(NULL,szTemp,"DicInit",MB_OK);
  383. continue;
  384. }
  385. }
  386. else{
  387. lpPhraseFileName = szPhraseFileName;
  388. lpPhraseFileName += GetSystemDirectory(szPhraseFileName,200);
  389. if (*(lpPhraseFileName-1) != _T('\'))
  390. *lpPhraseFileName++ = _T('\');
  391. _tcscpy(lpPhraseFileName,USRPHRASEFILENAME);
  392. if( (stream = _tfopen( szPhraseFileName, _T("wb") )) == NULL ){
  393. _stprintf(szTemp,"%s can not found",szPhraseFileName);
  394. MessageBox(NULL,szTemp,"DicInit",MB_OK);
  395. continue;
  396. }
  397. }
  398. for(j=0;j<MAX_PY_NUM;j++){
  399. if( !(lpKPh=(LPKEYPH)((LPBYTE)lpMapFileBase+i*MAX_PY_NUM*sizeof(KEYPH))+j)->wLen ) {
  400. continue;
  401. }
  402. fFirst1 = TRUE;
  403. do {
  404. if( fFirst1 ) fFirst1 = FALSE;
  405. else lpKPh = lpKPh->lpNext;
  406. if( lpKPh->wLen < 0 ) continue;
  407. wLen = lpKPh->wLen;
  408. bLen = (BYTE)wLen;
  409. lpHZPh = lpKPh->lpHZPH;
  410. memcpy(abKey,lpKPh->abKey,wLen+1);
  411. fFirst2 = TRUE;
  412. wPhLen = 0;
  413. do {
  414. if( fFirst2 ) fFirst2 = FALSE;
  415. else lpHZPh = lpHZPh->lpNext;
  416. alpHZPh[wPhLen++] = lpHZPh;
  417. }while(lpHZPh->lpNext != NULL);
  418. if( wConversionSet & CONVERSION_SET_SORT)
  419. SortDic(alpHZPh,wPhLen);
  420. for(k = 0;k<wPhLen;k++){
  421. fwrite(&bLen,1,1,stream);
  422. fwrite(abKey,1,wLen+1,stream);
  423. fwrite(alpHZPh[k]->szHZ,1,wLen*2,stream);
  424. }
  425. } while(lpKPh->lpNext != NULL);
  426. }
  427. fclose(stream);
  428. }
  429. //my_exit:
  430. UnmapViewOfFile(lpMapFileBase);
  431. CloseHandle(hMapFile);
  432. }