⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hzlib.c

📁 拼音输入法源码vc开发的
💻 C
字号:
/*
 * Copyright (C) 1999.4  Li ZhenChun
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License; or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that is will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, M A 02139, USA.
 *
 * Author: Li ZhenChun  email: zhchli@163.net or zhchli@126.com
 * 
 */

#include "freepy.h"

void LoadHZDictionary( LPTSTR);
void LoadPunct( LPTSTR );
WORD String2Array(LPTSTR ,LPTSTR ,WORD );
WORD GetSegment(LPTSTR);
void GetStr(FILE *,LPTSTR);
void LoadTable();
void LoadPhrase();


void LoadHZDictionary( LPTSTR lpStr)
{
	TCHAR szPY[20],szHZ[1200];
	static int i=0,j=0,nPre=0;
	WORD wPYHead=1;
	LPPINYIN lpPYTab = (LPPINYIN)aPYTab;

	_stscanf(lpStr,"%s %s",szPY,szHZ);
	
	alpHZTab[i] = _tcsdup(szHZ);
	
	wPYHead=(WORD)szPY[0] - (WORD)_T('a');
	if(wPYHead != nPre) j=0;
	_tcscpy( (lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->szPY,szPY);
	(lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->wKey=i+1;

	nPre=wPYHead;
	i++,j++;
	return;
}

WORD String2Array(LPTSTR lpBuf,LPTSTR lpStrArr,WORD wMaxArrSize)
{
	int i;
	WORD cursor=0,count=0,wBufLen;
	
	wBufLen = strlen(lpBuf);
	
	for (i=0;i<wBufLen;i++){
		if(*(lpBuf+i) == _T(' ') || *(lpBuf+i) == _T('\t')) {
			if(i!=0 && *(lpBuf+i-1)!=_T(' ') && *(lpBuf+i-1)!=_T('\t') ){
				_tcsncpy(lpStrArr+count*wMaxArrSize,lpBuf+cursor,i-cursor);
				*(lpStrArr+count*wMaxArrSize+i-cursor)=_T('\0');
				count++;
			}
			cursor=i+1;
		}
		if(i == wBufLen-1 && *(lpBuf+i)!=_T(' ') && *(lpBuf+i)!=_T('	') ){
			_tcsncpy(lpStrArr+count*wMaxArrSize,lpBuf+cursor,i-cursor+1);
			*(lpStrArr+count*wMaxArrSize+i-cursor+1)=_T('\0');
			count++;
		}
	}
	return count;
}

void LoadPunct( LPTSTR lpStr)
{
	TCHAR szStrArr[70][70];
	WORD wCount,wHead;
	int i;
	
	wCount = String2Array(lpStr,(LPTSTR)szStrArr,70);

	if( szStrArr[0][0] > _T('~') || szStrArr[0][0] < _T('!')) return;

	wHead = szStrArr[0][0] - _T('!');

	for(i=1;i<wCount;i++){
		_tcscpy(aPunct[wHead][i-1],szStrArr[i]);
	}
	aPunct[wHead][wCount][0] = _T('\0');
}

WORD GetSegment(LPTSTR buf)
{
	if(*buf == _T('\0')) return 1; //END_SEGMENT
	else if(*buf == _T('#')) return 2; //COMMENT
	else if( _tcsstr(buf,_T("[PUNCTUATION]")) != NULL ) return 3; 
	else if( _tcsstr(buf,_T("[DICTIONARY]")) != NULL) return 4;
	else return 0;
}

void GetStr(FILE *pf,LPTSTR pbuf)
{
	while( !feof(pf) ) {
		*pbuf = _fgettc(pf);
		if(*pbuf == _T('\n')) break;
		pbuf++;
	}
	*pbuf = _T('\0');
}

void LoadTable()
{
	FILE *stream;
	TCHAR szStr[1200];
	TCHAR szTabFileName[200];
	LPTSTR lpTabFileName = szTabFileName;


	lpTabFileName += GetSystemDirectory(szTabFileName,200);
	if (*(lpTabFileName-1) != _T('\\'))
		*lpTabFileName++ = _T('\\');
	_tcscpy(lpTabFileName,TABFILENAME);

	if( (stream = _tfopen( szTabFileName, "r" )) == NULL ){
		_stprintf(szStr,"%s can not found",szTabFileName);
		MessageBox(NULL,szStr,"init",MB_OK);
		exit(1);
	}
	
	while( !feof( stream )) {
		GetStr(stream,szStr);

		switch( GetSegment(szStr)) {
		case 1: //END_SEGMENT
			break;

		case 2: //COMMENT
			break;

		case 3: //PUNCTUATION
			if( feof( stream ) ) goto my_exit;
			GetStr(stream,szStr);
			while(GetSegment(szStr) != 1) {
				if( GetSegment(szStr) != 2){
					LoadPunct( szStr );
				}
				if( feof( stream ) ) goto my_exit;
				GetStr(stream,szStr);
			}
			break;

		case 4: //DICTIONARY
			if( feof( stream ) ) goto my_exit;
			GetStr(stream,szStr);
			while(GetSegment(szStr) != 1) {
				if( GetSegment(szStr) != 2){
					LoadHZDictionary( szStr );
				}
				if( feof( stream ) ) goto my_exit;
				GetStr(stream,szStr);
			}
			break;

		default:
			break;
		}
	}
my_exit:
	fclose(stream);
	return;
}

void LoadPhrase()
{
	FILE *stream;
	BYTE bLen;
	WORD wLen;

	TCHAR szStr[2*(MAX_PHRASE_LEN+1)];
	BYTE abKey[MAX_PHRASE_LEN+1];

	WORD i;
	TCHAR szPhraseFileName[200],szTemp[200];
	LPTSTR lpPhraseFileName;

	for(i=0;i<2;i++){
		if(!i){
			lpPhraseFileName = szPhraseFileName;
			lpPhraseFileName += GetSystemDirectory(szPhraseFileName,200);
			if (*(lpPhraseFileName-1) != _T('\\'))
				*lpPhraseFileName++ = _T('\\');
			_tcscpy(lpPhraseFileName,SYSPHRASEFILENAME);

			if( (stream = _tfopen( szPhraseFileName, _T("rb") )) == NULL ){
				_stprintf(szTemp,"%s can not found",szPhraseFileName);
				MessageBox(NULL,szTemp,"DicInit",MB_OK);
				exit(1);
			}
		}
		else{
			lpPhraseFileName = szPhraseFileName;
			lpPhraseFileName += GetSystemDirectory(szPhraseFileName,200);
			if (*(lpPhraseFileName-1) != _T('\\'))
				*lpPhraseFileName++ = _T('\\');
			_tcscpy(lpPhraseFileName,USRPHRASEFILENAME);

			if( (stream = _tfopen( szPhraseFileName, _T("rb") )) == NULL ){
				_stprintf(szTemp,"%s can not found",szPhraseFileName);
//				MessageBox(NULL,szTemp,"DicInit",MB_OK);
				goto my_exit;
			}
		}
		
		while( !feof( stream )) {
			if(fread(&bLen,1,1,stream)){
				wLen=(WORD)bLen;
				if( wLen > 0 && fread(abKey,1,wLen+1,stream) &&
					fread(szStr,1,wLen*2,stream) ) {
					szStr[wLen*2] = _T('\0');
					SavePhToMapFile(szStr,abKey,wLen,i);
				}
			}
		}
		fclose(stream);
		if( !i )
			dwMapFileUsrOffset = 2*MAX_PY_NUM*sizeof(KEYPH) + dwMapFileOffset;
	}
my_exit:
	return;
}

void SavePhToMapFile(LPTSTR lpStr,LPBYTE lpbKey,WORD wLen,WORD wStatus)
{
	LPKEYPH lpKeyPH;
	LPHZPH lpHZPH;
	BOOL fFirst;
	WORD wHead;
	DWORD dwBaseOffset;

	if(wLen<1) return;

	dwBaseOffset = 2*MAX_PY_NUM*sizeof(KEYPH);

	wHead=(WORD)(*(lpbKey+1));
	wHead |= (WORD)((*lpbKey & 0x01) << 8);
	wHead--;
	if(wHead >= MAX_PY_NUM) return;

	if( !(lpKeyPH=(LPKEYPH)((LPBYTE)lpMapFileBase+wStatus*MAX_PY_NUM*sizeof(KEYPH))+wHead)->wLen ) {
		lpKeyPH->wLen=wLen;
		memcpy(lpKeyPH->abKey,lpbKey,wLen+1);
		lpKeyPH->lpNext=NULL;
		if((dwBaseOffset + dwMapFileOffset + sizeof(HZPH)) > MAPFILESIZE){
			return;
		}
		lpKeyPH->lpHZPH = (LPHZPH)((LPBYTE)lpMapFileBase + 
			dwBaseOffset + dwMapFileOffset);
		dwMapFileOffset += sizeof(HZPH);
		lpKeyPH->lpHZPH->dwAttrib=0;
		lpKeyPH->lpHZPH->lpNext=NULL;
		_tcscpy(lpKeyPH->lpHZPH->szHZ,lpStr);
	}
	
	else{
		fFirst=TRUE;
		do {
			if(fFirst)	fFirst=FALSE;
			else lpKeyPH=lpKeyPH->lpNext;
			
			if(lpKeyPH->wLen==wLen && !memcmp(lpKeyPH->abKey,lpbKey,wLen+1)){
				lpHZPH=lpKeyPH->lpHZPH;
				while(lpHZPH->lpNext != NULL)
					lpHZPH=lpHZPH->lpNext;

				if((dwBaseOffset + dwMapFileOffset + sizeof(HZPH)) > MAPFILESIZE){
					return;
				}
				lpHZPH->lpNext = (LPHZPH)((LPBYTE)lpMapFileBase + 
					dwBaseOffset + dwMapFileOffset);
				dwMapFileOffset += sizeof(HZPH);
				lpHZPH->lpNext->dwAttrib=0;
				lpHZPH->lpNext->lpNext=NULL;
				_tcscpy(lpHZPH->lpNext->szHZ,lpStr);
				goto my_exit;
			}
		}while(lpKeyPH->lpNext != NULL);

		if((dwBaseOffset + dwMapFileOffset + sizeof(KEYPH)) > MAPFILESIZE){
			return;
		}
		lpKeyPH->lpNext = (LPKEYPH)((LPBYTE)lpMapFileBase + 
			dwBaseOffset + dwMapFileOffset);
		dwMapFileOffset += sizeof(KEYPH);
		
		lpKeyPH->lpNext->wLen=wLen;
		memcpy(lpKeyPH->lpNext->abKey,lpbKey,wLen+1);
		lpKeyPH->lpNext->lpNext=NULL;

		if((dwBaseOffset + dwMapFileOffset + sizeof(HZPH)) > MAPFILESIZE){
			return;
		}
		lpKeyPH->lpNext->lpHZPH = (LPHZPH)((LPBYTE)lpMapFileBase + 
			dwBaseOffset + dwMapFileOffset);
		dwMapFileOffset += sizeof(HZPH);
		
		lpKeyPH->lpNext->lpHZPH->dwAttrib=0;
		lpKeyPH->lpNext->lpHZPH->lpNext=NULL;
		_tcscpy(lpKeyPH->lpNext->lpHZPH->szHZ,lpStr);
	}
my_exit:
	return;
}

WORD QueryPhrase(LPBYTE lpbKey,WORD wLen,LPKEYPH *lplpKeyPh)
{
	WORD wHead,wCount=0,wMask=0;
	LPKEYPH lpKPh;
	int i;
	BYTE abKey[MAX_PHRASE_LEN+1];
	BOOL fFirst;

	*lplpKeyPh = NULL;
	*(lplpKeyPh+1) = NULL;

	if(wLen<1) return 0;
	
	wHead = (WORD)(*(lpbKey+1));
	wHead |= ((WORD)(*lpbKey & 0x01)) << 8;
	wHead--;
	
	for(i=0;i<wLen;i++)
		wMask += 1<<i;

	for(i=0;i<2;i++){
		if( !(lpKPh=(LPKEYPH)((LPBYTE)lpMapFileBase+i*MAX_PY_NUM*sizeof(KEYPH))+wHead)->wLen ) {
			continue;
		}

		fFirst = TRUE;
		do {
			if(wCount && *(lplpKeyPh+i) != NULL) break;
			
			if( fFirst ) fFirst = FALSE;
			else lpKPh = lpKPh->lpNext;
			
			if( lpKPh->wLen >= wLen){
				memcpy(abKey,lpKPh->abKey,wLen+1);
				abKey[0] &= wMask;
				if(!memcmp(abKey,lpbKey,wLen+1)){
					if(lpKPh->wLen == wLen) *(lplpKeyPh+i) = lpKPh;
					else wCount++;
				}
			}
		}while(lpKPh->lpNext != NULL);
	}
	return wCount;
}

void InitDictionary()
{
	int i;
	BOOL fExist = FALSE;

	if ( (hMapFile=CreateFileMapping( INVALID_HANDLE_VALUE,
						NULL,
						PAGE_READWRITE ,
						0,
						MAPFILESIZE,
						MAPFILENAME)) == NULL) {
		MessageBox(NULL,"can not create filemapping","Init",MB_OK);
		exit(1);
	}

	if (GetLastError() == ERROR_ALREADY_EXISTS) {
		fExist = TRUE;
	}

	if ( (lpMapFileBase = (LPVOID) MapViewOfFile( hMapFile,
							FILE_MAP_ALL_ACCESS ,
							0,
							0,
							0)) == NULL) {
		MessageBox(NULL,"can not create filemapping","Init",MB_OK);
		exit(1);
	}

	if( !fExist || !dwMapFileOffset || !wMapCount){	
		for(i=0;i<2*MAX_PY_NUM*sizeof(KEYPH);i++){
			*((LPBYTE)lpMapFileBase+i)=0;
		}
		LoadPhrase();
	}

	LoadTable();

	wMapCount++;
}

void SortDic(LPHZPH *lplpPh, WORD wLen)
{
	int i,j;
	LPHZPH lpTempPh;
	
	for(i=0;i<wLen;i++){
		for(j=i;j<wLen;j++){
			if( (*(lplpPh+i))->dwAttrib < (*(lplpPh+j))->dwAttrib){
				lpTempPh = *(lplpPh+i);
				*(lplpPh+i)=*(lplpPh+j);
				*(lplpPh+j)=lpTempPh;
			}
		}
	}
}

void DestroyDictionary()
{
	int i,j,k;
	BYTE abKey[MAX_PHRASE_LEN+1];
	WORD wLen;
	BYTE bLen;
	LPKEYPH lpKPh;
	LPHZPH lpHZPh;
	FILE *stream;
	TCHAR szPhraseFileName[200],szTemp[200];
	LPTSTR lpPhraseFileName;
	BOOL fFirst1,fFirst2;
	LPHZPH alpHZPh[500];
	WORD wPhLen;

	for(i=0;i<MAX_PY_NUM;i++){
		if(alpHZTab[i] != NULL) free(alpHZTab[i]);
	}

	wMapCount--;
//	if( wMapCount > 0 ) goto my_exit;

	for(i=0;i<2;i++){
		if(!i){
			lpPhraseFileName = szPhraseFileName;
			lpPhraseFileName += GetSystemDirectory(szPhraseFileName,200);
			if (*(lpPhraseFileName-1) != _T('\\'))
				*lpPhraseFileName++ = _T('\\');
			_tcscpy(lpPhraseFileName,SYSPHRASEFILENAME);

			if( (stream = _tfopen( szPhraseFileName, _T("wb") )) == NULL ){
				_stprintf(szTemp,"%s can not found",szPhraseFileName);
				MessageBox(NULL,szTemp,"DicInit",MB_OK);
				continue;
			}
		}
		else{
			lpPhraseFileName = szPhraseFileName;
			lpPhraseFileName += GetSystemDirectory(szPhraseFileName,200);
			if (*(lpPhraseFileName-1) != _T('\\'))
				*lpPhraseFileName++ = _T('\\');
			_tcscpy(lpPhraseFileName,USRPHRASEFILENAME);

			if( (stream = _tfopen( szPhraseFileName, _T("wb") )) == NULL ){
				_stprintf(szTemp,"%s can not found",szPhraseFileName);
				MessageBox(NULL,szTemp,"DicInit",MB_OK);
				continue;
			}
		}
		for(j=0;j<MAX_PY_NUM;j++){
			if( !(lpKPh=(LPKEYPH)((LPBYTE)lpMapFileBase+i*MAX_PY_NUM*sizeof(KEYPH))+j)->wLen ) {
				continue;
			}
			fFirst1 = TRUE;
			do {
				if( fFirst1 ) fFirst1 = FALSE;
				else lpKPh = lpKPh->lpNext;

				if( lpKPh->wLen < 0 ) continue;
				wLen = lpKPh->wLen;
				bLen = (BYTE)wLen;
				lpHZPh = lpKPh->lpHZPH;
				memcpy(abKey,lpKPh->abKey,wLen+1);
				fFirst2 = TRUE;
				wPhLen = 0;
				do {
					if( fFirst2 ) fFirst2 = FALSE;
					else lpHZPh = lpHZPh->lpNext;
					alpHZPh[wPhLen++] = lpHZPh;
				}while(lpHZPh->lpNext != NULL);

				if( wConversionSet & CONVERSION_SET_SORT)
					SortDic(alpHZPh,wPhLen);

				for(k = 0;k<wPhLen;k++){
					fwrite(&bLen,1,1,stream);
					fwrite(abKey,1,wLen+1,stream);
					fwrite(alpHZPh[k]->szHZ,1,wLen*2,stream);
				}
			} while(lpKPh->lpNext != NULL);
		}
		fclose(stream);
	}
//my_exit:	
	UnmapViewOfFile(lpMapFileBase);
	CloseHandle(hMapFile);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -